]> gitweb.factorcode.org Git - factor.git/blob - basis/xmode/modes/c.xml
xmode.modes: updating with recent xmode files
[factor.git] / basis / xmode / modes / c.xml
1 <?xml version="1.0"?>
2
3 <!DOCTYPE MODE SYSTEM "xmode.dtd">
4
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. -->
7 <MODE>
8     <PROPS>
9         <PROPERTY NAME="commentStart" VALUE="/*" />
10         <PROPERTY NAME="commentEnd" VALUE="*/" />
11         <PROPERTY NAME="lineComment" VALUE="//" />
12         <PROPERTY NAME="wordBreakChars" VALUE=",+-=&lt;&gt;/?^&amp;*" />
13
14         <!-- Auto indent -->
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=":" />
24     </PROPS>
25
26     <RULES
27         IGNORE_CASE="FALSE"
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>
30
31         <IMPORT DELEGATE="LEX"/>
32         <IMPORT DELEGATE="CORE"/>
33     </RULES>
34
35     <RULES SET="LEX" IGNORE_CASE="FALSE">
36         <IMPORT DELEGATE="COMMENTS" />
37         <IMPORT DELEGATE="C_LEXER" />
38     </RULES>
39
40     <!-- Comments, Trigraph, Alternate-Tokens -->
41     <RULES SET="C_LEXER"
42         IGNORE_CASE="FALSE"
43         HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
44
45         <!-- String/char literals -->
46         <SPAN_REGEXP TYPE="LITERAL1" NO_LINE_BREAK="TRUE" ESCAPE="\">
47             <BEGIN>L?("|')</BEGIN>
48             <END>$1</END>
49         </SPAN_REGEXP>
50
51         <!-- Trigraphs -->
52         <SEQ TYPE="LITERAL4">??(</SEQ>
53         <SEQ TYPE="LITERAL4">??/</SEQ>
54         <SEQ TYPE="LITERAL4">??)</SEQ>
55         <SEQ TYPE="LITERAL4">??'</SEQ>
56         <SEQ TYPE="LITERAL4">??&lt;</SEQ>
57         <SEQ TYPE="LITERAL4">??!</SEQ>
58         <SEQ TYPE="LITERAL4">??&gt;</SEQ>
59         <SEQ TYPE="LITERAL4">??-</SEQ>
60         <SEQ TYPE="LITERAL4">??=</SEQ>
61
62         <!-- Alternate tokens -->
63         <SEQ TYPE="LITERAL4">&lt;:</SEQ>
64         <SEQ TYPE="LITERAL4">:&gt;</SEQ>
65         <SEQ TYPE="LITERAL4">&lt;%</SEQ>
66         <SEQ TYPE="LITERAL4">%&gt;</SEQ>
67         <SEQ TYPE="LITERAL4">%:</SEQ>
68
69         <!-- Labels.
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"
73             MATCH_TYPE="OPERATOR"
74             TYPE="LABEL">:</MARK_PREVIOUS>
75
76         <!-- Function-like macro or function calls.
77             This can't work after SEQ for '('. -->
78         <MARK_PREVIOUS
79             TYPE="FUNCTION"
80             MATCH_TYPE="OPERATOR">(</MARK_PREVIOUS>
81
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">&gt;</SEQ>
89         <SEQ TYPE="OPERATOR">&lt;</SEQ>
90         <SEQ TYPE="OPERATOR">%</SEQ>
91         <SEQ TYPE="OPERATOR">&amp;</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>
105
106         <KEYWORDS>
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>
236         </KEYWORDS>
237     </RULES>
238
239     <!-- Core language -->
240     <RULES SET="CORE"
241         IGNORE_CASE="FALSE"
242         HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
243         <KEYWORDS>
244             <!-- Types -->
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>
289         </KEYWORDS>
290     </RULES>
291
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>/**&lt;</BEGIN>
298             <END>*/</END>
299         </SPAN>
300         <SPAN TYPE="COMMENT3" DELEGATE="doxygen::DOXYGEN">
301             <BEGIN>/**</BEGIN>
302             <END>*/</END>
303         </SPAN>
304         <EOL_SPAN TYPE="COMMENT3" DELEGATE="doxygen::DOXYGEN">///&lt;</EOL_SPAN>
305         <EOL_SPAN TYPE="COMMENT3" DELEGATE="doxygen::DOXYGEN">///</EOL_SPAN>
306
307         <!-- Doxygen comment, Qt style -->
308         <SPAN TYPE="COMMENT3" DELEGATE="doxygen::DOXYGEN">
309             <BEGIN>/*!&lt;</BEGIN>
310             <END>*/</END>
311         </SPAN>
312         <SPAN TYPE="COMMENT3" DELEGATE="doxygen::DOXYGEN">
313             <BEGIN>/*!</BEGIN>
314             <END>*/</END>
315         </SPAN>
316         <EOL_SPAN TYPE="COMMENT3" DELEGATE="doxygen::DOXYGEN">//!&lt;</EOL_SPAN>
317         <EOL_SPAN TYPE="COMMENT3" DELEGATE="doxygen::DOXYGEN">//!</EOL_SPAN>
318
319         <!-- C style comment -->
320         <SPAN TYPE="COMMENT1">
321             <BEGIN>/*</BEGIN>
322             <END>*/</END>
323         </SPAN>
324         <EOL_SPAN TYPE="COMMENT1">//</EOL_SPAN>
325         </RULES>
326
327     <!-- Preprocessor specific rules -->
328     <RULES SET="CPP"
329         IGNORE_CASE="FALSE"
330         HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
331
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>
337
338         <IMPORT DELEGATE="LEX"/>
339
340         <!-- Directives -->
341         <KEYWORDS>
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>
350         </KEYWORDS>
351     </RULES>
352
353     <!-- After #include directive -->
354     <!-- "\"s are not escaped. -->
355     <RULES SET="INCLUDE"
356         IGNORE_CASE="FALSE"
357         HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
358         <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
359             <BEGIN>&lt;</BEGIN>
360             <END>&gt;</END>
361         </SPAN>
362         <SPAN TYPE="LITERAL1" NO_LINE_BREAK="TRUE">
363             <BEGIN>"</BEGIN>
364             <END>"</END>
365         </SPAN>
366         <IMPORT DELEGATE="LEX"/>
367     </RULES>
368
369     <!-- After #define directive -->
370     <!-- Almost same as the normal code,
371         except two additional operators # and ##. -->
372     <RULES SET="DEFINE"
373         IGNORE_CASE="FALSE"
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"/>
378     </RULES>
379
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"
385         IGNORE_CASE="FALSE"
386         HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
387         <IMPORT DELEGATE="LEX"/>
388         <KEYWORDS>
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>
394         </KEYWORDS>
395     </RULES>
396
397 </MODE>
398