c++.xml

  1<lexer>
  2  <config>
  3    <name>C++</name>
  4    <alias>cpp</alias>
  5    <alias>c++</alias>
  6    <filename>*.cpp</filename>
  7    <filename>*.hpp</filename>
  8    <filename>*.c++</filename>
  9    <filename>*.h++</filename>
 10    <filename>*.cc</filename>
 11    <filename>*.hh</filename>
 12    <filename>*.cxx</filename>
 13    <filename>*.hxx</filename>
 14    <filename>*.C</filename>
 15    <filename>*.H</filename>
 16    <filename>*.cp</filename>
 17    <filename>*.CPP</filename>
 18    <filename>*.tpp</filename>
 19    <mime_type>text/x-c++hdr</mime_type>
 20    <mime_type>text/x-c++src</mime_type>
 21    <ensure_nl>true</ensure_nl>
 22    <analyse first="true">
 23      <regex pattern="#include &lt;[a-z_]+>" score="0.2" />
 24      <regex pattern="using namespace " score="0.4" />
 25    </analyse>
 26  </config>
 27  <rules>
 28    <state name="classname">
 29      <rule pattern="(\[\[.+\]\])(\s*)">
 30        <bygroups>
 31          <token type="NameAttribute"/>
 32          <token type="Text"/>
 33        </bygroups>
 34      </rule>
 35      <rule pattern="[a-zA-Z_]\w*">
 36        <token type="NameClass"/>
 37        <pop depth="1"/>
 38      </rule>
 39      <rule pattern="\s*(?=[&gt;{])">
 40        <token type="Text"/>
 41        <pop depth="1"/>
 42      </rule>
 43    </state>
 44    <state name="whitespace">
 45      <rule pattern="^#if\s+0">
 46        <token type="CommentPreproc"/>
 47        <push state="if0"/>
 48      </rule>
 49      <rule pattern="^#">
 50        <token type="CommentPreproc"/>
 51        <push state="macro"/>
 52      </rule>
 53      <rule pattern="^(\s*(?:/[*].*?[*]/\s*)?)(#if\s+0)">
 54        <bygroups>
 55          <usingself state="root"/>
 56          <token type="CommentPreproc"/>
 57        </bygroups>
 58        <push state="if0"/>
 59      </rule>
 60      <rule pattern="^(\s*(?:/[*].*?[*]/\s*)?)(#)">
 61        <bygroups>
 62          <usingself state="root"/>
 63          <token type="CommentPreproc"/>
 64        </bygroups>
 65        <push state="macro"/>
 66      </rule>
 67      <rule pattern="\n">
 68        <token type="Text"/>
 69      </rule>
 70      <rule pattern="\s+">
 71        <token type="Text"/>
 72      </rule>
 73      <rule pattern="\\\n">
 74        <token type="Text"/>
 75      </rule>
 76      <rule pattern="//(\n|[\w\W]*?[^\\]\n)">
 77        <token type="CommentSingle"/>
 78      </rule>
 79      <rule pattern="/(\\\n)?[*][\w\W]*?[*](\\\n)?/">
 80        <token type="CommentMultiline"/>
 81      </rule>
 82      <rule pattern="/(\\\n)?[*][\w\W]*">
 83        <token type="CommentMultiline"/>
 84      </rule>
 85    </state>
 86    <state name="macro">
 87      <rule pattern="(include)(\s+)(&quot;[^&quot;]+?&quot;|&lt;[^&gt;]+?&gt;)">
 88        <bygroups>
 89          <token type="CommentPreproc"/>
 90          <token type="Text"/>
 91          <token type="CommentPreprocFile"/>
 92        </bygroups>
 93      </rule>
 94      <rule pattern="[^/\n]+">
 95        <token type="CommentPreproc"/>
 96      </rule>
 97      <rule pattern="/[*](.|\n)*?[*]/">
 98        <token type="CommentMultiline"/>
 99      </rule>
100      <rule pattern="//.*?\n">
101        <token type="CommentSingle"/>
102        <pop depth="1"/>
103      </rule>
104      <rule pattern="/">
105        <token type="CommentPreproc"/>
106      </rule>
107      <rule pattern="(?&lt;=\\)\n">
108        <token type="CommentPreproc"/>
109      </rule>
110      <rule pattern="\n">
111        <token type="CommentPreproc"/>
112        <pop depth="1"/>
113      </rule>
114    </state>
115    <state name="statements">
116      <rule pattern="(reinterpret_cast|static_assert|thread_local|dynamic_cast|static_cast|const_cast|co_return|protected|namespace|consteval|constexpr|typename|co_await|co_yield|operator|restrict|explicit|template|override|noexcept|requires|decltype|alignof|private|alignas|virtual|mutable|nullptr|concept|export|friend|typeid|throws|public|delete|final|throw|catch|using|this|new|try)\b">
117        <token type="Keyword"/>
118      </rule>
119      <rule pattern="(enum)\b(\s+)(class)\b(\s*)">
120        <bygroups>
121          <token type="Keyword"/>
122          <token type="Text"/>
123          <token type="Keyword"/>
124          <token type="Text"/>
125        </bygroups>
126        <push state="classname"/>
127      </rule>
128      <rule pattern="(class|struct|enum|union)\b(\s*)">
129        <bygroups>
130          <token type="Keyword"/>
131          <token type="Text"/>
132        </bygroups>
133        <push state="classname"/>
134      </rule>
135      <rule pattern="\[\[.+\]\]">
136        <token type="NameAttribute"/>
137      </rule>
138      <rule pattern="(R)(&#34;)([^\\()\s]{,16})(\()((?:.|\n)*?)(\)\3)(&#34;)">
139        <bygroups>
140          <token type="LiteralStringAffix"/>
141          <token type="LiteralString"/>
142          <token type="LiteralStringDelimiter"/>
143          <token type="LiteralStringDelimiter"/>
144          <token type="LiteralString"/>
145          <token type="LiteralStringDelimiter"/>
146          <token type="LiteralString"/>
147        </bygroups>
148      </rule>
149      <rule pattern="(u8|u|U)(&#34;)">
150        <bygroups>
151          <token type="LiteralStringAffix"/>
152          <token type="LiteralString"/>
153        </bygroups>
154        <push state="string"/>
155      </rule>
156      <rule pattern="(L?)(&#34;)">
157        <bygroups>
158          <token type="LiteralStringAffix"/>
159          <token type="LiteralString"/>
160        </bygroups>
161        <push state="string"/>
162      </rule>
163      <rule pattern="(L?)(&#39;)(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\&#39;\n])(&#39;)">
164        <bygroups>
165          <token type="LiteralStringAffix"/>
166          <token type="LiteralStringChar"/>
167          <token type="LiteralStringChar"/>
168          <token type="LiteralStringChar"/>
169        </bygroups>
170      </rule>
171      <rule pattern="(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*">
172        <token type="LiteralNumberFloat"/>
173      </rule>
174      <rule pattern="(\d+\.\d*|\.\d+|\d+[fF])[fF]?">
175        <token type="LiteralNumberFloat"/>
176      </rule>
177      <rule pattern="0[xX]([0-9A-Fa-f](&#39;?[0-9A-Fa-f]+)*)[LlUu]*">
178        <token type="LiteralNumberHex"/>
179      </rule>
180      <rule pattern="0(&#39;?[0-7]+)+[LlUu]*">
181        <token type="LiteralNumberOct"/>
182      </rule>
183      <rule pattern="0[Bb][01](&#39;?[01]+)*[LlUu]*">
184        <token type="LiteralNumberBin"/>
185      </rule>
186      <rule pattern="[0-9](&#39;?[0-9]+)*[LlUu]*">
187        <token type="LiteralNumberInteger"/>
188      </rule>
189      <rule pattern="\*/">
190        <token type="Error"/>
191      </rule>
192      <rule pattern="[~!%^&amp;*+=|?:&lt;&gt;/-]">
193        <token type="Operator"/>
194      </rule>
195      <rule pattern="[()\[\],.]">
196        <token type="Punctuation"/>
197      </rule>
198      <rule pattern="(restricted|volatile|continue|register|default|typedef|struct|extern|switch|sizeof|static|return|union|while|const|break|goto|enum|else|case|auto|for|asm|if|do)\b">
199        <token type="Keyword"/>
200      </rule>
201      <rule pattern="(bool|int|long|float|short|double|char((8|16|32)_t)?|wchar_t|unsigned|signed|void|u?int(_fast|_least|)(8|16|32|64)_t)\b">
202        <token type="KeywordType"/>
203      </rule>
204      <rule pattern="(typename|__inline|restrict|_inline|thread|inline|naked)\b">
205        <token type="KeywordReserved"/>
206      </rule>
207      <rule pattern="(__m(128i|128d|128|64))\b">
208        <token type="KeywordReserved"/>
209      </rule>
210      <rule pattern="__(forceinline|identifier|unaligned|declspec|fastcall|stdcall|finally|except|assume|int32|cdecl|int64|based|leave|int16|raise|noop|int8|w64|try|asm)\b">
211        <token type="KeywordReserved"/>
212      </rule>
213      <rule pattern="(true|false|NULL)\b">
214        <token type="NameBuiltin"/>
215      </rule>
216      <rule pattern="([a-zA-Z_]\w*)(\s*)(:)(?!:)">
217        <bygroups>
218          <token type="NameLabel"/>
219          <token type="Text"/>
220          <token type="Punctuation"/>
221        </bygroups>
222      </rule>
223      <rule pattern="[a-zA-Z_]\w*">
224        <token type="Name"/>
225      </rule>
226    </state>
227    <state name="function">
228      <rule>
229        <include state="whitespace"/>
230      </rule>
231      <rule>
232        <include state="statements"/>
233      </rule>
234      <rule pattern=";">
235        <token type="Punctuation"/>
236      </rule>
237      <rule pattern="\{">
238        <token type="Punctuation"/>
239        <push/>
240      </rule>
241      <rule pattern="\}">
242        <token type="Punctuation"/>
243        <pop depth="1"/>
244      </rule>
245    </state>
246    <state name="string">
247      <rule pattern="&#34;">
248        <token type="LiteralString"/>
249        <pop depth="1"/>
250      </rule>
251      <rule pattern="\\([\\abfnrtv&#34;\&#39;]|x[a-fA-F0-9]{2,4}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})">
252        <token type="LiteralStringEscape"/>
253      </rule>
254      <rule pattern="[^\\&#34;\n]+">
255        <token type="LiteralString"/>
256      </rule>
257      <rule pattern="\\\n">
258        <token type="LiteralString"/>
259      </rule>
260      <rule pattern="\\">
261        <token type="LiteralString"/>
262      </rule>
263    </state>
264    <state name="if0">
265      <rule pattern="^\s*#if.*?(?&lt;!\\)\n">
266        <token type="CommentPreproc"/>
267        <push/>
268      </rule>
269      <rule pattern="^\s*#el(?:se|if).*\n">
270        <token type="CommentPreproc"/>
271        <pop depth="1"/>
272      </rule>
273      <rule pattern="^\s*#endif.*?(?&lt;!\\)\n">
274        <token type="CommentPreproc"/>
275        <pop depth="1"/>
276      </rule>
277      <rule pattern=".*?\n">
278        <token type="Comment"/>
279      </rule>
280    </state>
281    <state name="root">
282      <rule>
283        <include state="whitespace"/>
284      </rule>
285      <rule pattern="((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;{]*)(\{)">
286        <bygroups>
287          <usingself state="root"/>
288          <token type="NameFunction"/>
289          <usingself state="root"/>
290          <usingself state="root"/>
291          <token type="Punctuation"/>
292        </bygroups>
293        <push state="function"/>
294      </rule>
295      <rule pattern="((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;]*)(;)">
296        <bygroups>
297          <usingself state="root"/>
298          <token type="NameFunction"/>
299          <usingself state="root"/>
300          <usingself state="root"/>
301          <token type="Punctuation"/>
302        </bygroups>
303      </rule>
304      <rule>
305        <push state="statement"/>
306      </rule>
307      <rule pattern="__(multiple_inheritance|virtual_inheritance|single_inheritance|interface|uuidof|super|event)\b">
308        <token type="KeywordReserved"/>
309      </rule>
310      <rule pattern="__(offload|blockingoffload|outer)\b">
311        <token type="KeywordPseudo"/>
312      </rule>
313    </state>
314    <state name="statement">
315      <rule>
316        <include state="whitespace"/>
317      </rule>
318      <rule>
319        <include state="statements"/>
320      </rule>
321      <rule pattern="[{]">
322        <token type="Punctuation"/>
323        <push state="root"/>
324      </rule>
325      <rule pattern="[;}]">
326        <token type="Punctuation"/>
327        <pop depth="1"/>
328      </rule>
329    </state>
330  </rules>
331</lexer>