1<lexer>
  2  <config>
  3    <name>Devicetree</name>
  4    <alias>devicetree</alias>
  5    <alias>dts</alias>
  6    <filename>*.dts</filename>
  7    <filename>*.dtsi</filename>
  8    <mime_type>text/x-devicetree</mime_type>
  9  </config>
 10  <rules>
 11    <state name="whitespace">
 12      <rule pattern="\n">
 13        <token type="TextWhitespace" />
 14      </rule>
 15      <rule pattern="\s+">
 16        <token type="TextWhitespace" />
 17      </rule>
 18      <rule pattern="\\\n">
 19        <token type="Text" />
 20      </rule>
 21      <rule pattern="//(\n|[\w\W]*?[^\\]\n)">
 22        <token type="CommentSingle" />
 23      </rule>
 24      <rule pattern="/(\\\n)?[*][\w\W]*?[*](\\\n)?/">
 25        <token type="CommentMultiline" />
 26      </rule>
 27    </state>
 28
 29    <state name="macro">
 30      <rule pattern="(#include)(\s*(?:/[*][^*/]*?[*]/\s*)*)([^\n]+)">
 31        <bygroups>
 32          <token type="CommentPreproc" />
 33          <token type="CommentMultiline" />
 34          <token type="CommentPreprocFile" />
 35        </bygroups>
 36      </rule>
 37      <rule pattern="(#define)(\s*(?:/[*][^*/]*?[*]/\s*)*)([^\n]+)">
 38        <bygroups>
 39          <token type="CommentPreproc" />
 40          <token type="CommentMultiline" />
 41          <token type="CommentPreproc" />
 42        </bygroups>
 43      </rule>
 44      <rule pattern="/dts-v1/">
 45        <token type="CommentPreproc" />
 46      </rule>
 47      <rule pattern="/memreserve/">
 48        <token type="CommentPreproc" />
 49      </rule>
 50      <rule pattern="/delete-node/">
 51        <token type="CommentPreproc" />
 52      </rule>
 53      <rule pattern="/delete-property/">
 54        <token type="CommentPreproc" />
 55      </rule>
 56      <rule pattern="(/include/)(\s*(?:/[*][^*/]*?[*]/\s*)*)(&quot;[^\n]+&quot;)">
 57        <bygroups>
 58          <token type="CommentPreproc" />
 59          <token type="CommentMultiline" />
 60          <token type="CommentPreprocFile" />
 61        </bygroups>
 62      </rule>
 63    </state>
 64
 65    <state name="basic_statements">
 66      <rule pattern="&amp;[a-zA-Z0-9_]+">
 67        <token type="NameLabel" />
 68      </rule>
 69
 70      <rule pattern="[a-zA-Z0-9_]+:">
 71        <token type="NameLabel" />
 72      </rule>
 73
 74      <rule pattern="(L?)(&quot;)">
 75        <bygroups>
 76          <token type="LiteralStringAffix" />
 77          <token type="LiteralString" />
 78        </bygroups>
 79        <push state="string" />
 80      </rule>
 81      <rule pattern="0x[0-9a-fA-F]+">
 82        <token type="LiteralNumberHex" />
 83      </rule>
 84      <rule pattern="\d+">
 85        <token type="LiteralNumberInteger" />
 86      </rule>
 87
 88      <rule pattern="status\b">
 89        <token type="KeywordReserved" />
 90        <push state="status_property" />
 91      </rule>
 92
 93      <rule pattern="([~!%^&amp;*+=|?:&lt;&gt;/#-])">
 94        <token type="Operator" />
 95      </rule>
 96      <rule pattern="[()\[\]{},.]">
 97        <token type="Punctuation" />
 98      </rule>
 99
100      <rule
101        pattern="[a-zA-Z_][\w-]*(?=(?:\s*,\s*[a-zA-Z_][\w-]*|(?:\s*(?:/[*][^*/]*?[*]/\s*)*))*\s*[=;])">
102        <token type="NameAttribute" />
103      </rule>
104      <rule pattern="[a-zA-Z_][\w-]*">
105        <token type="Name" />
106      </rule>
107    </state>
108
109    <state name="status_property">
110      <rule>
111        <include state="whitespace" />
112      </rule>
113      <rule pattern="=">
114        <token type="Operator" />
115      </rule>
116
117      <rule pattern="&quot;okay&quot;">
118        <token type="LiteralString" />
119        <pop depth="1" />
120      </rule>
121      <rule pattern="&quot;disabled&quot;">
122        <token type="KeywordType" />
123        <pop depth="1" />
124      </rule>
125      <rule pattern="&quot;reserved&quot;">
126        <token type="NameDecorator" />
127        <pop depth="1" />
128      </rule>
129      <rule pattern="&quot;fail&quot;">
130        <token type="GenericError" />
131        <pop depth="1" />
132      </rule>
133      <rule pattern="&quot;fail-[^\&quot;]+&quot;">
134        <token type="GenericTraceback" />
135        <pop depth="1" />
136      </rule>
137      <rule pattern="&quot;">
138        <token type="LiteralString" />
139        <push state="string" />
140      </rule>
141
142      <rule pattern=";">
143        <pop depth="1" />
144      </rule>
145    </state>
146
147    <state name="root">
148      <rule>
149        <include state="whitespace" />
150      </rule>
151      <rule>
152        <include state="macro" />
153      </rule>
154
155      <rule pattern="([^/*@\s&amp;]+|/)(@?)((?:0x)?[0-9a-fA-F,]*)(\s*(?:/[*][^*/]*?[*]/\s*)*)(\{)">
156        <bygroups>
157          <token type="NameFunction" />
158          <token type="Operator" />
159          <token type="LiteralNumberInteger" />
160          <token type="CommentMultiline" />
161          <token type="Punctuation" />
162        </bygroups>
163        <push state="node" />
164      </rule>
165
166      <rule>
167        <push state="statement" />
168      </rule>
169    </state>
170
171    <state name="node">
172      <rule>
173        <include state="whitespace" />
174      </rule>
175      <rule>
176        <include state="macro" />
177      </rule>
178
179      <rule pattern="([^/*@\s&amp;]+|/)(@?)((?:0x)?[0-9a-fA-F,]*)(\s*(?:/[*][^*/]*?[*]/\s*)*)(\{)">
180        <bygroups>
181          <token type="NameFunction" />
182          <token type="Operator" />
183          <token type="LiteralNumberInteger" />
184          <token type="CommentMultiline" />
185          <token type="Punctuation" />
186        </bygroups>
187        <push />
188      </rule>
189
190      <rule pattern="([a-zA-Z0-9_]+)(\s*)(:)">
191        <bygroups>
192          <token type="NameLabel" />
193          <token type="Text" />
194          <token type="Punctuation" />
195        </bygroups>
196      </rule>
197
198      <rule pattern="\}">
199        <token type="Punctuation" />
200        <pop depth="1" />
201      </rule>
202      <rule>
203        <include state="basic_statements" />
204      </rule>
205      <rule pattern=";">
206        <token type="Punctuation" />
207      </rule>
208    </state>
209
210    <state name="statement">
211      <rule>
212        <include state="whitespace" />
213      </rule>
214      <rule pattern="([a-zA-Z0-9_]+)(\s*)(:)">
215        <bygroups>
216          <token type="NameLabel" />
217          <token type="Text" />
218          <token type="Punctuation" />
219        </bygroups>
220        <pop depth="1" />
221      </rule>
222      <rule>
223        <include state="basic_statements" />
224      </rule>
225      <rule pattern=";">
226        <token type="Punctuation" />
227        <pop depth="1" />
228      </rule>
229    </state>
230
231    <state name="string">
232      <rule pattern="&quot;">
233        <token type="LiteralString" />
234        <pop depth="1" />
235      </rule>
236      <rule
237        pattern="\\([\\abfnrtv&quot;\&#x27;]|x[a-fA-F0-9]{2,4}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})">
238        <token type="LiteralStringEscape" />
239      </rule>
240      <rule pattern="[^\\&quot;\n]+">
241        <token type="LiteralString" />
242      </rule>
243      <rule pattern="\\\n">
244        <token type="LiteralString" />
245      </rule>
246      <rule pattern="\\">
247        <token type="LiteralString" />
248      </rule>
249    </state>
250  </rules>
251</lexer>