1<lexer>
  2  <config>
  3    <name>NDISASM</name>
  4    <alias>ndisasm</alias>
  5    <mime_type>text/x-disasm</mime_type>
  6    <case_insensitive>true</case_insensitive>
  7    <priority>0.5</priority> <!-- Lower than NASM -->
  8  </config>
  9  <rules>
 10    <state name="root">
 11        <rule pattern="^[0-9A-Za-z]+">
 12            <token type="CommentSpecial"/>
 13            <push state="offset"/>
 14        </rule>
 15    </state>
 16    <state name="offset">
 17        <rule pattern="[0-9A-Za-z]+">
 18            <token type="CommentSpecial"/>
 19            <push state="assembly"/>
 20        </rule>
 21        <rule>
 22            <include state="whitespace"/>
 23        </rule>
 24    </state>
 25    <state name="punctuation">
 26      <rule pattern="[,():\[\]]+">
 27        <token type="Punctuation"/>
 28      </rule>
 29      <rule pattern="[&|^<>+*/%~-]+">
 30        <token type="Operator"/>
 31      </rule>
 32      <rule pattern="[$]+">
 33        <token type="KeywordConstant"/>
 34      </rule>
 35      <rule pattern="seg|wrt|strict">
 36        <token type="OperatorWord"/>
 37      </rule>
 38      <rule pattern="byte|[dq]?word">
 39        <token type="KeywordType"/>
 40      </rule>
 41    </state>
 42    <state name="assembly">
 43      <rule>
 44        <include state="whitespace"/>
 45      </rule>
 46      <rule pattern="[a-z$._?][\w$.?#@~]*:">
 47        <token type="NameLabel"/>
 48      </rule>
 49      <rule pattern="([a-z$._?][\w$.?#@~]*)(\s+)(equ)">
 50        <bygroups>
 51          <token type="NameConstant"/>
 52          <token type="KeywordDeclaration"/>
 53          <token type="KeywordDeclaration"/>
 54        </bygroups>
 55        <push state="instruction-args"/>
 56      </rule>
 57      <rule pattern="BITS|USE16|USE32|SECTION|SEGMENT|ABSOLUTE|EXTERN|GLOBAL|ORG|ALIGN|STRUC|ENDSTRUC|COMMON|CPU|GROUP|UPPERCASE|IMPORT|EXPORT|LIBRARY|MODULE">
 58        <token type="Keyword"/>
 59        <push state="instruction-args"/>
 60      </rule>
 61      <rule pattern="(?:res|d)[bwdqt]|times">
 62        <token type="KeywordDeclaration"/>
 63        <push state="instruction-args"/>
 64      </rule>
 65      <rule pattern="[a-z$._?][\w$.?#@~]*">
 66        <token type="NameFunction"/>
 67        <push state="instruction-args"/>
 68      </rule>
 69      <rule pattern="[\r\n]+">
 70        <token type="Text"/>
 71        <pop depth="2"/>
 72      </rule>
 73    </state>
 74    <state name="instruction-args">
 75      <rule pattern=""(\\"|[^"\n])*"|'(\\'|[^'\n])*'|`(\\`|[^`\n])*`">
 76        <token type="LiteralString"/>
 77      </rule>
 78      <rule pattern="(?:0x[0-9a-f]+|$0[0-9a-f]*|[0-9]+[0-9a-f]*h)">
 79        <token type="LiteralNumberHex"/>
 80      </rule>
 81      <rule pattern="[0-7]+q">
 82        <token type="LiteralNumberOct"/>
 83      </rule>
 84      <rule pattern="[01]+b">
 85        <token type="LiteralNumberBin"/>
 86      </rule>
 87      <rule pattern="[0-9]+\.e?[0-9]+">
 88        <token type="LiteralNumberFloat"/>
 89      </rule>
 90      <rule pattern="[0-9]+">
 91        <token type="LiteralNumberInteger"/>
 92      </rule>
 93      <rule>
 94        <include state="punctuation"/>
 95      </rule>
 96      <rule pattern="r[0-9][0-5]?[bwd]|[a-d][lh]|[er]?[a-d]x|[er]?[sb]p|[er]?[sd]i|[c-gs]s|st[0-7]|mm[0-7]|cr[0-4]|dr[0-367]|tr[3-7]">
 97        <token type="NameBuiltin"/>
 98      </rule>
 99      <rule pattern="[a-z$._?][\w$.?#@~]*">
100        <token type="NameVariable"/>
101      </rule>
102      <rule pattern="[\r\n]+">
103        <token type="Text"/>
104        <pop depth="3"/>
105      </rule>
106      <rule>
107        <include state="whitespace"/>
108      </rule>
109    </state>
110    <state name="whitespace">
111      <rule pattern="\n">
112        <token type="Text"/>
113        <pop depth="2"/>
114      </rule>
115      <rule pattern="[ \t]+">
116        <token type="Text"/>
117      </rule>
118      <rule pattern=";.*">
119        <token type="CommentSingle"/>
120      </rule>
121    </state>
122  </rules>
123</lexer>