1. <lexer>
    
  2.   <config>
    
  3.     <name>HolyC</name>
    
  4.     <alias>holyc</alias>
    
  5.     <filename>*.HC</filename>
    
  6.     <filename>*.hc</filename>
    
  7.     <filename>*.HH</filename>
    
  8.     <filename>*.hh</filename>
    
  9.     <filename>*.hc.z</filename>
    
  10.     <filename>*.HC.Z</filename>
    
  11.     <mime_type>text/x-chdr</mime_type>
    
  12.     <mime_type>text/x-csrc</mime_type>
    
  13.     <mime_type>image/x-xbitmap</mime_type>
    
  14.     <mime_type>image/x-xpixmap</mime_type>
    
  15.     <ensure_nl>true</ensure_nl>
    
  16.   </config>
    
  17.   <rules>
    
  18.     <state name="statement">
    
  19.       <rule>
    
  20.         <include state="whitespace"/>
    
  21.       </rule>
    
  22.       <rule>
    
  23.         <include state="statements"/>
    
  24.       </rule>
    
  25.       <rule pattern="[{}]">
    
  26.         <token type="Punctuation"/>
    
  27.       </rule>
    
  28.       <rule pattern=";">
    
  29.         <token type="Punctuation"/>
    
  30.         <pop depth="1"/>
    
  31.       </rule>
    
  32.     </state>
    
  33.     <state name="function">
    
  34.       <rule>
    
  35.         <include state="whitespace"/>
    
  36.       </rule>
    
  37.       <rule>
    
  38.         <include state="statements"/>
    
  39.       </rule>
    
  40.       <rule pattern=";">
    
  41.         <token type="Punctuation"/>
    
  42.       </rule>
    
  43.       <rule pattern="\{">
    
  44.         <token type="Punctuation"/>
    
  45.         <push/>
    
  46.       </rule>
    
  47.       <rule pattern="\}">
    
  48.         <token type="Punctuation"/>
    
  49.         <pop depth="1"/>
    
  50.       </rule>
    
  51.     </state>
    
  52.     <state name="string">
    
  53.       <rule pattern="&#34;">
    
  54.         <token type="LiteralString"/>
    
  55.         <pop depth="1"/>
    
  56.       </rule>
    
  57.       <rule pattern="\\([\\abfnrtv&#34;\&#39;]|x[a-fA-F0-9]{2,4}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})">
    
  58.         <token type="LiteralStringEscape"/>
    
  59.       </rule>
    
  60.       <rule pattern="[^\\&#34;\n]+">
    
  61.         <token type="LiteralString"/>
    
  62.       </rule>
    
  63.       <rule pattern="\\\n">
    
  64.         <token type="LiteralString"/>
    
  65.       </rule>
    
  66.       <rule pattern="\\">
    
  67.         <token type="LiteralString"/>
    
  68.       </rule>
    
  69.     </state>
    
  70.     <state name="macro">
    
  71.       <rule pattern="(include)(\s*(?:/[*].*?[*]/\s*)?)([^\n]+)">
    
  72.         <bygroups>
    
  73.           <token type="CommentPreproc"/>
    
  74.           <token type="Text"/>
    
  75.           <token type="CommentPreprocFile"/>
    
  76.         </bygroups>
    
  77.       </rule>
    
  78.       <rule pattern="[^/\n]+">
    
  79.         <token type="CommentPreproc"/>
    
  80.       </rule>
    
  81.       <rule pattern="/[*](.|\n)*?[*]/">
    
  82.         <token type="CommentMultiline"/>
    
  83.       </rule>
    
  84.       <rule pattern="//.*?\n">
    
  85.         <token type="CommentSingle"/>
    
  86.         <pop depth="1"/>
    
  87.       </rule>
    
  88.       <rule pattern="/">
    
  89.         <token type="CommentPreproc"/>
    
  90.       </rule>
    
  91.       <rule pattern="(?&lt;=\\)\n">
    
  92.         <token type="CommentPreproc"/>
    
  93.       </rule>
    
  94.       <rule pattern="\n">
    
  95.         <token type="CommentPreproc"/>
    
  96.         <pop depth="1"/>
    
  97.       </rule>
    
  98.     </state>
    
  99.     <state name="if0">
    
  100.       <rule pattern="^\s*#if.*?(?&lt;!\\)\n">
    
  101.         <token type="CommentPreproc"/>
    
  102.         <push/>
    
  103.       </rule>
    
  104.       <rule pattern="^\s*#el(?:se|if).*\n">
    
  105.         <token type="CommentPreproc"/>
    
  106.         <pop depth="1"/>
    
  107.       </rule>
    
  108.       <rule pattern="^\s*#endif.*?(?&lt;!\\)\n">
    
  109.         <token type="CommentPreproc"/>
    
  110.         <pop depth="1"/>
    
  111.       </rule>
    
  112.       <rule pattern=".*?\n">
    
  113.         <token type="Comment"/>
    
  114.       </rule>
    
  115.     </state>
    
  116.     <state name="whitespace">
    
  117.       <rule pattern="^#if\s+0">
    
  118.         <token type="CommentPreproc"/>
    
  119.         <push state="if0"/>
    
  120.       </rule>
    
  121.       <rule pattern="^#">
    
  122.         <token type="CommentPreproc"/>
    
  123.         <push state="macro"/>
    
  124.       </rule>
    
  125.       <rule pattern="^(\s*(?:/[*].*?[*]/\s*)?)(#if\s+0)">
    
  126.         <bygroups>
    
  127.           <usingself state="root"/>
    
  128.           <token type="CommentPreproc"/>
    
  129.         </bygroups>
    
  130.         <push state="if0"/>
    
  131.       </rule>
    
  132.       <rule pattern="^(\s*(?:/[*].*?[*]/\s*)?)(#)">
    
  133.         <bygroups>
    
  134.           <usingself state="root"/>
    
  135.           <token type="CommentPreproc"/>
    
  136.         </bygroups>
    
  137.         <push state="macro"/>
    
  138.       </rule>
    
  139.       <rule pattern="\n">
    
  140.         <token type="Text"/>
    
  141.       </rule>
    
  142.       <rule pattern="\s+">
    
  143.         <token type="Text"/>
    
  144.       </rule>
    
  145.       <rule pattern="\\\n">
    
  146.         <token type="Text"/>
    
  147.       </rule>
    
  148.       <rule pattern="//(\n|[\w\W]*?[^\\]\n)">
    
  149.         <token type="CommentSingle"/>
    
  150.       </rule>
    
  151.       <rule pattern="/(\\\n)?[*][\w\W]*?[*](\\\n)?/">
    
  152.         <token type="CommentMultiline"/>
    
  153.       </rule>
    
  154.       <rule pattern="/(\\\n)?[*][\w\W]*">
    
  155.         <token type="CommentMultiline"/>
    
  156.       </rule>
    
  157.     </state>
    
  158.     <state name="statements">
    
  159.       <rule pattern="(L?)(&#34;)">
    
  160.         <bygroups>
    
  161.           <token type="LiteralStringAffix"/>
    
  162.           <token type="LiteralString"/>
    
  163.         </bygroups>
    
  164.         <push state="string"/>
    
  165.       </rule>
    
  166.       <rule pattern="(L?)(&#39;)(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\&#39;\n])(&#39;)">
    
  167.         <bygroups>
    
  168.           <token type="LiteralStringAffix"/>
    
  169.           <token type="LiteralStringChar"/>
    
  170.           <token type="LiteralStringChar"/>
    
  171.           <token type="LiteralStringChar"/>
    
  172.         </bygroups>
    
  173.       </rule>
    
  174.       <rule pattern="(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*">
    
  175.         <token type="LiteralNumberFloat"/>
    
  176.       </rule>
    
  177.       <rule pattern="(\d+\.\d*|\.\d+|\d+[fF])[fF]?">
    
  178.         <token type="LiteralNumberFloat"/>
    
  179.       </rule>
    
  180.       <rule pattern="0x[0-9a-fA-F]+[LlUu]*">
    
  181.         <token type="LiteralNumberHex"/>
    
  182.       </rule>
    
  183.       <rule pattern="0[0-7]+[LlUu]*">
    
  184.         <token type="LiteralNumberOct"/>
    
  185.       </rule>
    
  186.       <rule pattern="\d+[LlUu]*">
    
  187.         <token type="LiteralNumberInteger"/>
    
  188.       </rule>
    
  189.       <rule pattern="\*/">
    
  190.         <token type="Error"/>
    
  191.       </rule>
    
  192.       <rule pattern="[~!%^&amp;*+=|?:&lt;&gt;/-]">
    
  193.         <token type="Operator"/>
    
  194.       </rule>
    
  195.       <rule pattern="[()\[\],.]">
    
  196.         <token type="Punctuation"/>
    
  197.       </rule>
    
  198.       <rule pattern="(break|case|continue|default|do|else|for|goto|if|return|switch|while|throw|try|catch|extern|MOV|CALL|PUSH|LEAVE|RET|SUB|SHR|ADD|RETF|CMP|JNE|BTS|INT|XOR|JC|JZ|LOOP|POP|TEST|SHL|ADC|SBB|JMP|INC)\b">
    
  199.         <token type="Keyword"/>
    
  200.       </rule>
    
  201.       <rule pattern="(U0|I8|U8|I16|U16|I32|U32|I64|U64|F64|Bool|class|union|DU8|DU16|DU32|DU64|RAX|RCX|RDX|RBX|RSP|RBP|RSI|RDI|EAX|ECX|EDX|EBX|ESP|EBP|ESI|EDI|AX|CX|DX|BX|SP|BP|SI|DI|SS|CS|DS|ES|FS|GS|CH|asm|const|extern|register|restrict|static|volatile|inline|_extern|_import|IMPORT|public)\b">
    
  202.         <token type="KeywordType"/>
    
  203.       </rule>
    
  204.       <rule pattern="__()\b">
    
  205.         <token type="KeywordReserved"/>
    
  206.       </rule>
    
  207.       <rule pattern="(NULL|TRUE|FALSE|ON|OFF)\b">
    
  208.         <token type="NameBuiltin"/>
    
  209.       </rule>
    
  210.       <rule pattern="([a-zA-Z_]\w*)(\s*)(:)(?!:)">
    
  211.         <bygroups>
    
  212.           <token type="NameLabel"/>
    
  213.           <token type="Text"/>
    
  214.           <token type="Punctuation"/>
    
  215.         </bygroups>
    
  216.       </rule>
    
  217.       <rule pattern="\b[A-Za-z_]\w*(?=\s*\()">
    
  218.           <token type="NameFunction"/>
    
  219.       </rule>
    
  220.       <rule pattern="[a-zA-Z_]\w*">
    
  221.         <token type="Name"/>
    
  222.       </rule>
    
  223.     </state>
    
  224.     <state name="root">
    
  225.       <rule>
    
  226.         <include state="whitespace"/>
    
  227.       </rule>
    
  228.       <rule pattern="((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;{]*)(\{)">
    
  229.         <bygroups>
    
  230.           <usingself state="root"/>
    
  231.           <token type="NameFunction"/>
    
  232.           <usingself state="root"/>
    
  233.           <usingself state="root"/>
    
  234.           <token type="Punctuation"/>
    
  235.         </bygroups>
    
  236.         <push state="function"/>
    
  237.       </rule>
    
  238.       <rule pattern="((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;]*)(;)">
    
  239.         <bygroups>
    
  240.           <usingself state="root"/>
    
  241.           <token type="NameFunction"/>
    
  242.           <usingself state="root"/>
    
  243.           <usingself state="root"/>
    
  244.           <token type="Punctuation"/>
    
  245.         </bygroups>
    
  246.       </rule>
    
  247.       <rule>
    
  248.         <push state="statement"/>
    
  249.       </rule>
    
  250.     </state>
    
  251.   </rules>
    
  252. </lexer>