1. <lexer>
    
  2.   <config>
    
  3.     <name>Rust</name>
    
  4.     <alias>rust</alias>
    
  5.     <alias>rs</alias>
    
  6.     <filename>*.rs</filename>
    
  7.     <filename>*.rs.in</filename>
    
  8.     <mime_type>text/rust</mime_type>
    
  9.     <mime_type>text/x-rust</mime_type>
    
  10.     <ensure_nl>true</ensure_nl>
    
  11.   </config>
    
  12.   <rules>
    
  13.     <state name="modname">
    
  14.       <rule pattern="\s+">
    
  15.         <token type="Text"/>
    
  16.       </rule>
    
  17.       <rule pattern="[a-zA-Z_]\w*">
    
  18.         <token type="NameNamespace"/>
    
  19.         <pop depth="1"/>
    
  20.       </rule>
    
  21.       <rule>
    
  22.         <pop depth="1"/>
    
  23.       </rule>
    
  24.     </state>
    
  25.     <state name="lifetime">
    
  26.       <rule pattern="[a-zA-Z_]+\w*">
    
  27.         <token type="NameAttribute"/>
    
  28.       </rule>
    
  29.       <rule>
    
  30.         <pop depth="1"/>
    
  31.       </rule>
    
  32.     </state>
    
  33.     <state name="number_lit">
    
  34.       <rule pattern="[ui](8|16|32|64|size)">
    
  35.         <token type="Keyword"/>
    
  36.         <pop depth="1"/>
    
  37.       </rule>
    
  38.       <rule pattern="f(32|64)">
    
  39.         <token type="Keyword"/>
    
  40.         <pop depth="1"/>
    
  41.       </rule>
    
  42.       <rule>
    
  43.         <pop depth="1"/>
    
  44.       </rule>
    
  45.     </state>
    
  46.     <state name="attribute_common">
    
  47.       <rule pattern="&#34;">
    
  48.         <token type="LiteralString"/>
    
  49.         <push state="string"/>
    
  50.       </rule>
    
  51.       <rule pattern="\[">
    
  52.         <token type="CommentPreproc"/>
    
  53.         <push state="attribute["/>
    
  54.       </rule>
    
  55.     </state>
    
  56.     <state name="bytestring">
    
  57.       <rule pattern="\\x[89a-fA-F][0-9a-fA-F]">
    
  58.         <token type="LiteralStringEscape"/>
    
  59.       </rule>
    
  60.       <rule>
    
  61.         <include state="string"/>
    
  62.       </rule>
    
  63.     </state>
    
  64.     <state name="comment">
    
  65.       <rule pattern="[^*/]+">
    
  66.         <token type="CommentMultiline"/>
    
  67.       </rule>
    
  68.       <rule pattern="/\*">
    
  69.         <token type="CommentMultiline"/>
    
  70.         <push/>
    
  71.       </rule>
    
  72.       <rule pattern="\*/">
    
  73.         <token type="CommentMultiline"/>
    
  74.         <pop depth="1"/>
    
  75.       </rule>
    
  76.       <rule pattern="[*/]">
    
  77.         <token type="CommentMultiline"/>
    
  78.       </rule>
    
  79.     </state>
    
  80.     <state name="doccomment">
    
  81.       <rule pattern="[^*/]+">
    
  82.         <token type="LiteralStringDoc"/>
    
  83.       </rule>
    
  84.       <rule pattern="/\*">
    
  85.         <token type="LiteralStringDoc"/>
    
  86.         <push/>
    
  87.       </rule>
    
  88.       <rule pattern="\*/">
    
  89.         <token type="LiteralStringDoc"/>
    
  90.         <pop depth="1"/>
    
  91.       </rule>
    
  92.       <rule pattern="[*/]">
    
  93.         <token type="LiteralStringDoc"/>
    
  94.       </rule>
    
  95.     </state>
    
  96.     <state name="funcname">
    
  97.       <rule pattern="\s+">
    
  98.         <token type="Text"/>
    
  99.       </rule>
    
  100.       <rule pattern="[a-zA-Z_]\w*">
    
  101.         <token type="NameFunction"/>
    
  102.         <pop depth="1"/>
    
  103.       </rule>
    
  104.       <rule>
    
  105.         <pop depth="1"/>
    
  106.       </rule>
    
  107.     </state>
    
  108.     <state name="formatted_string">
    
  109.       <rule pattern="&#34;">
    
  110.         <token type="LiteralString"/>
    
  111.         <pop depth="1"/>
    
  112.       </rule>
    
  113.       <rule pattern="\\[&#39;&#34;\\nrt]|\\(?=\n)|\\x[0-7][0-9a-fA-F]|\\0|\\u\{[0-9a-fA-F]{1,6}\}|\{\{|\}\}">
    
  114.         <token type="LiteralStringEscape"/>
    
  115.       </rule>
    
  116.       <rule pattern="\{[^}]*\}">
    
  117.         <token type="LiteralStringInterpol"/>
    
  118.       </rule>
    
  119.       <rule pattern="[^\\&#34;\{\}]+">
    
  120.         <token type="LiteralString"/>
    
  121.       </rule>
    
  122.       <rule pattern="\\">
    
  123.         <token type="LiteralString"/>
    
  124.       </rule>
    
  125.     </state>
    
  126.     <state name="string">
    
  127.       <rule pattern="&#34;">
    
  128.         <token type="LiteralString"/>
    
  129.         <pop depth="1"/>
    
  130.       </rule>
    
  131.       <rule pattern="\\[&#39;&#34;\\nrt]|\\(?=\n)|\\x[0-7][0-9a-fA-F]|\\0|\\u\{[0-9a-fA-F]{1,6}\}">
    
  132.         <token type="LiteralStringEscape"/>
    
  133.       </rule>
    
  134.       <rule pattern="[^\\&#34;]+">
    
  135.         <token type="LiteralString"/>
    
  136.       </rule>
    
  137.       <rule pattern="\\">
    
  138.         <token type="LiteralString"/>
    
  139.       </rule>
    
  140.     </state>
    
  141.     <state name="root">
    
  142.       <rule pattern="#![^[\r\n].*$">
    
  143.         <token type="CommentPreproc"/>
    
  144.       </rule>
    
  145.       <rule>
    
  146.         <push state="base"/>
    
  147.       </rule>
    
  148.     </state>
    
  149.     <state name="attribute[">
    
  150.       <rule>
    
  151.         <include state="attribute_common"/>
    
  152.       </rule>
    
  153.       <rule pattern="\]">
    
  154.         <token type="CommentPreproc"/>
    
  155.         <pop depth="1"/>
    
  156.       </rule>
    
  157.       <rule pattern="[^&#34;\]\[]+">
    
  158.         <token type="CommentPreproc"/>
    
  159.       </rule>
    
  160.     </state>
    
  161.     <state name="base">
    
  162.       <rule pattern="\n">
    
  163.         <token type="TextWhitespace"/>
    
  164.       </rule>
    
  165.       <rule pattern="\s+">
    
  166.         <token type="TextWhitespace"/>
    
  167.       </rule>
    
  168.       <rule pattern="//!.*?\n">
    
  169.         <token type="LiteralStringDoc"/>
    
  170.       </rule>
    
  171.       <rule pattern="///(\n|[^/].*?\n)">
    
  172.         <token type="LiteralStringDoc"/>
    
  173.       </rule>
    
  174.       <rule pattern="//(.*?)\n">
    
  175.         <token type="CommentSingle"/>
    
  176.       </rule>
    
  177.       <rule pattern="/\*\*(\n|[^/*])">
    
  178.         <token type="LiteralStringDoc"/>
    
  179.         <push state="doccomment"/>
    
  180.       </rule>
    
  181.       <rule pattern="/\*!">
    
  182.         <token type="LiteralStringDoc"/>
    
  183.         <push state="doccomment"/>
    
  184.       </rule>
    
  185.       <rule pattern="/\*">
    
  186.         <token type="CommentMultiline"/>
    
  187.         <push state="comment"/>
    
  188.       </rule>
    
  189.       <rule pattern="&#34;">
    
  190.         <token type="LiteralString"/>
    
  191.         <push state="string"/>
    
  192.       </rule>
    
  193.       <rule pattern="\$([a-zA-Z_]\w*|\(,?|\),?|,?)">
    
  194.         <token type="CommentPreproc"/>
    
  195.       </rule>
    
  196.       <rule pattern="(unsafe|static|extern|return|const|crate|where|while|await|trait|super|async|match|impl|else|move|loop|pub|ref|mut|for|dyn|use|box|in|if|as)\b">
    
  197.         <token type="Keyword"/>
    
  198.       </rule>
    
  199.       <rule pattern="(abstract|override|unsized|virtual|become|typeof|final|macro|yield|priv|try|do)\b">
    
  200.         <token type="KeywordReserved"/>
    
  201.       </rule>
    
  202.       <rule pattern="(true|false)\b">
    
  203.         <token type="KeywordConstant"/>
    
  204.       </rule>
    
  205.       <rule pattern="self\b">
    
  206.         <token type="NameBuiltinPseudo"/>
    
  207.       </rule>
    
  208.       <rule pattern="mod\b">
    
  209.         <token type="Keyword"/>
    
  210.         <push state="modname"/>
    
  211.       </rule>
    
  212.       <rule pattern="let\b">
    
  213.         <token type="KeywordDeclaration"/>
    
  214.       </rule>
    
  215.       <rule pattern="fn\b">
    
  216.         <token type="Keyword"/>
    
  217.         <push state="funcname"/>
    
  218.       </rule>
    
  219.       <rule pattern="(struct|enum|type|union)\b">
    
  220.         <token type="Keyword"/>
    
  221.         <push state="typename"/>
    
  222.       </rule>
    
  223.       <rule pattern="(default)(\s+)(type|fn)\b">
    
  224.         <bygroups>
    
  225.           <token type="Keyword"/>
    
  226.           <token type="Text"/>
    
  227.           <token type="Keyword"/>
    
  228.         </bygroups>
    
  229.       </rule>
    
  230.       <rule pattern="(isize|usize|bool|char|u128|i128|i64|i32|i16|str|u64|u32|f32|f64|u16|i8|u8)\b">
    
  231.         <token type="KeywordType"/>
    
  232.       </rule>
    
  233.       <rule pattern="[sS]elf\b">
    
  234.         <token type="NameBuiltinPseudo"/>
    
  235.       </rule>
    
  236.       <rule pattern="(DoubleEndedIterator|ExactSizeIterator|IntoIterator|PartialOrd|PartialEq|ToString|Iterator|ToOwned|Default|Result|String|FnOnce|Extend|Option|FnMut|Unpin|Sized|AsRef|AsMut|Clone|None|From|Into|Sync|drop|Send|Drop|Copy|Some|Ord|Err|Box|Vec|Eq|Ok|Fn)\b">
    
  237.         <token type="NameBuiltin"/>
    
  238.       </rule>
    
  239.       <rule pattern="::\b">
    
  240.         <token type="Text"/>
    
  241.       </rule>
    
  242.       <rule pattern="(?::|-&gt;)">
    
  243.         <token type="Text"/>
    
  244.         <push state="typename"/>
    
  245.       </rule>
    
  246.       <rule pattern="(break|continue)(\b\s*)(\&#39;[A-Za-z_]\w*)?">
    
  247.         <bygroups>
    
  248.           <token type="Keyword"/>
    
  249.           <token type="TextWhitespace"/>
    
  250.           <token type="NameLabel"/>
    
  251.         </bygroups>
    
  252.       </rule>
    
  253.       <rule pattern="&#39;(\\[&#39;&#34;\\nrt]|\\x[0-7][0-9a-fA-F]|\\0|\\u\{[0-9a-fA-F]{1,6}\}|.)&#39;">
    
  254.         <token type="LiteralStringChar"/>
    
  255.       </rule>
    
  256.       <rule pattern="(b)(&#39;(?:\\[&#39;&#34;\\nrt]|\\x[0-9a-fA-F]{2}|\\0|.)&#39;)">
    
  257.         <bygroups>
    
  258.           <token type="LiteralStringAffix"/>
    
  259.           <token type="LiteralStringChar"/>
    
  260.         </bygroups>
    
  261.       </rule>
    
  262.       <rule pattern="0b[01_]+">
    
  263.         <token type="LiteralNumberBin"/>
    
  264.         <push state="number_lit"/>
    
  265.       </rule>
    
  266.       <rule pattern="0o[0-7_]+">
    
  267.         <token type="LiteralNumberOct"/>
    
  268.         <push state="number_lit"/>
    
  269.       </rule>
    
  270.       <rule pattern="0[xX][0-9a-fA-F_]+">
    
  271.         <token type="LiteralNumberHex"/>
    
  272.         <push state="number_lit"/>
    
  273.       </rule>
    
  274.       <rule pattern="[0-9][0-9_]*(\.[0-9_]+[eE][+\-]?[0-9_]+|\.[0-9_]*(?!\.)|[eE][+\-]?[0-9_]+)">
    
  275.         <token type="LiteralNumberFloat"/>
    
  276.         <push state="number_lit"/>
    
  277.       </rule>
    
  278.       <rule pattern="[0-9][0-9_]*">
    
  279.         <token type="LiteralNumberInteger"/>
    
  280.         <push state="number_lit"/>
    
  281.       </rule>
    
  282.       <rule pattern="(b)(&#34;)">
    
  283.         <bygroups>
    
  284.           <token type="LiteralStringAffix"/>
    
  285.           <token type="LiteralString"/>
    
  286.         </bygroups>
    
  287.         <push state="bytestring"/>
    
  288.       </rule>
    
  289.       <rule pattern="(?s)(b?r)(#*)(&#34;.*?&#34;\2)">
    
  290.         <bygroups>
    
  291.           <token type="LiteralStringAffix"/>
    
  292.           <token type="LiteralString"/>
    
  293.           <token type="LiteralString"/>
    
  294.         </bygroups>
    
  295.       </rule>
    
  296.       <rule pattern="&#39;(static|_)">
    
  297.         <token type="NameBuiltin"/>
    
  298.       </rule>
    
  299.       <rule pattern="&#39;">
    
  300.         <token type="NameAttribute"/>
    
  301.         <push state="lifetime"/>
    
  302.       </rule>
    
  303.       <rule pattern="\.\.=?">
    
  304.         <token type="Operator"/>
    
  305.       </rule>
    
  306.       <rule pattern="[{}()\[\],.;]">
    
  307.         <token type="Punctuation"/>
    
  308.       </rule>
    
  309.       <rule pattern="[+\-*/%&amp;|&lt;&gt;^!~@=:?]">
    
  310.         <token type="Operator"/>
    
  311.       </rule>
    
  312.       <rule pattern="\b(r#)?_?([A-Z][A-Z0-9_]*){2,}\b">
    
  313.         <token type="NameConstant"/>
    
  314.       </rule>
    
  315.       <rule pattern="((?:e?print(?:ln)?|format(?:_args)?|panic|todo|un(?:reachable|implemented))!)(\s*)(\()(\s*)(&#34;)">
    
  316.         <bygroups>
    
  317.           <token type="NameFunctionMagic"/>
    
  318.           <token type="TextWhitespace"/>
    
  319.           <token type="Punctuation"/>
    
  320.           <token type="TextWhitespace"/>
    
  321.           <token type="LiteralString"/>
    
  322.         </bygroups>
    
  323.         <push state="formatted_string"/>
    
  324.       </rule>
    
  325.       <rule pattern="([a-zA-Z_]\w*!)(\s*)(\(|\[|\{)">
    
  326.         <bygroups>
    
  327.           <token type="NameFunctionMagic"/>
    
  328.           <token type="TextWhitespace"/>
    
  329.           <token type="Punctuation"/>
    
  330.         </bygroups>
    
  331.       </rule>
    
  332.       <rule pattern="(r#)?[a-zA-Z_]\w*">
    
  333.         <token type="Name"/>
    
  334.       </rule>
    
  335.       <rule pattern="r#[a-zA-Z_]\w*">
    
  336.         <token type="Name"/>
    
  337.       </rule>
    
  338.       <rule pattern="#!?\[">
    
  339.         <token type="CommentPreproc"/>
    
  340.         <push state="attribute["/>
    
  341.       </rule>
    
  342.       <rule pattern="#">
    
  343.         <token type="Text"/>
    
  344.       </rule>
    
  345.     </state>
    
  346.     <state name="typename">
    
  347.       <rule pattern="\s+">
    
  348.         <token type="Text"/>
    
  349.       </rule>
    
  350.       <rule pattern="&amp;">
    
  351.         <token type="KeywordPseudo"/>
    
  352.       </rule>
    
  353.       <rule pattern="&#39;(static|_)">
    
  354.         <token type="NameBuiltin"/>
    
  355.       </rule>
    
  356.       <rule pattern="&#39;">
    
  357.         <token type="NameAttribute"/>
    
  358.         <push state="lifetime"/>
    
  359.       </rule>
    
  360.       <rule pattern="(DoubleEndedIterator|ExactSizeIterator|IntoIterator|PartialOrd|PartialEq|ToString|Iterator|ToOwned|Default|Result|String|FnOnce|Extend|Option|FnMut|Unpin|Sized|AsRef|AsMut|Clone|None|From|Into|Sync|drop|Send|Drop|Copy|Some|Ord|Err|Box|Vec|Eq|Ok|Fn)\b">
    
  361.         <token type="NameBuiltin"/>
    
  362.       </rule>
    
  363.       <rule pattern="(isize|usize|bool|char|u128|i128|i64|i32|i16|str|u64|u32|f32|f64|u16|i8|u8)\b">
    
  364.         <token type="KeywordType"/>
    
  365.       </rule>
    
  366.       <rule pattern="[a-zA-Z_]\w*">
    
  367.         <token type="NameClass"/>
    
  368.         <pop depth="1"/>
    
  369.       </rule>
    
  370.       <rule>
    
  371.         <pop depth="1"/>
    
  372.       </rule>
    
  373.     </state>
    
  374.   </rules>
    
  375. </lexer>