1<lexer>
  2  <config>
  3    <name>CFEngine3</name>
  4    <alias>cfengine3</alias>
  5    <alias>cf3</alias>
  6    <filename>*.cf</filename>
  7  </config>
  8  <rules>
  9    <state name="interpol">
 10      <rule pattern="\$[{(]">
 11        <token type="LiteralStringInterpol"/>
 12        <push/>
 13      </rule>
 14      <rule pattern="[})]">
 15        <token type="LiteralStringInterpol"/>
 16        <pop depth="1"/>
 17      </rule>
 18      <rule pattern="[^${()}]+">
 19        <token type="LiteralStringInterpol"/>
 20      </rule>
 21    </state>
 22    <state name="arglist">
 23      <rule pattern="\)">
 24        <token type="Punctuation"/>
 25        <pop depth="1"/>
 26      </rule>
 27      <rule pattern=",">
 28        <token type="Punctuation"/>
 29      </rule>
 30      <rule pattern="\w+">
 31        <token type="NameVariable"/>
 32      </rule>
 33      <rule pattern="\s+">
 34        <token type="Text"/>
 35      </rule>
 36    </state>
 37    <state name="root">
 38      <rule pattern="#.*?\n">
 39        <token type="Comment"/>
 40      </rule>
 41      <rule pattern="@.*?\n">
 42        <token type="CommentPreproc"/>
 43      </rule>
 44      <rule pattern="(body)(\s+)(\S+)(\s+)(control)">
 45        <bygroups>
 46          <token type="Keyword"/>
 47          <token type="Text"/>
 48          <token type="Keyword"/>
 49          <token type="Text"/>
 50          <token type="Keyword"/>
 51        </bygroups>
 52      </rule>
 53      <rule pattern="(body|bundle|promise)(\s+)(\S+)(\s+)(\w+)(\()">
 54        <bygroups>
 55          <token type="Keyword"/>
 56          <token type="Text"/>
 57          <token type="Keyword"/>
 58          <token type="Text"/>
 59          <token type="NameFunction"/>
 60          <token type="Punctuation"/>
 61        </bygroups>
 62        <push state="arglist"/>
 63      </rule>
 64      <rule pattern="(body|bundle|promise)(\s+)(\S+)(\s+)(\w+)">
 65        <bygroups>
 66          <token type="Keyword"/>
 67          <token type="Text"/>
 68          <token type="Keyword"/>
 69          <token type="Text"/>
 70          <token type="NameFunction"/>
 71        </bygroups>
 72      </rule>
 73      <rule pattern="(&#34;)([^&#34;]+)(&#34;)(\s+)(string|slist|int|real)(\s*)(=&gt;)(\s*)">
 74        <bygroups>
 75          <token type="Punctuation"/>
 76          <token type="NameVariable"/>
 77          <token type="Punctuation"/>
 78          <token type="Text"/>
 79          <token type="KeywordType"/>
 80          <token type="Text"/>
 81          <token type="Operator"/>
 82          <token type="Text"/>
 83        </bygroups>
 84      </rule>
 85      <rule pattern="(\S+)(\s*)(=&gt;)(\s*)">
 86        <bygroups>
 87          <token type="KeywordReserved"/>
 88          <token type="Text"/>
 89          <token type="Operator"/>
 90          <token type="Text"/>
 91        </bygroups>
 92      </rule>
 93      <rule pattern="&#34;">
 94        <token type="LiteralString"/>
 95        <push state="doublequotestring"/>
 96      </rule>
 97      <rule pattern="&#39;">
 98        <token type="LiteralString"/>
 99        <push state="singlequotestring"/>
100      </rule>
101      <rule pattern="&#96;">
102        <token type="LiteralString"/>
103        <push state="backtickstring"/>
104      </rule>
105      <rule pattern="(\w+)(\()">
106        <bygroups>
107          <token type="NameFunction"/>
108          <token type="Punctuation"/>
109        </bygroups>
110      </rule>
111      <rule pattern="([\w.!&amp;|()]+)(::)">
112        <bygroups>
113          <token type="NameClass"/>
114          <token type="Punctuation"/>
115        </bygroups>
116      </rule>
117      <rule pattern="(\w+)(:)">
118        <bygroups>
119          <token type="KeywordDeclaration"/>
120          <token type="Punctuation"/>
121        </bygroups>
122      </rule>
123      <rule pattern="@[{(][^)}]+[})]">
124        <token type="NameVariable"/>
125      </rule>
126      <rule pattern="[(){},;]">
127        <token type="Punctuation"/>
128      </rule>
129      <rule pattern="=&gt;">
130        <token type="Operator"/>
131      </rule>
132      <rule pattern="-&gt;">
133        <token type="Operator"/>
134      </rule>
135      <rule pattern="\d+\.\d+">
136        <token type="LiteralNumberFloat"/>
137      </rule>
138      <rule pattern="\d+">
139        <token type="LiteralNumberInteger"/>
140      </rule>
141      <rule pattern="\w+">
142        <token type="NameFunction"/>
143      </rule>
144      <rule pattern="\s+">
145        <token type="Text"/>
146      </rule>
147    </state>
148    <state name="doublequotestring">
149      <rule pattern="\$[{(]">
150        <token type="LiteralStringInterpol"/>
151        <push state="interpol"/>
152      </rule>
153      <rule pattern="\\.">
154        <token type="LiteralStringEscape"/>
155      </rule>
156      <rule pattern="&#34;">
157        <token type="LiteralString"/>
158        <pop depth="1"/>
159      </rule>
160      <rule pattern="\n">
161        <token type="LiteralString"/>
162      </rule>
163      <rule pattern=".">
164        <token type="LiteralString"/>
165      </rule>
166    </state>
167    <state name="singlequotestring">
168      <rule pattern="\$[{(]">
169        <token type="LiteralStringInterpol"/>
170        <push state="interpol"/>
171      </rule>
172      <rule pattern="\\.">
173        <token type="LiteralStringEscape"/>
174      </rule>
175      <rule pattern="&#39;">
176        <token type="LiteralString"/>
177        <pop depth="1"/>
178      </rule>
179      <rule pattern="\n">
180        <token type="LiteralString"/>
181      </rule>
182      <rule pattern=".">
183        <token type="LiteralString"/>
184      </rule>
185    </state>
186    <state name="backtickstring">
187      <rule pattern="\$[{(]">
188        <token type="LiteralStringInterpol"/>
189        <push state="interpol"/>
190      </rule>
191      <rule pattern="\\.">
192        <token type="LiteralStringEscape"/>
193      </rule>
194      <rule pattern="&#96;">
195        <token type="LiteralString"/>
196        <pop depth="1"/>
197      </rule>
198      <rule pattern="\n">
199        <token type="LiteralString"/>
200      </rule>
201      <rule pattern=".">
202        <token type="LiteralString"/>
203      </rule>
204    </state>
205  </rules>
206</lexer>