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="(\S+)(\s*)(=>)(\s*)">
 74        <bygroups>
 75          <token type="KeywordReserved"/>
 76          <token type="Text"/>
 77          <token type="Operator"/>
 78          <token type="Text"/>
 79        </bygroups>
 80      </rule>
 81      <rule pattern="([\w.!&|()"$]+)(::)">
 82        <bygroups>
 83          <token type="NameClass"/>
 84          <token type="Punctuation"/>
 85        </bygroups>
 86      </rule>
 87      <rule pattern=""">
 88        <token type="LiteralString"/>
 89        <push state="doublequotestring"/>
 90      </rule>
 91      <rule pattern="'">
 92        <token type="LiteralString"/>
 93        <push state="singlequotestring"/>
 94      </rule>
 95      <rule pattern="`">
 96        <token type="LiteralString"/>
 97        <push state="backtickstring"/>
 98      </rule>
 99      <rule pattern="(\w+)(\()">
100        <bygroups>
101          <token type="NameFunction"/>
102          <token type="Punctuation"/>
103        </bygroups>
104      </rule>
105      <rule pattern="(\w+)(:)">
106        <bygroups>
107          <token type="KeywordDeclaration"/>
108          <token type="Punctuation"/>
109        </bygroups>
110      </rule>
111      <rule pattern="@[{(][^)}]+[})]">
112        <token type="NameVariable"/>
113      </rule>
114      <rule pattern="\$[(][^)]+[)]">
115        <token type="NameVariable"/>
116      </rule>
117      <rule pattern="[(){},;]">
118        <token type="Punctuation"/>
119      </rule>
120      <rule pattern="=>">
121        <token type="Operator"/>
122      </rule>
123      <rule pattern="->">
124        <token type="Operator"/>
125      </rule>
126      <rule pattern="\d+\.\d+">
127        <token type="LiteralNumberFloat"/>
128      </rule>
129      <rule pattern="\d+">
130        <token type="LiteralNumberInteger"/>
131      </rule>
132      <rule pattern="\w+">
133        <token type="NameFunction"/>
134      </rule>
135      <rule pattern="\s+">
136        <token type="Text"/>
137      </rule>
138    </state>
139    <state name="doublequotestring">
140      <rule pattern="\$[{(]">
141        <token type="LiteralStringInterpol"/>
142        <push state="interpol"/>
143      </rule>
144      <rule pattern="\\.">
145        <token type="LiteralStringEscape"/>
146      </rule>
147      <rule pattern=""">
148        <token type="LiteralString"/>
149        <pop depth="1"/>
150      </rule>
151      <rule pattern="\n">
152        <token type="LiteralString"/>
153      </rule>
154      <rule pattern=".">
155        <token type="LiteralString"/>
156      </rule>
157    </state>
158    <state name="singlequotestring">
159      <rule pattern="\$[{(]">
160        <token type="LiteralStringInterpol"/>
161        <push state="interpol"/>
162      </rule>
163      <rule pattern="\\.">
164        <token type="LiteralStringEscape"/>
165      </rule>
166      <rule pattern="'">
167        <token type="LiteralString"/>
168        <pop depth="1"/>
169      </rule>
170      <rule pattern="\n">
171        <token type="LiteralString"/>
172      </rule>
173      <rule pattern=".">
174        <token type="LiteralString"/>
175      </rule>
176    </state>
177    <state name="backtickstring">
178      <rule pattern="\$[{(]">
179        <token type="LiteralStringInterpol"/>
180        <push state="interpol"/>
181      </rule>
182      <rule pattern="\\.">
183        <token type="LiteralStringEscape"/>
184      </rule>
185      <rule pattern="`">
186        <token type="LiteralString"/>
187        <pop depth="1"/>
188      </rule>
189      <rule pattern="\n">
190        <token type="LiteralString"/>
191      </rule>
192      <rule pattern=".">
193        <token type="LiteralString"/>
194      </rule>
195    </state>
196  </rules>
197</lexer>