1. <lexer>
    
  2.   <config>
    
  3.     <name>Metal</name>
    
  4.     <alias>metal</alias>
    
  5.     <filename>*.metal</filename>
    
  6.     <mime_type>text/x-metal</mime_type>
    
  7.     <ensure_nl>true</ensure_nl>
    
  8.   </config>
    
  9.   <rules>
    
  10.     <state name="function">
    
  11.       <rule>
    
  12.         <include state="whitespace"/>
    
  13.       </rule>
    
  14.       <rule>
    
  15.         <include state="statements"/>
    
  16.       </rule>
    
  17.       <rule pattern=";">
    
  18.         <token type="Punctuation"/>
    
  19.       </rule>
    
  20.       <rule pattern="\{">
    
  21.         <token type="Punctuation"/>
    
  22.         <push/>
    
  23.       </rule>
    
  24.       <rule pattern="\}">
    
  25.         <token type="Punctuation"/>
    
  26.         <pop depth="1"/>
    
  27.       </rule>
    
  28.     </state>
    
  29.     <state name="macro">
    
  30.       <rule pattern="(include)(\s*(?:/[*].*?[*]/\s*)?)([^\n]+)">
    
  31.         <bygroups>
    
  32.           <token type="CommentPreproc"/>
    
  33.           <token type="Text"/>
    
  34.           <token type="CommentPreprocFile"/>
    
  35.         </bygroups>
    
  36.       </rule>
    
  37.       <rule pattern="[^/\n]+">
    
  38.         <token type="CommentPreproc"/>
    
  39.       </rule>
    
  40.       <rule pattern="/[*](.|\n)*?[*]/">
    
  41.         <token type="CommentMultiline"/>
    
  42.       </rule>
    
  43.       <rule pattern="//.*?\n">
    
  44.         <token type="CommentSingle"/>
    
  45.         <pop depth="1"/>
    
  46.       </rule>
    
  47.       <rule pattern="/">
    
  48.         <token type="CommentPreproc"/>
    
  49.       </rule>
    
  50.       <rule pattern="(?&lt;=\\)\n">
    
  51.         <token type="CommentPreproc"/>
    
  52.       </rule>
    
  53.       <rule pattern="\n">
    
  54.         <token type="CommentPreproc"/>
    
  55.         <pop depth="1"/>
    
  56.       </rule>
    
  57.     </state>
    
  58.     <state name="if0">
    
  59.       <rule pattern="^\s*#if.*?(?&lt;!\\)\n">
    
  60.         <token type="CommentPreproc"/>
    
  61.         <push/>
    
  62.       </rule>
    
  63.       <rule pattern="^\s*#el(?:se|if).*\n">
    
  64.         <token type="CommentPreproc"/>
    
  65.         <pop depth="1"/>
    
  66.       </rule>
    
  67.       <rule pattern="^\s*#endif.*?(?&lt;!\\)\n">
    
  68.         <token type="CommentPreproc"/>
    
  69.         <pop depth="1"/>
    
  70.       </rule>
    
  71.       <rule pattern=".*?\n">
    
  72.         <token type="Comment"/>
    
  73.       </rule>
    
  74.     </state>
    
  75.     <state name="statements">
    
  76.       <rule pattern="(namespace|constexpr|operator|template|using|this)\b">
    
  77.         <token type="Keyword"/>
    
  78.       </rule>
    
  79.       <rule pattern="(enum)\b(\s+)(class)\b(\s*)">
    
  80.         <bygroups>
    
  81.           <token type="Keyword"/>
    
  82.           <token type="Text"/>
    
  83.           <token type="Keyword"/>
    
  84.           <token type="Text"/>
    
  85.         </bygroups>
    
  86.         <push state="classname"/>
    
  87.       </rule>
    
  88.       <rule pattern="(class|struct|enum|union)\b(\s*)">
    
  89.         <bygroups>
    
  90.           <token type="Keyword"/>
    
  91.           <token type="Text"/>
    
  92.         </bygroups>
    
  93.         <push state="classname"/>
    
  94.       </rule>
    
  95.       <rule pattern="\[\[.+\]\]">
    
  96.         <token type="NameAttribute"/>
    
  97.       </rule>
    
  98.       <rule pattern="(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*">
    
  99.         <token type="LiteralNumberFloat"/>
    
  100.       </rule>
    
  101.       <rule pattern="(\d+\.\d*|\.\d+|\d+[fF])[fF]?">
    
  102.         <token type="LiteralNumberFloat"/>
    
  103.       </rule>
    
  104.       <rule pattern="0[xX]([0-9A-Fa-f](&#39;?[0-9A-Fa-f]+)*)[LlUu]*">
    
  105.         <token type="LiteralNumberHex"/>
    
  106.       </rule>
    
  107.       <rule pattern="0(&#39;?[0-7]+)+[LlUu]*">
    
  108.         <token type="LiteralNumberOct"/>
    
  109.       </rule>
    
  110.       <rule pattern="0[Bb][01](&#39;?[01]+)*[LlUu]*">
    
  111.         <token type="LiteralNumberBin"/>
    
  112.       </rule>
    
  113.       <rule pattern="[0-9](&#39;?[0-9]+)*[LlUu]*">
    
  114.         <token type="LiteralNumberInteger"/>
    
  115.       </rule>
    
  116.       <rule pattern="\*/">
    
  117.         <token type="Error"/>
    
  118.       </rule>
    
  119.       <rule pattern="[~!%^&amp;*+=|?:&lt;&gt;/-]">
    
  120.         <token type="Operator"/>
    
  121.       </rule>
    
  122.       <rule pattern="[()\[\],.]">
    
  123.         <token type="Punctuation"/>
    
  124.       </rule>
    
  125.       <rule pattern="(continue|typedef|sizeof|extern|static|switch|struct|return|union|const|break|while|enum|else|case|for|do|if)\b">
    
  126.         <token type="Keyword"/>
    
  127.       </rule>
    
  128.       <rule pattern="(bool|float|half|long|ptrdiff_t|size_t|unsigned|u?char|u?int((8|16|32|64)_t)?|u?short)\b">
    
  129.         <token type="KeywordType"/>
    
  130.       </rule>
    
  131.       <rule pattern="(bool|float|half|u?(char|int|long|short))(2|3|4)\b">
    
  132.         <token type="KeywordType"/>
    
  133.       </rule>
    
  134.       <rule pattern="packed_(float|half|long|u?(char|int|short))(2|3|4)\b">
    
  135.         <token type="KeywordType"/>
    
  136.       </rule>
    
  137.       <rule pattern="(float|half)(2|3|4)x(2|3|4)\b">
    
  138.         <token type="KeywordType"/>
    
  139.       </rule>
    
  140.       <rule pattern="atomic_u?int\b">
    
  141.         <token type="KeywordType"/>
    
  142.       </rule>
    
  143.       <rule pattern="(rg?(8|16)(u|s)norm|rgba(8|16)(u|s)norm|srgba8unorm|rgb10a2|rg11b10f|rgb9e5)\b">
    
  144.         <token type="KeywordType"/>
    
  145.       </rule>
    
  146.       <rule pattern="(array|depth(2d|cube)(_array)?|depth2d_ms(_array)?|sampler|texture_buffer|texture(1|2)d(_array)?|texture2d_ms(_array)?|texture3d|texturecube(_array)?|uniform|visible_function_table)\b">
    
  147.         <token type="KeywordType"/>
    
  148.       </rule>
    
  149.       <rule pattern="(true|false|NULL)\b">
    
  150.         <token type="NameBuiltin"/>
    
  151.       </rule>
    
  152.       <rule pattern="(threadgroup_imageblock|threadgroup|constant|ray_data|device|thread)\b">
    
  153.         <token type="Keyword"/>
    
  154.       </rule>
    
  155.       <rule pattern="([a-zA-Z_]\w*)(\s*)(:)(?!:)">
    
  156.         <bygroups>
    
  157.           <token type="NameLabel"/>
    
  158.           <token type="Text"/>
    
  159.           <token type="Punctuation"/>
    
  160.         </bygroups>
    
  161.       </rule>
    
  162.       <rule pattern="[a-zA-Z_]\w*">
    
  163.         <token type="Name"/>
    
  164.       </rule>
    
  165.     </state>
    
  166.     <state name="root">
    
  167.       <rule>
    
  168.         <include state="whitespace"/>
    
  169.       </rule>
    
  170.       <rule pattern="(fragment|kernel|vertex)?((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;{]*)(\{)">
    
  171.         <bygroups>
    
  172.           <token type="Keyword"/>
    
  173.           <usingself state="root"/>
    
  174.           <token type="NameFunction"/>
    
  175.           <usingself state="root"/>
    
  176.           <usingself state="root"/>
    
  177.           <token type="Punctuation"/>
    
  178.         </bygroups>
    
  179.         <push state="function"/>
    
  180.       </rule>
    
  181.       <rule pattern="(fragment|kernel|vertex)?((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;]*)(;)">
    
  182.         <bygroups>
    
  183.           <token type="Keyword"/>
    
  184.           <usingself state="root"/>
    
  185.           <token type="NameFunction"/>
    
  186.           <usingself state="root"/>
    
  187.           <usingself state="root"/>
    
  188.           <token type="Punctuation"/>
    
  189.         </bygroups>
    
  190.       </rule>
    
  191.       <rule>
    
  192.         <push state="statement"/>
    
  193.       </rule>
    
  194.     </state>
    
  195.     <state name="classname">
    
  196.       <rule pattern="(\[\[.+\]\])(\s*)">
    
  197.         <bygroups>
    
  198.           <token type="NameAttribute"/>
    
  199.           <token type="Text"/>
    
  200.         </bygroups>
    
  201.       </rule>
    
  202.       <rule pattern="[a-zA-Z_]\w*">
    
  203.         <token type="NameClass"/>
    
  204.         <pop depth="1"/>
    
  205.       </rule>
    
  206.       <rule pattern="\s*(?=[&gt;{])">
    
  207.         <token type="Text"/>
    
  208.         <pop depth="1"/>
    
  209.       </rule>
    
  210.     </state>
    
  211.     <state name="whitespace">
    
  212.       <rule pattern="^#if\s+0">
    
  213.         <token type="CommentPreproc"/>
    
  214.         <push state="if0"/>
    
  215.       </rule>
    
  216.       <rule pattern="^#">
    
  217.         <token type="CommentPreproc"/>
    
  218.         <push state="macro"/>
    
  219.       </rule>
    
  220.       <rule pattern="^(\s*(?:/[*].*?[*]/\s*)?)(#if\s+0)">
    
  221.         <bygroups>
    
  222.           <usingself state="root"/>
    
  223.           <token type="CommentPreproc"/>
    
  224.         </bygroups>
    
  225.         <push state="if0"/>
    
  226.       </rule>
    
  227.       <rule pattern="^(\s*(?:/[*].*?[*]/\s*)?)(#)">
    
  228.         <bygroups>
    
  229.           <usingself state="root"/>
    
  230.           <token type="CommentPreproc"/>
    
  231.         </bygroups>
    
  232.         <push state="macro"/>
    
  233.       </rule>
    
  234.       <rule pattern="\n">
    
  235.         <token type="Text"/>
    
  236.       </rule>
    
  237.       <rule pattern="\s+">
    
  238.         <token type="Text"/>
    
  239.       </rule>
    
  240.       <rule pattern="\\\n">
    
  241.         <token type="Text"/>
    
  242.       </rule>
    
  243.       <rule pattern="//(\n|[\w\W]*?[^\\]\n)">
    
  244.         <token type="CommentSingle"/>
    
  245.       </rule>
    
  246.       <rule pattern="/(\\\n)?[*][\w\W]*?[*](\\\n)?/">
    
  247.         <token type="CommentMultiline"/>
    
  248.       </rule>
    
  249.       <rule pattern="/(\\\n)?[*][\w\W]*">
    
  250.         <token type="CommentMultiline"/>
    
  251.       </rule>
    
  252.     </state>
    
  253.     <state name="statement">
    
  254.       <rule>
    
  255.         <include state="whitespace"/>
    
  256.       </rule>
    
  257.       <rule>
    
  258.         <include state="statements"/>
    
  259.       </rule>
    
  260.       <rule pattern="[{]">
    
  261.         <token type="Punctuation"/>
    
  262.         <push state="root"/>
    
  263.       </rule>
    
  264.       <rule pattern="[;}]">
    
  265.         <token type="Punctuation"/>
    
  266.         <pop depth="1"/>
    
  267.       </rule>
    
  268.     </state>
    
  269.   </rules>
    
  270. </lexer>