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*)(=&gt;)(\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.!&amp;|()&#34;&#36;]+)(::)">
    
  82.         <bygroups>
    
  83.           <token type="NameClass"/>
    
  84.           <token type="Punctuation"/>
    
  85.         </bygroups>
    
  86.       </rule>
    
  87.       <rule pattern="&#34;">
    
  88.         <token type="LiteralString"/>
    
  89.         <push state="doublequotestring"/>
    
  90.       </rule>
    
  91.       <rule pattern="&#39;">
    
  92.         <token type="LiteralString"/>
    
  93.         <push state="singlequotestring"/>
    
  94.       </rule>
    
  95.       <rule pattern="&#96;">
    
  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="=&gt;">
    
  121.         <token type="Operator"/>
    
  122.       </rule>
    
  123.       <rule pattern="-&gt;">
    
  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="&#34;">
    
  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="&#39;">
    
  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="&#96;">
    
  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>