1<lexer>
2 <config>
3 <name>C</name>
4 <alias>c</alias>
5 <filename>*.c</filename>
6 <filename>*.h</filename>
7 <filename>*.idc</filename>
8 <filename>*.x[bp]m</filename>
9 <mime_type>text/x-chdr</mime_type>
10 <mime_type>text/x-csrc</mime_type>
11 <mime_type>image/x-xbitmap</mime_type>
12 <mime_type>image/x-xpixmap</mime_type>
13 <ensure_nl>true</ensure_nl>
14 <analyse first="true" >
15 <regex pattern="(?m)^\s*#include <" score="0.1" />
16 <regex pattern="(?m)^\s*#ifn?def " score="0.1" />
17 </analyse>
18 </config>
19 <rules>
20 <state name="statement">
21 <rule>
22 <include state="whitespace"/>
23 </rule>
24 <rule>
25 <include state="statements"/>
26 </rule>
27 <rule pattern="[{}]">
28 <token type="Punctuation"/>
29 </rule>
30 <rule pattern=";">
31 <token type="Punctuation"/>
32 <pop depth="1"/>
33 </rule>
34 </state>
35 <state name="function">
36 <rule>
37 <include state="whitespace"/>
38 </rule>
39 <rule>
40 <include state="statements"/>
41 </rule>
42 <rule pattern=";">
43 <token type="Punctuation"/>
44 </rule>
45 <rule pattern="\{">
46 <token type="Punctuation"/>
47 <push/>
48 </rule>
49 <rule pattern="\}">
50 <token type="Punctuation"/>
51 <pop depth="1"/>
52 </rule>
53 </state>
54 <state name="string">
55 <rule pattern=""">
56 <token type="LiteralString"/>
57 <pop depth="1"/>
58 </rule>
59 <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})">
60 <token type="LiteralStringEscape"/>
61 </rule>
62 <rule pattern="[^\\"\n]+">
63 <token type="LiteralString"/>
64 </rule>
65 <rule pattern="\\\n">
66 <token type="LiteralString"/>
67 </rule>
68 <rule pattern="\\">
69 <token type="LiteralString"/>
70 </rule>
71 </state>
72 <state name="macro">
73 <rule pattern="(include)(\s*(?:/[*].*?[*]/\s*)?)([^\n]+)">
74 <bygroups>
75 <token type="CommentPreproc"/>
76 <token type="Text"/>
77 <token type="CommentPreprocFile"/>
78 </bygroups>
79 </rule>
80 <rule pattern="[^/\n]+">
81 <token type="CommentPreproc"/>
82 </rule>
83 <rule pattern="/[*](.|\n)*?[*]/">
84 <token type="CommentMultiline"/>
85 </rule>
86 <rule pattern="//.*?\n">
87 <token type="CommentSingle"/>
88 <pop depth="1"/>
89 </rule>
90 <rule pattern="/">
91 <token type="CommentPreproc"/>
92 </rule>
93 <rule pattern="(?<=\\)\n">
94 <token type="CommentPreproc"/>
95 </rule>
96 <rule pattern="\n">
97 <token type="CommentPreproc"/>
98 <pop depth="1"/>
99 </rule>
100 </state>
101 <state name="if0">
102 <rule pattern="^\s*#if.*?(?<!\\)\n">
103 <token type="CommentPreproc"/>
104 <push/>
105 </rule>
106 <rule pattern="^\s*#el(?:se|if).*\n">
107 <token type="CommentPreproc"/>
108 <pop depth="1"/>
109 </rule>
110 <rule pattern="^\s*#endif.*?(?<!\\)\n">
111 <token type="CommentPreproc"/>
112 <pop depth="1"/>
113 </rule>
114 <rule pattern=".*?\n">
115 <token type="Comment"/>
116 </rule>
117 </state>
118 <state name="whitespace">
119 <rule pattern="^#if\s+0">
120 <token type="CommentPreproc"/>
121 <push state="if0"/>
122 </rule>
123 <rule pattern="^#">
124 <token type="CommentPreproc"/>
125 <push state="macro"/>
126 </rule>
127 <rule pattern="^(\s*(?:/[*].*?[*]/\s*)?)(#if\s+0)">
128 <bygroups>
129 <usingself state="root"/>
130 <token type="CommentPreproc"/>
131 </bygroups>
132 <push state="if0"/>
133 </rule>
134 <rule pattern="^(\s*(?:/[*].*?[*]/\s*)?)(#)">
135 <bygroups>
136 <usingself state="root"/>
137 <token type="CommentPreproc"/>
138 </bygroups>
139 <push state="macro"/>
140 </rule>
141 <rule pattern="\n">
142 <token type="Text"/>
143 </rule>
144 <rule pattern="\s+">
145 <token type="Text"/>
146 </rule>
147 <rule pattern="\\\n">
148 <token type="Text"/>
149 </rule>
150 <rule pattern="//(\n|[\w\W]*?[^\\]\n)">
151 <token type="CommentSingle"/>
152 </rule>
153 <rule pattern="/(\\\n)?[*][\w\W]*?[*](\\\n)?/">
154 <token type="CommentMultiline"/>
155 </rule>
156 <rule pattern="/(\\\n)?[*][\w\W]*">
157 <token type="CommentMultiline"/>
158 </rule>
159 </state>
160 <state name="statements">
161 <rule pattern="(L?)(")">
162 <bygroups>
163 <token type="LiteralStringAffix"/>
164 <token type="LiteralString"/>
165 </bygroups>
166 <push state="string"/>
167 </rule>
168 <rule pattern="(L?)(')(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])(')">
169 <bygroups>
170 <token type="LiteralStringAffix"/>
171 <token type="LiteralStringChar"/>
172 <token type="LiteralStringChar"/>
173 <token type="LiteralStringChar"/>
174 </bygroups>
175 </rule>
176 <rule pattern="(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*">
177 <token type="LiteralNumberFloat"/>
178 </rule>
179 <rule pattern="(\d+\.\d*|\.\d+|\d+[fF])[fF]?">
180 <token type="LiteralNumberFloat"/>
181 </rule>
182 <rule pattern="0x[0-9a-fA-F]+[LlUu]*">
183 <token type="LiteralNumberHex"/>
184 </rule>
185 <rule pattern="0[0-7]+[LlUu]*">
186 <token type="LiteralNumberOct"/>
187 </rule>
188 <rule pattern="\d+[LlUu]*">
189 <token type="LiteralNumberInteger"/>
190 </rule>
191 <rule pattern="\*/">
192 <token type="Error"/>
193 </rule>
194 <rule pattern="[~!%^&*+=|?:<>/-]">
195 <token type="Operator"/>
196 </rule>
197 <rule pattern="[()\[\],.]">
198 <token type="Punctuation"/>
199 </rule>
200 <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">
201 <token type="Keyword"/>
202 </rule>
203 <rule pattern="(bool|int|long|float|short|double|char((8|16|32)_t)?|unsigned|signed|void|u?int(_fast|_least|)(8|16|32|64)_t)\b|\b[a-z]\w*_t\b">
204 <token type="KeywordType"/>
205 </rule>
206 <rule pattern="(typename|__inline|restrict|_inline|thread|inline|naked)\b">
207 <token type="KeywordReserved"/>
208 </rule>
209 <rule pattern="(__m(128i|128d|128|64))\b">
210 <token type="KeywordReserved"/>
211 </rule>
212 <rule pattern="__(forceinline|identifier|unaligned|declspec|fastcall|finally|stdcall|wchar_t|assume|except|int32|cdecl|int16|leave|based|raise|int64|noop|int8|w64|try|asm)\b">
213 <token type="KeywordReserved"/>
214 </rule>
215 <rule pattern="(true|false|NULL)\b">
216 <token type="NameBuiltin"/>
217 </rule>
218 <rule pattern="([a-zA-Z_]\w*)(\s*)(:)(?!:)">
219 <bygroups>
220 <token type="NameLabel"/>
221 <token type="Text"/>
222 <token type="Punctuation"/>
223 </bygroups>
224 </rule>
225 <rule pattern="\b[A-Za-z_]\w*(?=\s*\()">
226 <token type="NameFunction"/>
227 </rule>
228 <rule pattern="[a-zA-Z_]\w*">
229 <token type="Name"/>
230 </rule>
231 </state>
232 <state name="root">
233 <rule>
234 <include state="whitespace"/>
235 </rule>
236 <rule pattern="((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;{]*)(\{)">
237 <bygroups>
238 <usingself state="root"/>
239 <token type="NameFunction"/>
240 <usingself state="root"/>
241 <usingself state="root"/>
242 <token type="Punctuation"/>
243 </bygroups>
244 <push state="function"/>
245 </rule>
246 <rule pattern="((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;]*)(;)">
247 <bygroups>
248 <usingself state="root"/>
249 <token type="NameFunction"/>
250 <usingself state="root"/>
251 <usingself state="root"/>
252 <token type="Punctuation"/>
253 </bygroups>
254 </rule>
255 <rule>
256 <push state="statement"/>
257 </rule>
258 </state>
259 </rules>
260</lexer>