3 <!DOCTYPE MODE SYSTEM "xmode.dtd">
5 <!-- This is based on ISO C++ Standard, 2003 and ISO C Standard, 1999.
6 The C++ keywords have been removed from this mode file, though. -->
9 <PROPERTY NAME="commentStart" VALUE="/*" />
10 <PROPERTY NAME="commentEnd" VALUE="*/" />
11 <PROPERTY NAME="lineComment" VALUE="//" />
12 <PROPERTY NAME="wordBreakChars" VALUE=",+-=<>/?^&*" />
15 <PROPERTY NAME="indentOpenBrackets" VALUE="{" />
16 <PROPERTY NAME="indentCloseBrackets" VALUE="}" />
17 <PROPERTY NAME="unalignedOpenBrackets" VALUE="(" />
18 <PROPERTY NAME="unalignedCloseBrackets" VALUE=")" />
19 <PROPERTY NAME="indentNextLine"
20 VALUE="(?!^\s*(#|//)).*(\b(if|while|for)\s*\(.*\)|\b(else|do)\b)[^{;]*$" />
21 <PROPERTY NAME="unindentThisLine"
22 VALUE="^\s*((case\b.*|[\p{Alpha}_][\p{Alnum}_]*)\s*:(?!:)).*$" />
23 <PROPERTY NAME="electricKeys" VALUE=":" />
28 HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
29 <EOL_SPAN TYPE="KEYWORD2" AT_WHITESPACE_END="TRUE" DELEGATE="CPP">#</EOL_SPAN>
31 <IMPORT DELEGATE="LEX"/>
32 <IMPORT DELEGATE="CORE"/>
35 <RULES SET="LEX" IGNORE_CASE="FALSE">
36 <IMPORT DELEGATE="COMMENTS" />
37 <IMPORT DELEGATE="C_LEXER" />
40 <!-- Comments, Trigraph, Alternate-Tokens -->
43 HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
45 <!-- String/char literals -->
46 <SPAN_REGEXP TYPE="LITERAL1" NO_LINE_BREAK="TRUE" ESCAPE="\">
47 <BEGIN>L?("|')</BEGIN>
52 <SEQ TYPE="LITERAL4">??(</SEQ>
53 <SEQ TYPE="LITERAL4">??/</SEQ>
54 <SEQ TYPE="LITERAL4">??)</SEQ>
55 <SEQ TYPE="LITERAL4">??'</SEQ>
56 <SEQ TYPE="LITERAL4">??<</SEQ>
57 <SEQ TYPE="LITERAL4">??!</SEQ>
58 <SEQ TYPE="LITERAL4">??></SEQ>
59 <SEQ TYPE="LITERAL4">??-</SEQ>
60 <SEQ TYPE="LITERAL4">??=</SEQ>
62 <!-- Alternate tokens -->
63 <SEQ TYPE="LITERAL4"><:</SEQ>
64 <SEQ TYPE="LITERAL4">:></SEQ>
65 <SEQ TYPE="LITERAL4"><%</SEQ>
66 <SEQ TYPE="LITERAL4">%></SEQ>
67 <SEQ TYPE="LITERAL4">%:</SEQ>
70 This is a part of core language syntax, but must be here
71 because it can't work after SEQ for ':'. -->
72 <MARK_PREVIOUS AT_WHITESPACE_END="TRUE"
74 TYPE="LABEL">:</MARK_PREVIOUS>
76 <!-- Function-like macro or function calls.
77 This can't work after SEQ for '('. -->
80 MATCH_TYPE="OPERATOR">(</MARK_PREVIOUS>
82 <SEQ TYPE="OPERATOR">=</SEQ>
83 <SEQ TYPE="OPERATOR">!</SEQ>
84 <SEQ TYPE="OPERATOR">+</SEQ>
85 <SEQ TYPE="OPERATOR">-</SEQ>
86 <SEQ TYPE="OPERATOR">/</SEQ>
87 <SEQ TYPE="OPERATOR">*</SEQ>
88 <SEQ TYPE="OPERATOR">></SEQ>
89 <SEQ TYPE="OPERATOR"><</SEQ>
90 <SEQ TYPE="OPERATOR">%</SEQ>
91 <SEQ TYPE="OPERATOR">&</SEQ>
92 <SEQ TYPE="OPERATOR">|</SEQ>
93 <SEQ TYPE="OPERATOR">^</SEQ>
94 <SEQ TYPE="OPERATOR">~</SEQ>
95 <SEQ TYPE="OPERATOR">?</SEQ>
96 <SEQ TYPE="OPERATOR">:</SEQ>
97 <SEQ TYPE="OPERATOR">.</SEQ>
98 <SEQ TYPE="OPERATOR">,</SEQ>
99 <SEQ TYPE="OPERATOR">[</SEQ>
100 <SEQ TYPE="OPERATOR">]</SEQ>
101 <SEQ TYPE="OPERATOR">)</SEQ>
102 <SEQ TYPE="OPERATOR">}</SEQ>
103 <SEQ TYPE="OPERATOR">{</SEQ>
104 <SEQ TYPE="OPERATOR">;</SEQ>
107 <!-- Predefined macro names from ISO C++ Standard 2003 -->
108 <LITERAL2>__DATE__</LITERAL2>
109 <LITERAL2>__FILE__</LITERAL2>
110 <LITERAL2>__LINE__</LITERAL2>
111 <LITERAL2>__STDC_HOSTED__</LITERAL2>
112 <LITERAL2>__STDC_ISO_10646__</LITERAL2>
113 <LITERAL2>__STDC_VERSION__</LITERAL2>
114 <LITERAL2>__STDC__</LITERAL2>
115 <LITERAL2>__TIME__</LITERAL2>
116 <LITERAL2>__cplusplus</LITERAL2>
117 <!-- Standard library macro names from ISO C++ Standard 2003 -->
118 <!-- Hilight these to indicate accidental use of them
119 in user source. They may be valid, but should cause
120 future conflicts. -->
121 <LITERAL2>BUFSIZ</LITERAL2>
122 <LITERAL2>CLOCKS_PER_SEC</LITERAL2>
123 <LITERAL2>EDOM</LITERAL2>
124 <LITERAL2>EILSEQ</LITERAL2>
125 <LITERAL2>EOF</LITERAL2>
126 <LITERAL2>ERANGE</LITERAL2>
127 <LITERAL2>EXIT_FAILURE</LITERAL2>
128 <LITERAL2>EXIT_SUCCESS</LITERAL2>
129 <LITERAL2>FILENAME_MAX</LITERAL2>
130 <LITERAL2>FOPEN_MAX</LITERAL2>
131 <LITERAL2>HUGE_VAL</LITERAL2>
132 <LITERAL2>LC_ALL</LITERAL2>
133 <LITERAL2>LC_COLLATE</LITERAL2>
134 <LITERAL2>LC_CTYPE</LITERAL2>
135 <LITERAL2>LC_MONETARY</LITERAL2>
136 <LITERAL2>LC_NUMERIC</LITERAL2>
137 <LITERAL2>LC_TIME</LITERAL2>
138 <LITERAL2>L_tmpnam</LITERAL2>
139 <LITERAL2>MB_CUR_MAX</LITERAL2>
140 <LITERAL2>NULL</LITERAL2>
141 <LITERAL2>RAND_MAX</LITERAL2>
142 <LITERAL2>SEEK_CUR</LITERAL2>
143 <LITERAL2>SEEK_END</LITERAL2>
144 <LITERAL2>SEEK_SET</LITERAL2>
145 <LITERAL2>SIGABRT</LITERAL2>
146 <LITERAL2>SIGFPE</LITERAL2>
147 <LITERAL2>SIGILL</LITERAL2>
148 <LITERAL2>SIGINT</LITERAL2>
149 <LITERAL2>SIGSEGV</LITERAL2>
150 <LITERAL2>SIGTERM</LITERAL2>
151 <LITERAL2>SIG_DFL</LITERAL2>
152 <LITERAL2>SIG_ERR</LITERAL2>
153 <LITERAL2>SIG_IGN</LITERAL2>
154 <LITERAL2>TMP_MAX</LITERAL2>
155 <LITERAL2>WCHAR_MAX</LITERAL2>
156 <LITERAL2>WCHAR_MIN</LITERAL2>
157 <LITERAL2>WEOF</LITERAL2>
158 <LITERAL2>_IOFBF</LITERAL2>
159 <LITERAL2>_IOLBF</LITERAL2>
160 <LITERAL2>_IONBF</LITERAL2>
161 <LITERAL2>assert</LITERAL2>
162 <LITERAL2>errno</LITERAL2>
163 <LITERAL2>offsetof</LITERAL2>
164 <LITERAL2>setjmp</LITERAL2>
165 <LITERAL2>stderr</LITERAL2>
166 <LITERAL2>stdin</LITERAL2>
167 <LITERAL2>stdout</LITERAL2>
168 <LITERAL2>va_arg</LITERAL2>
169 <LITERAL2>va_end</LITERAL2>
170 <LITERAL2>va_start</LITERAL2>
171 <!-- Standard C library values from ISO C++ Standard 2003 -->
172 <!-- These are not explicitly defined as macro. But they like
173 to be due to compatibility with C library implementation.
174 So, treat them like standard library macro names. -->
175 <LITERAL2>CHAR_BIT</LITERAL2>
176 <LITERAL2>CHAR_MAX</LITERAL2>
177 <LITERAL2>CHAR_MIN</LITERAL2>
178 <LITERAL2>DBL_DIG</LITERAL2>
179 <LITERAL2>DBL_EPSILON</LITERAL2>
180 <LITERAL2>DBL_MANT_DIG</LITERAL2>
181 <LITERAL2>DBL_MAX</LITERAL2>
182 <LITERAL2>DBL_MAX_10_EXP</LITERAL2>
183 <LITERAL2>DBL_MAX_EXP</LITERAL2>
184 <LITERAL2>DBL_MIN</LITERAL2>
185 <LITERAL2>DBL_MIN_10_EXP</LITERAL2>
186 <LITERAL2>DBL_MIN_EXP</LITERAL2>
187 <LITERAL2>FLT_DIG</LITERAL2>
188 <LITERAL2>FLT_EPSILON</LITERAL2>
189 <LITERAL2>FLT_MANT_DIG</LITERAL2>
190 <LITERAL2>FLT_MAX</LITERAL2>
191 <LITERAL2>FLT_MAX_10_EXP</LITERAL2>
192 <LITERAL2>FLT_MAX_EXP</LITERAL2>
193 <LITERAL2>FLT_MIN</LITERAL2>
194 <LITERAL2>FLT_MIN_10_EXP</LITERAL2>
195 <LITERAL2>FLT_MIN_EXP</LITERAL2>
196 <LITERAL2>FLT_RADIX</LITERAL2>
197 <LITERAL2>FLT_ROUNDS</LITERAL2>
198 <LITERAL2>INT_MAX</LITERAL2>
199 <LITERAL2>INT_MIN</LITERAL2>
200 <LITERAL2>LDBL_DIG</LITERAL2>
201 <LITERAL2>LDBL_EPSILON</LITERAL2>
202 <LITERAL2>LDBL_MANT_DIG</LITERAL2>
203 <LITERAL2>LDBL_MAX</LITERAL2>
204 <LITERAL2>LDBL_MAX_10_EXP</LITERAL2>
205 <LITERAL2>LDBL_MAX_EXP</LITERAL2>
206 <LITERAL2>LDBL_MIN</LITERAL2>
207 <LITERAL2>LDBL_MIN_10_EXP</LITERAL2>
208 <LITERAL2>LDBL_MIN_EXP</LITERAL2>
209 <LITERAL2>LONG_MAX</LITERAL2>
210 <LITERAL2>LONG_MIN</LITERAL2>
211 <LITERAL2>MB_LEN_MAX</LITERAL2>
212 <LITERAL2>SCHAR_MAX</LITERAL2>
213 <LITERAL2>SCHAR_MIN</LITERAL2>
214 <LITERAL2>SHRT_MAX</LITERAL2>
215 <LITERAL2>SHRT_MIN</LITERAL2>
216 <LITERAL2>UCHAR_MAX</LITERAL2>
217 <LITERAL2>UINT_MAX</LITERAL2>
218 <LITERAL2>ULONG_MAX</LITERAL2>
219 <LITERAL2>USRT_MAX</LITERAL2>
220 <!-- Alternative representations of some operators
221 from ISO C++ Standard 2003 -->
222 <!-- These are separated from CORE because they are
223 available in the constant expressions after
224 #if and #elif preprocessor directives. -->
225 <KEYWORD3>and</KEYWORD3>
226 <KEYWORD3>and_eq</KEYWORD3>
227 <KEYWORD3>bitand</KEYWORD3>
228 <KEYWORD3>bitor</KEYWORD3>
229 <KEYWORD3>compl</KEYWORD3>
230 <KEYWORD3>not</KEYWORD3>
231 <KEYWORD3>not_eq</KEYWORD3>
232 <KEYWORD3>or</KEYWORD3>
233 <KEYWORD3>or_eq</KEYWORD3>
234 <KEYWORD3>xor</KEYWORD3>
235 <KEYWORD3>xor_eq</KEYWORD3>
239 <!-- Core language -->
242 HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
245 <KEYWORD3>bool</KEYWORD3>
246 <KEYWORD3>char</KEYWORD3>
247 <KEYWORD3>double</KEYWORD3>
248 <KEYWORD3>enum</KEYWORD3>
249 <KEYWORD3>float</KEYWORD3>
250 <KEYWORD3>int</KEYWORD3>
251 <KEYWORD3>long</KEYWORD3>
252 <KEYWORD3>short</KEYWORD3>
253 <KEYWORD3>signed</KEYWORD3>
254 <KEYWORD3>struct</KEYWORD3>
255 <KEYWORD3>union</KEYWORD3>
256 <KEYWORD3>unsigned</KEYWORD3>
257 <!-- Keywords from ISO C++ Standard 2003 -->
258 <KEYWORD2>asm</KEYWORD2>
259 <KEYWORD1>auto</KEYWORD1>
260 <KEYWORD1>break</KEYWORD1>
261 <KEYWORD1>case</KEYWORD1>
262 <KEYWORD1>const</KEYWORD1>
263 <KEYWORD1>continue</KEYWORD1>
264 <KEYWORD1>default</KEYWORD1>
265 <KEYWORD1>do</KEYWORD1>
266 <KEYWORD1>else</KEYWORD1>
267 <KEYWORD2>extern</KEYWORD2>
268 <LITERAL2>false</LITERAL2>
269 <KEYWORD1>for</KEYWORD1>
270 <KEYWORD1>goto</KEYWORD1>
271 <KEYWORD1>if</KEYWORD1>
272 <KEYWORD1>inline</KEYWORD1>
273 <KEYWORD1>register</KEYWORD1>
274 <KEYWORD1>return</KEYWORD1>
275 <KEYWORD1>sizeof</KEYWORD1>
276 <KEYWORD1>static</KEYWORD1>
277 <KEYWORD1>switch</KEYWORD1>
278 <LITERAL2>true</LITERAL2>
279 <KEYWORD3>typedef</KEYWORD3>
280 <KEYWORD1>void</KEYWORD1>
281 <KEYWORD1>volatile</KEYWORD1>
282 <KEYWORD1>while</KEYWORD1>
283 <!-- Additional keywords from ISO C Standard(C99) -->
284 <KEYWORD3>restrict</KEYWORD3>
285 <KEYWORD3>_Bool</KEYWORD3>
286 <KEYWORD3>_Complex</KEYWORD3>
287 <KEYWORD3>_Pragma</KEYWORD3>
288 <KEYWORD3>_Imaginary</KEYWORD3>
292 <!-- Different comment styles. -->
293 <RULES SET="COMMENTS">
294 <!-- Doxygen comment, Javadoc style -->
295 <SEQ TYPE="COMMENT1">/**/</SEQ>
296 <SPAN TYPE="COMMENT3" DELEGATE="doxygen::DOXYGEN">
297 <BEGIN>/**<</BEGIN>
300 <SPAN TYPE="COMMENT3" DELEGATE="doxygen::DOXYGEN">
304 <EOL_SPAN TYPE="COMMENT3" DELEGATE="doxygen::DOXYGEN">///<</EOL_SPAN>
305 <EOL_SPAN TYPE="COMMENT3" DELEGATE="doxygen::DOXYGEN">///</EOL_SPAN>
307 <!-- Doxygen comment, Qt style -->
308 <SPAN TYPE="COMMENT3" DELEGATE="doxygen::DOXYGEN">
309 <BEGIN>/*!<</BEGIN>
312 <SPAN TYPE="COMMENT3" DELEGATE="doxygen::DOXYGEN">
316 <EOL_SPAN TYPE="COMMENT3" DELEGATE="doxygen::DOXYGEN">//!<</EOL_SPAN>
317 <EOL_SPAN TYPE="COMMENT3" DELEGATE="doxygen::DOXYGEN">//!</EOL_SPAN>
319 <!-- C style comment -->
320 <SPAN TYPE="COMMENT1">
324 <EOL_SPAN TYPE="COMMENT1">//</EOL_SPAN>
327 <!-- Preprocessor specific rules -->
330 HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
332 <EOL_SPAN_REGEXP HASH_CHAR="include" TYPE="MARKUP" DELEGATE="INCLUDE">include\b</EOL_SPAN_REGEXP>
333 <EOL_SPAN_REGEXP HASH_CHAR="define" TYPE="MARKUP" DELEGATE="DEFINE">define\b</EOL_SPAN_REGEXP>
334 <EOL_SPAN_REGEXP HASH_CHAR="endif" TYPE="MARKUP" DELEGATE="LEX">endif\b</EOL_SPAN_REGEXP>
335 <EOL_SPAN_REGEXP HASH_CHAR="elif" TYPE="MARKUP" DELEGATE="CONDITION">elif\b</EOL_SPAN_REGEXP>
336 <EOL_SPAN_REGEXP HASH_CHAR="if" TYPE="MARKUP" DELEGATE="CONDITION">if\b</EOL_SPAN_REGEXP>
338 <IMPORT DELEGATE="LEX"/>
342 <MARKUP>ifdef</MARKUP>
343 <MARKUP>ifndef</MARKUP>
344 <MARKUP>else</MARKUP>
345 <MARKUP>error</MARKUP>
346 <MARKUP>line</MARKUP>
347 <MARKUP>pragma</MARKUP>
348 <MARKUP>undef</MARKUP>
349 <MARKUP>warning</MARKUP>
353 <!-- After #include directive -->
354 <!-- "\"s are not escaped. -->
357 HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
358 <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
362 <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
366 <IMPORT DELEGATE="LEX"/>
369 <!-- After #define directive -->
370 <!-- Almost same as the normal code,
371 except two additional operators # and ##. -->
374 HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
375 <SEQ TYPE="OPERATOR">#</SEQ>
376 <IMPORT DELEGATE="LEX"/>
377 <IMPORT DELEGATE="CORE"/>
380 <!-- After #if or #elif directive -->
381 <!-- All constant expressions and a special operator
382 'defined' is available. But the core language elements
383 (such as operator 'sizeof', type casting, etc...) are not. -->
384 <RULES SET="CONDITION"
386 HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
387 <IMPORT DELEGATE="LEX"/>
389 <KEYWORD2>defined</KEYWORD2>
390 <!-- Both true and false are specially permitted by
391 ISO C++ Standard 2003 16.1p4 -->
392 <KEYWORD2>true</KEYWORD2>
393 <KEYWORD2>false</KEYWORD2>