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=""(\\.|[^\\"])*"">
29 <token type="LiteralString"/>
30 </rule>
31 <rule pattern="'(\\.|[^\\'])*'">
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="\+|\-|\*|/|\*\*|=|<=|>=|==|\||\^|<|>|\!|\.\.|:=|\&|\!=|<<|>>">
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>