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 <[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*(?=[>{])">
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+)("[^"]+?"|<[^>]+?>)">
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="(?<=\\)\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)(")([^\\()\s]{,16})(\()((?:.|\n)*?)(\)\3)(")">
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)(")">
150 <bygroups>
151 <token type="LiteralStringAffix"/>
152 <token type="LiteralString"/>
153 </bygroups>
154 <push state="string"/>
155 </rule>
156 <rule pattern="(L?)(")">
157 <bygroups>
158 <token type="LiteralStringAffix"/>
159 <token type="LiteralString"/>
160 </bygroups>
161 <push state="string"/>
162 </rule>
163 <rule pattern="(L?)(')(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])(')">
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]('?[0-9A-Fa-f]+)*)[LlUu]*">
178 <token type="LiteralNumberHex"/>
179 </rule>
180 <rule pattern="0('?[0-7]+)+[LlUu]*">
181 <token type="LiteralNumberOct"/>
182 </rule>
183 <rule pattern="0[Bb][01]('?[01]+)*[LlUu]*">
184 <token type="LiteralNumberBin"/>
185 </rule>
186 <rule pattern="[0-9]('?[0-9]+)*[LlUu]*">
187 <token type="LiteralNumberInteger"/>
188 </rule>
189 <rule pattern="\*/">
190 <token type="Error"/>
191 </rule>
192 <rule pattern="[~!%^&*+=|?:<>/-]">
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=""">
248 <token type="LiteralString"/>
249 <pop depth="1"/>
250 </rule>
251 <rule pattern="\\([\\abfnrtv"\']|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="[^\\"\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.*?(?<!\\)\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.*?(?<!\\)\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>