1<lexer>
  2  <config>
  3    <name>HCL</name>
  4    <alias>hcl</alias>
  5    <filename>*.hcl</filename>
  6    <mime_type>application/x-hcl</mime_type>
  7  </config>
  8  <rules>
  9    <state name="punctuation">
 10      <rule pattern="[\[\](),.]">
 11        <token type="Punctuation"/>
 12      </rule>
 13    </state>
 14    <state name="string">
 15      <rule pattern="(".*")">
 16        <bygroups>
 17          <token type="LiteralStringDouble"/>
 18        </bygroups>
 19      </rule>
 20    </state>
 21    <state name="whitespace">
 22      <rule pattern="\n">
 23        <token type="Text"/>
 24      </rule>
 25      <rule pattern="\s+">
 26        <token type="Text"/>
 27      </rule>
 28      <rule pattern="\\\n">
 29        <token type="Text"/>
 30      </rule>
 31    </state>
 32    <state name="root">
 33      <rule>
 34        <include state="string"/>
 35      </rule>
 36      <rule>
 37        <include state="punctuation"/>
 38      </rule>
 39      <rule>
 40        <include state="curly"/>
 41      </rule>
 42      <rule>
 43        <include state="basic"/>
 44      </rule>
 45      <rule>
 46        <include state="whitespace"/>
 47      </rule>
 48      <rule pattern="[0-9]+">
 49        <token type="LiteralNumber"/>
 50      </rule>
 51    </state>
 52    <state name="basic">
 53      <rule pattern="\b(false|true)\b">
 54        <token type="KeywordType"/>
 55      </rule>
 56      <rule pattern="\s*/\*">
 57        <token type="CommentMultiline"/>
 58        <push state="comment"/>
 59      </rule>
 60      <rule pattern="\s*#.*\n">
 61        <token type="CommentSingle"/>
 62      </rule>
 63      <rule pattern="(.*?)(\s*)(=)">
 64        <bygroups>
 65          <token type="Name"/>
 66          <token type="Text"/>
 67          <token type="Operator"/>
 68        </bygroups>
 69      </rule>
 70      <rule pattern="\d+">
 71        <token type="LiteralNumber"/>
 72      </rule>
 73      <rule pattern="\b\w+\b">
 74        <token type="Keyword"/>
 75      </rule>
 76      <rule pattern="\$\{">
 77        <token type="LiteralStringInterpol"/>
 78        <push state="var_builtin"/>
 79      </rule>
 80    </state>
 81    <state name="curly">
 82      <rule pattern="\{">
 83        <token type="TextPunctuation"/>
 84      </rule>
 85      <rule pattern="\}">
 86        <token type="TextPunctuation"/>
 87      </rule>
 88    </state>
 89    <state name="function">
 90      <rule pattern="(\s+)(".*")(\s+)">
 91        <bygroups>
 92          <token type="Text"/>
 93          <token type="LiteralString"/>
 94          <token type="Text"/>
 95        </bygroups>
 96      </rule>
 97      <rule>
 98        <include state="punctuation"/>
 99      </rule>
100      <rule>
101        <include state="curly"/>
102      </rule>
103    </state>
104    <state name="var_builtin">
105      <rule pattern="\$\{">
106        <token type="LiteralStringInterpol"/>
107        <push/>
108      </rule>
109      <rule pattern="\b(element|concat|lookup|file|join)\b">
110        <token type="NameBuiltin"/>
111      </rule>
112      <rule>
113        <include state="string"/>
114      </rule>
115      <rule>
116        <include state="punctuation"/>
117      </rule>
118      <rule pattern="\s+">
119        <token type="Text"/>
120      </rule>
121      <rule pattern="\}">
122        <token type="LiteralStringInterpol"/>
123        <pop depth="1"/>
124      </rule>
125    </state>
126    <state name="comment">
127      <rule pattern="[^*/]">
128        <token type="CommentMultiline"/>
129      </rule>
130      <rule pattern="/\*">
131        <token type="CommentMultiline"/>
132        <push/>
133      </rule>
134      <rule pattern="\*/">
135        <token type="CommentMultiline"/>
136        <pop depth="1"/>
137      </rule>
138      <rule pattern="[*/]">
139        <token type="CommentMultiline"/>
140      </rule>
141    </state>
142  </rules>
143</lexer>