1<lexer>
 2  <config>
 3    <name>AMPL</name>
 4    <alias>ampl</alias>
 5    <filename>*.mod</filename>
 6    <filename>*.run</filename>
 7    <mime_type>text/x-ampl</mime_type>
 8    <case_insensitive>false</case_insensitive>
 9    <dot_all>true</dot_all>
10  </config>
11  <rules>
12    <state name="root">
13      <!-- Whitespace -->
14      <rule pattern="\s+">
15        <token type="Text"/>
16      </rule>
17
18      <!-- Comments: '#' to end-of-line and C-style comments -->
19      <rule pattern="#[^\n]*">
20        <token type="Comment"/>
21      </rule>
22      <rule pattern="/\*">
23        <token type="Comment"/>
24        <push state="comment"/>
25      </rule>
26
27      <!-- Strings -->
28      <rule pattern="&quot;(\\.|[^\\&quot;])*&quot;">
29        <token type="LiteralString"/>
30      </rule>
31      <rule pattern="&#39;(\\.|[^\\&#39;])*&#39;">
32        <token type="LiteralString"/>
33      </rule>
34
35      <!-- Numbers -->
36      <rule pattern="\b\d+\.\d*([eE][+-]?\d+)?\b">
37        <token type="LiteralNumberFloat"/>
38      </rule>
39      <rule pattern="\b\d+[eE][+-]?\d+\b">
40        <token type="LiteralNumberFloat"/>
41      </rule>
42      <rule pattern="\b\d+\b">
43        <token type="LiteralNumberInteger"/>
44      </rule>
45
46      <!-- Commands / Reserved keywords -->
47      <rule pattern="\b(call|cd|close|commands|data|delete|display|drop|end|environ|exit|expand|include|load|model|objective|option|problem|purge|quit|redeclare|reload|remove|reset|restore|shell|show|solexpand|solution|solve|update|unload|xref|coeff|coef|cover|obj|interval|default|from|to|to_come|net_in|net_out|dimen|dimension|check|complements|write|function|pipe|format|if|then|else|in|while|repeat|for)\b">
48        <token type="KeywordReserved"/>
49      </rule>
50
51      <!-- Types -->
52      <rule pattern="\b(integer|binary|symbolic|ordered|circular|reversed|INOUT|IN|OUT|LOCAL)\b">
53        <token type="KeywordType"/>
54      </rule>
55
56      <!-- Declarations (set/param/var etc) -->
57      <rule pattern="\b(set|param|var|arc|minimize|maximize|subject to|s\.t\.|subj to|node|table|suffix|read table|write table)\b">
58        <token type="KeywordDeclaration"/>
59      </rule>
60
61      <!-- Builtins / Functions -->
62      <rule pattern="\b(abs|acos|acosh|alias|asin|asinh|atan|atan2|atanh|ceil|ctime|cos|exp|floor|log|log10|max|min|precision|round|sin|sinh|sqrt|tan|tanh|time|trunc|Beta|Cauchy|Exponential|Gamma|Irand224|Normal|Normal01|Poisson|Uniform|Uniform01|num|num0|ichar|char|length|substr|sprintf|match|sub|gsub|print|printf|next|nextw|prev|prevw|first|last|ord|ord0|card|arity|indexarity)\b">
63        <token type="NameBuiltin"/>
64      </rule>
65
66      <!-- Operator words (logical/set operators) -->
67      <rule pattern="\b(or|exists|forall|and|in|not|within|union|diff|difference|symdiff|inter|intersect|intersection|cross|setof|by|less|sum|prod|product|div|mod)\b">
68        <token type="OperatorWord"/>
69      </rule>
70
71      <!-- Identifiers -->
72      <rule pattern="[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z0-9_]+)*">
73        <token type="Name"/>
74      </rule>
75
76      <!-- Operators and punctuation -->
77      <rule pattern="\+|\-|\*|/|\*\*|=|&lt;=|&gt;=|==|\||\^|&lt;|&gt;|\!|\.\.|:=|\&amp;|\!=|&lt;&lt;|&gt;&gt;">
78        <token type="Operator"/>
79      </rule>
80      <rule pattern="[(),;:\[\]{}.]">
81        <token type="Punctuation"/>
82      </rule>
83    </state>
84
85    <state name="comment">
86      <rule pattern="[^*]+">
87        <token type="Comment"/>
88      </rule>
89      <rule pattern="\*/">
90        <token type="Comment"/>
91        <pop depth="1"/>
92      </rule>
93      <rule pattern="\*">
94        <token type="Comment"/>
95      </rule>
96    </state>
97  </rules>
98</lexer>