]> gitweb.factorcode.org Git - factor.git/blob - basis/xmode/modes/cplusplus.xml
xmode.modes: updating with recent xmode files
[factor.git] / basis / xmode / modes / cplusplus.xml
1 <?xml version="1.0"?>
2
3 <!DOCTYPE MODE SYSTEM "xmode.dtd">
4
5 <!-- Extension of c.xml to add C++ specific syntax. -->
6 <!-- With some Qt keywords added -->
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*(slots)?:(?!:)).*$" />
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     <!-- Core C++ language -->
36     <RULES SET="LEX"
37         IGNORE_CASE="FALSE"
38         HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
39
40         <!-- A hack not to mark namespace qualification like "std::"
41             as labels. -->
42         <SEQ TYPE="OPERATOR">::</SEQ>
43
44         <IMPORT DELEGATE="c::COMMENTS" /> <!-- import from C mode -->
45
46         <IMPORT DELEGATE="LEXER" />
47         <IMPORT DELEGATE="c::C_LEXER" /> <!-- import from C mode -->
48     </RULES>
49
50     <RULES SET="LEXER"
51         IGNORE_CASE="FALSE">
52
53         <!-- String/char literals -->
54         <SPAN_REGEXP TYPE="LITERAL1" NO_LINE_BREAK="TRUE" ESCAPE="\">
55             <BEGIN>(?:u8|u|U)("|')</BEGIN>
56             <END>$1</END>
57         </SPAN_REGEXP>
58         <SPAN_REGEXP TYPE="LITERAL1">
59             <BEGIN>(?:L|u8|u|U)?R"([^()\\\s]*)\(</BEGIN>
60             <END>)$1"</END>
61         </SPAN_REGEXP>
62     </RULES>
63
64     <!-- Core C++ language -->
65     <RULES SET="CORE"
66         IGNORE_CASE="FALSE"
67         HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
68
69         <IMPORT DELEGATE="c::CORE"/> <!-- import from C mode -->
70
71         <KEYWORDS>
72             <KEYWORD3>catch</KEYWORD3>
73             <KEYWORD3>class</KEYWORD3>
74             <KEYWORD3>const_cast</KEYWORD3>
75             <KEYWORD1>delete</KEYWORD1>
76             <KEYWORD3>dynamic_cast</KEYWORD3>
77             <KEYWORD1>explicit</KEYWORD1>
78             <KEYWORD2>export</KEYWORD2>
79             <KEYWORD1>friend</KEYWORD1>
80             <KEYWORD3>mutable</KEYWORD3>
81             <KEYWORD2>namespace</KEYWORD2>
82             <KEYWORD1>new</KEYWORD1>
83             <KEYWORD3>operator</KEYWORD3>
84             <KEYWORD1>private</KEYWORD1>
85             <KEYWORD1>protected</KEYWORD1>
86             <KEYWORD1>public</KEYWORD1>
87             <KEYWORD1>signals</KEYWORD1>
88             <KEYWORD1>slots</KEYWORD1>
89             <KEYWORD3>reinterpret_cast</KEYWORD3>
90             <KEYWORD3>static_assert</KEYWORD3>
91             <KEYWORD3>static_cast</KEYWORD3>
92             <KEYWORD3>template</KEYWORD3>
93             <LITERAL2>this</LITERAL2>
94             <KEYWORD1>throw</KEYWORD1>
95             <KEYWORD1>try</KEYWORD1>
96             <KEYWORD3>typeid</KEYWORD3>
97             <KEYWORD3>typename</KEYWORD3>
98             <KEYWORD2>using</KEYWORD2>
99             <KEYWORD1>virtual</KEYWORD1>
100             <KEYWORD3>wchar_t</KEYWORD3>             <!-- type, kw3 -->
101
102             <!-- TM -->
103             <KEYWORD1>atomic_cancel</KEYWORD1>       <!-- block, kw1 -->
104             <KEYWORD1>atomic_commit</KEYWORD1>       <!-- block, kw1 -->
105             <KEYWORD1>atomic_noexcept</KEYWORD1>     <!-- block, kw1 -->
106             <KEYWORD1>synchronized</KEYWORD1>        <!-- block, kw1 -->
107             <KEYWORD1>transaction_safe</KEYWORD1>    <!-- block, kw1 -->
108             <KEYWORD1>transaction_safe_dynamic</KEYWORD1> <!-- block, kw1 -->
109
110             <!-- coroutines -->
111             <KEYWORD1>co_await</KEYWORD1>            <!-- statement, kw1 -->
112             <KEYWORD1>co_return</KEYWORD1>           <!-- statement, kw1 -->
113             <KEYWORD1>co_yield</KEYWORD1>            <!-- statement, kw1 -->
114
115             <!-- modules -->
116             <KEYWORD2>import</KEYWORD2>              <!-- declaration, kw2 -->
117             <KEYWORD2>module</KEYWORD2>              <!-- declaration, kw2 -->
118
119             <!-- since C++11 -->
120             <KEYWORD1>alignas</KEYWORD1>             <!-- specifier, kw1 -->
121             <KEYWORD1>alignof</KEYWORD1>             <!-- operator, kw1 -->
122             <KEYWORD3>char16_t</KEYWORD3>            <!-- type, kw 3 -->
123             <KEYWORD3>char32_t</KEYWORD3>            <!-- type, kw 3 -->
124             <KEYWORD1>constexpr</KEYWORD1>           <!-- kw1 -->
125             <KEYWORD3>decltype</KEYWORD3>            <!-- kw3 -->
126             <KEYWORD1>final</KEYWORD1>               <!-- kw1 -->
127             <KEYWORD2>noexcept</KEYWORD2>            <!-- kw2 as decl, ?? as func -->
128             <LITERAL2>nullptr</LITERAL2>             <!-- value, literal 2 -->
129             <KEYWORD1>override</KEYWORD1>            <!-- kw1 -->
130             <KEYWORD2>thread_local</KEYWORD2>        <!-- declaration, kw2 -->
131
132             <!-- since C++20 -->
133             <KEYWORD1>concept</KEYWORD1>             <!-- kw1 -->
134             <KEYWORD1>requires</KEYWORD1>            <!-- kw1 -->
135
136         </KEYWORDS>
137     </RULES>
138
139     <!-- Preprocessor specific rules -->
140     <RULES SET="CPP"
141         IGNORE_CASE="FALSE"
142         HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
143
144         <EOL_SPAN_REGEXP HASH_CHAR="include" TYPE="MARKUP" DELEGATE="c::INCLUDE">include\b</EOL_SPAN_REGEXP> <!-- import from C mode -->
145         <EOL_SPAN_REGEXP HASH_CHAR="define"  TYPE="MARKUP" DELEGATE="DEFINE">define\b</EOL_SPAN_REGEXP>
146         <EOL_SPAN_REGEXP HASH_CHAR="endif"   TYPE="MARKUP" DELEGATE="c::LEX">endif\b</EOL_SPAN_REGEXP>       <!-- import from C mode -->
147         <EOL_SPAN_REGEXP HASH_CHAR="elif"    TYPE="MARKUP" DELEGATE="c::CONDITION">elif\b</EOL_SPAN_REGEXP>  <!-- import from C mode -->
148         <EOL_SPAN_REGEXP HASH_CHAR="if"      TYPE="MARKUP" DELEGATE="c::CONDITION">if\b</EOL_SPAN_REGEXP>    <!-- import from C mode -->
149
150         <IMPORT DELEGATE="LEX"/>
151
152         <!-- Directives -->
153         <KEYWORDS>
154             <MARKUP>ifdef</MARKUP>
155             <MARKUP>ifndef</MARKUP>
156             <MARKUP>else</MARKUP>
157             <MARKUP>error</MARKUP>
158             <MARKUP>line</MARKUP>
159             <MARKUP>pragma</MARKUP>
160             <MARKUP>undef</MARKUP>
161             <MARKUP>warning</MARKUP>
162         </KEYWORDS>
163     </RULES>
164
165     <!-- After #define directive -->
166     <!-- Almost same as the normal code,
167         except two additional operators # and ##. -->
168     <RULES SET="DEFINE"
169         IGNORE_CASE="FALSE"
170         HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">
171         <SEQ TYPE="OPERATOR">#</SEQ>
172         <IMPORT DELEGATE="LEX"/>
173         <IMPORT DELEGATE="CORE"/>
174     </RULES>
175
176 </MODE>
177