antlr3 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ANTLR-LICENSE.txt +26 -0
- data/History.txt +66 -0
- data/README.txt +139 -0
- data/bin/antlr4ruby +33 -0
- data/java/RubyTarget.java +524 -0
- data/java/antlr-full-3.2.1.jar +0 -0
- data/lib/antlr3.rb +176 -0
- data/lib/antlr3/constants.rb +88 -0
- data/lib/antlr3/debug.rb +701 -0
- data/lib/antlr3/debug/event-hub.rb +210 -0
- data/lib/antlr3/debug/record-event-listener.rb +25 -0
- data/lib/antlr3/debug/rule-tracer.rb +55 -0
- data/lib/antlr3/debug/socket.rb +360 -0
- data/lib/antlr3/debug/trace-event-listener.rb +92 -0
- data/lib/antlr3/dfa.rb +247 -0
- data/lib/antlr3/dot.rb +174 -0
- data/lib/antlr3/error.rb +657 -0
- data/lib/antlr3/main.rb +561 -0
- data/lib/antlr3/modes/ast-builder.rb +41 -0
- data/lib/antlr3/modes/filter.rb +56 -0
- data/lib/antlr3/profile.rb +322 -0
- data/lib/antlr3/recognizers.rb +1280 -0
- data/lib/antlr3/streams.rb +985 -0
- data/lib/antlr3/streams/interactive.rb +91 -0
- data/lib/antlr3/streams/rewrite.rb +412 -0
- data/lib/antlr3/test/call-stack.rb +57 -0
- data/lib/antlr3/test/config.rb +23 -0
- data/lib/antlr3/test/core-extensions.rb +269 -0
- data/lib/antlr3/test/diff.rb +165 -0
- data/lib/antlr3/test/functional.rb +207 -0
- data/lib/antlr3/test/grammar.rb +371 -0
- data/lib/antlr3/token.rb +592 -0
- data/lib/antlr3/tree.rb +1415 -0
- data/lib/antlr3/tree/debug.rb +163 -0
- data/lib/antlr3/tree/visitor.rb +84 -0
- data/lib/antlr3/tree/wizard.rb +481 -0
- data/lib/antlr3/util.rb +149 -0
- data/lib/antlr3/version.rb +27 -0
- data/samples/ANTLRv3Grammar.g +621 -0
- data/samples/Cpp.g +749 -0
- data/templates/AST.stg +335 -0
- data/templates/ASTDbg.stg +40 -0
- data/templates/ASTParser.stg +153 -0
- data/templates/ASTTreeParser.stg +272 -0
- data/templates/Dbg.stg +192 -0
- data/templates/Ruby.stg +1514 -0
- data/test/functional/ast-output/auto-ast.rb +797 -0
- data/test/functional/ast-output/construction.rb +555 -0
- data/test/functional/ast-output/hetero-nodes.rb +753 -0
- data/test/functional/ast-output/rewrites.rb +1327 -0
- data/test/functional/ast-output/tree-rewrite.rb +1662 -0
- data/test/functional/debugging/debug-mode.rb +689 -0
- data/test/functional/debugging/profile-mode.rb +165 -0
- data/test/functional/debugging/rule-tracing.rb +74 -0
- data/test/functional/delegation/import.rb +379 -0
- data/test/functional/lexer/basic.rb +559 -0
- data/test/functional/lexer/filter-mode.rb +245 -0
- data/test/functional/lexer/nuances.rb +47 -0
- data/test/functional/lexer/properties.rb +104 -0
- data/test/functional/lexer/syn-pred.rb +32 -0
- data/test/functional/lexer/xml.rb +206 -0
- data/test/functional/main/main-scripts.rb +245 -0
- data/test/functional/parser/actions.rb +224 -0
- data/test/functional/parser/backtracking.rb +244 -0
- data/test/functional/parser/basic.rb +282 -0
- data/test/functional/parser/calc.rb +98 -0
- data/test/functional/parser/ll-star.rb +143 -0
- data/test/functional/parser/nuances.rb +165 -0
- data/test/functional/parser/predicates.rb +103 -0
- data/test/functional/parser/properties.rb +242 -0
- data/test/functional/parser/rule-methods.rb +132 -0
- data/test/functional/parser/scopes.rb +274 -0
- data/test/functional/token-rewrite/basic.rb +318 -0
- data/test/functional/token-rewrite/via-parser.rb +100 -0
- data/test/functional/tree-parser/basic.rb +750 -0
- data/test/unit/sample-input/file-stream-1 +2 -0
- data/test/unit/sample-input/teststreams.input2 +2 -0
- data/test/unit/test-dfa.rb +52 -0
- data/test/unit/test-exceptions.rb +44 -0
- data/test/unit/test-recognizers.rb +55 -0
- data/test/unit/test-scheme.rb +62 -0
- data/test/unit/test-streams.rb +459 -0
- data/test/unit/test-tree-wizard.rb +535 -0
- data/test/unit/test-trees.rb +854 -0
- metadata +205 -0
data/samples/Cpp.g
ADDED
@@ -0,0 +1,749 @@
|
|
1
|
+
grammar Cpp;
|
2
|
+
|
3
|
+
options {
|
4
|
+
language = Ruby;
|
5
|
+
memoize = true;
|
6
|
+
output = AST;
|
7
|
+
backtrack = true;
|
8
|
+
}
|
9
|
+
|
10
|
+
tokens
|
11
|
+
{
|
12
|
+
IFDEF;
|
13
|
+
IFNDEF;
|
14
|
+
IF;
|
15
|
+
ELIF;
|
16
|
+
ELSE;
|
17
|
+
ENDIF;
|
18
|
+
WARNING;
|
19
|
+
ERROR;
|
20
|
+
PRAGMA;
|
21
|
+
EXPR;
|
22
|
+
EXPR_DEF;
|
23
|
+
EXPR_NDEF;
|
24
|
+
UNARY_MINUS;
|
25
|
+
UNARY_PLUS;
|
26
|
+
REFERANCE;
|
27
|
+
TYPECAST;
|
28
|
+
SIZEOF_TYPE;
|
29
|
+
INDEX_OP;
|
30
|
+
POST_INC;
|
31
|
+
POST_DEC;
|
32
|
+
POINTER_AT;
|
33
|
+
POINTER;
|
34
|
+
EXPR_GROUP;
|
35
|
+
METHOD_CALL;
|
36
|
+
ARGS;
|
37
|
+
TEXT_LINE;
|
38
|
+
TEXT_GROUP;
|
39
|
+
TEXT_END;
|
40
|
+
EXPAND;
|
41
|
+
EXP_ARGS;
|
42
|
+
EXP_ARG;
|
43
|
+
EXEC_MACRO;
|
44
|
+
CONCATENATE;
|
45
|
+
LINE;
|
46
|
+
INCLUDE;
|
47
|
+
INCLUDE_EXPAND;
|
48
|
+
DEFINE;
|
49
|
+
UNDEF;
|
50
|
+
MAC_OBJECT;
|
51
|
+
MAC_FUNCTION;
|
52
|
+
MAC_FUNCTION_OBJECT;
|
53
|
+
MACRO_DEFINE;
|
54
|
+
}
|
55
|
+
|
56
|
+
scope Expression {
|
57
|
+
flavor;
|
58
|
+
}
|
59
|
+
|
60
|
+
@lexer::init {
|
61
|
+
@in_directive = @in_define_mode = false
|
62
|
+
@discard_space = true
|
63
|
+
@ltoken = End
|
64
|
+
@cpp = ?X
|
65
|
+
}
|
66
|
+
|
67
|
+
@lexer::members {
|
68
|
+
def in_directive?
|
69
|
+
@in_directive
|
70
|
+
end
|
71
|
+
|
72
|
+
def in_define_mode?
|
73
|
+
@in_define_mode
|
74
|
+
end
|
75
|
+
|
76
|
+
def discard_space?
|
77
|
+
@discard_space
|
78
|
+
end
|
79
|
+
|
80
|
+
attr_reader :include_search_paths
|
81
|
+
attr_accessor :cpp
|
82
|
+
attr_accessor :ltoken
|
83
|
+
}
|
84
|
+
|
85
|
+
preprocess
|
86
|
+
: proc_line+
|
87
|
+
;
|
88
|
+
|
89
|
+
proc_line
|
90
|
+
:
|
91
|
+
( DIRECTIVE
|
92
|
+
| text_line
|
93
|
+
| diagnostics
|
94
|
+
| file_inclusion
|
95
|
+
| macro_define
|
96
|
+
| macro_undef
|
97
|
+
| conditional_compilation
|
98
|
+
| line_control
|
99
|
+
| macro_execution
|
100
|
+
)? End
|
101
|
+
;
|
102
|
+
|
103
|
+
file_inclusion
|
104
|
+
: INCLUDE -> ^(INCLUDE)
|
105
|
+
| INCLUDE_EXPAND -> ^(INCLUDE_EXPAND)
|
106
|
+
;
|
107
|
+
|
108
|
+
macro_define
|
109
|
+
: DEFINE IDENTIFIER LPAREN WS? RPAREN macro_text? -> ^(MAC_FUNCTION_OBJECT IDENTIFIER macro_text?)
|
110
|
+
| DEFINE mac=IDENTIFIER LPAREN WS? (arg+=macro_param WS? (COMMA WS* arg+=macro_param WS*)*)? RPAREN macro_text? -> ^(MAC_FUNCTION $mac $arg+ macro_text? )
|
111
|
+
| DEFINE IDENTIFIER macro_text? -> ^(MAC_OBJECT IDENTIFIER macro_text?)
|
112
|
+
;
|
113
|
+
|
114
|
+
macro_param
|
115
|
+
: IDENTIFIER ELLIPSIS ->^(ELLIPSIS IDENTIFIER)
|
116
|
+
| ELLIPSIS
|
117
|
+
| IDENTIFIER
|
118
|
+
;
|
119
|
+
|
120
|
+
macro_execution
|
121
|
+
scope Expression;
|
122
|
+
: EXEC_MACRO { $Expression::flavor = :exec}
|
123
|
+
ifexpression -> ^(EXEC_MACRO ifexpression)
|
124
|
+
;
|
125
|
+
|
126
|
+
macro_undef
|
127
|
+
: UNDEF mac=IDENTIFIER -> ^(UNDEF IDENTIFIER)
|
128
|
+
;
|
129
|
+
|
130
|
+
conditional_compilation
|
131
|
+
scope Expression;
|
132
|
+
: t=IF { $Expression::flavor = $t.text.to_sym }
|
133
|
+
ifexp+=ifexpression ifstmt+=statement
|
134
|
+
(ELIF ifexp+=ifexpression ifstmt+=statement )*
|
135
|
+
(ELSE elsestmt=statement)?
|
136
|
+
ENDIF
|
137
|
+
-> ^(IF ($ifexp $ifstmt)+ (ELSE $elsestmt)?)
|
138
|
+
;
|
139
|
+
|
140
|
+
line_control
|
141
|
+
: LINE n=DECIMAL_LITERAL (theFile=STRING_LITERAL)? ->^(LINE $n ($theFile)? )
|
142
|
+
;
|
143
|
+
|
144
|
+
diagnostics
|
145
|
+
: WARNING -> ^(WARNING)
|
146
|
+
| ERROR -> ^(ERROR)
|
147
|
+
| PRAGMA -> ^(PRAGMA)
|
148
|
+
;
|
149
|
+
|
150
|
+
text_line
|
151
|
+
: source_text+ -> ^(TEXT_LINE source_text+)
|
152
|
+
;
|
153
|
+
|
154
|
+
|
155
|
+
statement
|
156
|
+
: proc_line+
|
157
|
+
;
|
158
|
+
|
159
|
+
type_name
|
160
|
+
: IDENTIFIER
|
161
|
+
;
|
162
|
+
|
163
|
+
ifexpression
|
164
|
+
@init {
|
165
|
+
ntype =
|
166
|
+
case ($Expression::flavor rescue nil)
|
167
|
+
when :ifndef then EXPR_NDEF
|
168
|
+
when :ifdef then EXPR_DEF
|
169
|
+
else EXPR
|
170
|
+
end
|
171
|
+
}
|
172
|
+
: assignment_expression -> ^({create_token(ntype)} assignment_expression)
|
173
|
+
;
|
174
|
+
|
175
|
+
assignment_expression
|
176
|
+
: conditional_expression
|
177
|
+
( ( ASSIGNEQUAL^ | TIMESEQUAL^ | DIVIDEEQUAL^ |
|
178
|
+
MODEQUAL^ | PLUSEQUAL^ | MINUSEQUAL^ |
|
179
|
+
SHIFTLEFTEQUAL^ | SHIFTRIGHTEQUAL^ | BITWISEANDEQUAL^ |
|
180
|
+
BITWISEXOREQUAL^ | BITWISEOREQUAL^
|
181
|
+
) assignment_expression
|
182
|
+
)?
|
183
|
+
;
|
184
|
+
|
185
|
+
conditional_expression
|
186
|
+
: logical_or_expression
|
187
|
+
( QUESTIONMARK^ assignment_expression COLON conditional_expression )?
|
188
|
+
;
|
189
|
+
|
190
|
+
logical_or_expression
|
191
|
+
: logical_and_expression (OR^ logical_and_expression)*
|
192
|
+
;
|
193
|
+
|
194
|
+
logical_and_expression
|
195
|
+
: inclusive_or_expression (AND^ inclusive_or_expression)*
|
196
|
+
;
|
197
|
+
|
198
|
+
inclusive_or_expression
|
199
|
+
: exclusive_or_expression (BITWISEOR^ exclusive_or_expression)*
|
200
|
+
;
|
201
|
+
|
202
|
+
exclusive_or_expression
|
203
|
+
: and_expression (BITWISEXOR^ and_expression)*
|
204
|
+
;
|
205
|
+
|
206
|
+
and_expression
|
207
|
+
: equality_expression (AMPERSAND^ equality_expression)*
|
208
|
+
;
|
209
|
+
|
210
|
+
equality_expression
|
211
|
+
: relational_expression ((NOTEQUAL^ | EQUAL^) relational_expression)*
|
212
|
+
;
|
213
|
+
|
214
|
+
relational_expression
|
215
|
+
: shift_expression
|
216
|
+
( ( ( LESSTHAN^
|
217
|
+
| GREATERTHAN^
|
218
|
+
| LESSTHANOREQUALTO^
|
219
|
+
| GREATERTHANOREQUALTO^
|
220
|
+
)
|
221
|
+
shift_expression
|
222
|
+
)*
|
223
|
+
)
|
224
|
+
;
|
225
|
+
shift_expression
|
226
|
+
: additive_expression ((SHIFTLEFT^ | SHIFTRIGHT^) additive_expression)*
|
227
|
+
;
|
228
|
+
|
229
|
+
additive_expression
|
230
|
+
: multiplicative_expression ((PLUS^ | MINUS^) multiplicative_expression)*
|
231
|
+
;
|
232
|
+
|
233
|
+
multiplicative_expression
|
234
|
+
: unary_expression ((STAR^ | DIVIDE^ | MOD^ ) unary_expression)*
|
235
|
+
;
|
236
|
+
|
237
|
+
unary_expression
|
238
|
+
: PLUSPLUS unary_expression -> ^(PLUSPLUS unary_expression)
|
239
|
+
| MINUSMINUS unary_expression -> ^(MINUSMINUS unary_expression)
|
240
|
+
| SIZEOF unary_expression -> ^(SIZEOF unary_expression)
|
241
|
+
| SIZEOF LPAREN type_name RPAREN -> ^(SIZEOF_TYPE type_name)
|
242
|
+
| DEFINED type_name -> ^(DEFINED type_name)
|
243
|
+
| DEFINED LPAREN type_name RPAREN ->^(DEFINED type_name)
|
244
|
+
| unary_expression_not_plus_minus
|
245
|
+
;
|
246
|
+
|
247
|
+
unary_expression_not_plus_minus
|
248
|
+
: NOT unary_expression -> ^(NOT unary_expression)
|
249
|
+
| TILDE unary_expression -> ^(TILDE unary_expression)
|
250
|
+
| AMPERSAND unary_expression -> ^(REFERANCE unary_expression)
|
251
|
+
| STAR unary_expression -> ^(POINTER_AT unary_expression)
|
252
|
+
| MINUS unary_expression -> ^(UNARY_MINUS unary_expression)
|
253
|
+
| PLUS unary_expression -> ^(UNARY_PLUS unary_expression)
|
254
|
+
| LPAREN type_name RPAREN unary_expression -> ^(TYPECAST type_name unary_expression)
|
255
|
+
| postfix_expression
|
256
|
+
;
|
257
|
+
|
258
|
+
postfix_expression
|
259
|
+
: primary_expression
|
260
|
+
( l=LSQUARE^ {l.type = INDEX_OP} assignment_expression RSQUARE!
|
261
|
+
| DOT^ IDENTIFIER
|
262
|
+
| s=STAR^ {s.type = POINTER} IDENTIFIER
|
263
|
+
| POINTERTO^ IDENTIFIER
|
264
|
+
| p=PLUSPLUS^ {p.type = POST_INC}
|
265
|
+
| m=MINUSMINUS^ {m.type = POST_DEC}
|
266
|
+
)*
|
267
|
+
;
|
268
|
+
|
269
|
+
primary_expression
|
270
|
+
: (IDENTIFIER LPAREN) => function_call
|
271
|
+
| IDENTIFIER
|
272
|
+
| constant
|
273
|
+
| LPAREN assignment_expression RPAREN -> ^(EXPR_GROUP assignment_expression)
|
274
|
+
;
|
275
|
+
|
276
|
+
function_call
|
277
|
+
: id=IDENTIFIER LPAREN arg_list? RPAREN -> ^(METHOD_CALL $id arg_list?)
|
278
|
+
;
|
279
|
+
|
280
|
+
arg_list
|
281
|
+
: assignment_expression (COMMA assignment_expression)* -> ^(ARGS assignment_expression+)
|
282
|
+
;
|
283
|
+
|
284
|
+
constant
|
285
|
+
: HEX_LITERAL
|
286
|
+
| OCTAL_LITERAL
|
287
|
+
| DECIMAL_LITERAL
|
288
|
+
| CHARACTER_LITERAL
|
289
|
+
| STRING_LITERAL
|
290
|
+
| FLOATING_POINT_LITERAL
|
291
|
+
;
|
292
|
+
|
293
|
+
|
294
|
+
// | (IDENTIFIER { self.input.LT(1).getText() == '(' }?) => IDENTIFIER
|
295
|
+
source_text
|
296
|
+
: source_expression
|
297
|
+
| COMMA
|
298
|
+
| LPAREN
|
299
|
+
| RPAREN
|
300
|
+
| WS
|
301
|
+
;
|
302
|
+
|
303
|
+
macro_expansion
|
304
|
+
: id=IDENTIFIER WS? LPAREN WS? RPAREN -> ^(EXPAND $id)
|
305
|
+
| id=IDENTIFIER WS? LPAREN WS? mac_args WS? RPAREN -> ^(EXPAND $id mac_args?)
|
306
|
+
;
|
307
|
+
|
308
|
+
mac_args : marg+=m_arg ( WS? COMMA WS? marg+=m_arg)* -> ^(EXP_ARGS $marg+)
|
309
|
+
;
|
310
|
+
|
311
|
+
m_arg : source_expression+ -> ^(EXP_ARG source_expression+)
|
312
|
+
| -> ^(EXP_ARG)
|
313
|
+
;
|
314
|
+
|
315
|
+
source_expression
|
316
|
+
: (IDENTIFIER WS? LPAREN) => macro_expansion
|
317
|
+
| (primary_source WS? SHARPSHARP ) => concatenate
|
318
|
+
| STRINGIFICATION IDENTIFIER -> ^(STRINGIFICATION IDENTIFIER)
|
319
|
+
| primary_source
|
320
|
+
| STRING_OP
|
321
|
+
| SIZEOF
|
322
|
+
| LPAREN mac_args? RPAREN -> ^(TEXT_GROUP mac_args?)
|
323
|
+
| SEMICOLON
|
324
|
+
| TEXT_END
|
325
|
+
| WS
|
326
|
+
;
|
327
|
+
|
328
|
+
concatenate
|
329
|
+
: prim+=primary_source (WS? SHARPSHARP WS? prim+=primary_source)+ -> ^(CONCATENATE $prim+)
|
330
|
+
;
|
331
|
+
|
332
|
+
primary_source
|
333
|
+
: SHARPSHARP WS? IDENTIFIER -> ^(SHARPSHARP IDENTIFIER)
|
334
|
+
| IDENTIFIER
|
335
|
+
| constant
|
336
|
+
| CKEYWORD
|
337
|
+
| COPERATOR
|
338
|
+
;
|
339
|
+
|
340
|
+
STRING_OP: { @in_define_mode }? '#' WS? id=IDENTIFIER
|
341
|
+
{ self.text = $id.text}
|
342
|
+
;
|
343
|
+
|
344
|
+
DIRECTIVE
|
345
|
+
: { !@in_directive && !@in_define_mode }? '#'
|
346
|
+
{
|
347
|
+
@in_directive = true
|
348
|
+
@cpp = ?X
|
349
|
+
@discard_space = false
|
350
|
+
} WS?
|
351
|
+
( 'ifdef'
|
352
|
+
{
|
353
|
+
$type = IF
|
354
|
+
@discard_space = true
|
355
|
+
$text = "ifdef"
|
356
|
+
}
|
357
|
+
| 'ifndef'
|
358
|
+
{
|
359
|
+
$type = IF
|
360
|
+
@discard_space = true
|
361
|
+
$text = "ifndef"
|
362
|
+
}
|
363
|
+
| 'if'
|
364
|
+
{
|
365
|
+
$type = IF
|
366
|
+
@discard_space = true
|
367
|
+
$text = "if"
|
368
|
+
}
|
369
|
+
| 'elif'
|
370
|
+
{
|
371
|
+
$type = ELIF
|
372
|
+
@discard_space = true
|
373
|
+
}
|
374
|
+
| 'else'
|
375
|
+
{
|
376
|
+
$type = ELSE
|
377
|
+
@discard_space = true
|
378
|
+
}
|
379
|
+
| 'endif'
|
380
|
+
{
|
381
|
+
$type = ENDIF
|
382
|
+
@discard_space = true
|
383
|
+
}
|
384
|
+
| 'line'
|
385
|
+
{
|
386
|
+
$type = LINE
|
387
|
+
@discard_space = true
|
388
|
+
}
|
389
|
+
| 'undef' WS
|
390
|
+
{
|
391
|
+
$type = UNDEF
|
392
|
+
@discard_space = true
|
393
|
+
}
|
394
|
+
| 'define' WS
|
395
|
+
{
|
396
|
+
$type = DEFINE
|
397
|
+
@cpp = ?D
|
398
|
+
@discard_space = false
|
399
|
+
}
|
400
|
+
| 'exec_macro_expression'
|
401
|
+
{
|
402
|
+
$type = EXEC_MACRO
|
403
|
+
@discard_space = true
|
404
|
+
}
|
405
|
+
| ('include'|'include_next') WS f=IDENTIFIER
|
406
|
+
{
|
407
|
+
$type = INCLUDE_EXPAND
|
408
|
+
$text = $f.text
|
409
|
+
@discard_space = true
|
410
|
+
}
|
411
|
+
| ('include'|'include_next') WS f=INCLUDE_FILE
|
412
|
+
{
|
413
|
+
$type = INCLUDE
|
414
|
+
$text = $f.text
|
415
|
+
@discard_space = true
|
416
|
+
}
|
417
|
+
| 'warning' { $type = WARNING } m=MACRO_TEXT { $text = $m.text }
|
418
|
+
| 'error' { $type = ERROR } (m=MACRO_TEXT { $text = $m.text })?
|
419
|
+
| 'pragma' { $type = PRAGMA } m=MACRO_TEXT { $text = $m.text }
|
420
|
+
)
|
421
|
+
;
|
422
|
+
|
423
|
+
fragment MACRO_TEXT
|
424
|
+
: ( ('/*' ) => '/*' .* '*/'
|
425
|
+
| ('\\\n') => ('\\\n')
|
426
|
+
| ('\\\r\n') => ('\\\n')
|
427
|
+
| ~'\n'
|
428
|
+
) +
|
429
|
+
;
|
430
|
+
|
431
|
+
SIZEOF : 'sizeof'
|
432
|
+
;
|
433
|
+
|
434
|
+
DEFINED : 'defined'
|
435
|
+
{ $type = CKEYWORD unless @in_directive }
|
436
|
+
;
|
437
|
+
|
438
|
+
IDENTIFIER
|
439
|
+
: LETTER (LETTER|'0'..'9')*
|
440
|
+
{
|
441
|
+
if @in_directive and @cpp == ?D
|
442
|
+
if @input.peek == ?(
|
443
|
+
@cpp = ?(
|
444
|
+
else
|
445
|
+
@in_define_mode = true
|
446
|
+
@in_directive = false
|
447
|
+
@cpp = ?X
|
448
|
+
end
|
449
|
+
end
|
450
|
+
}
|
451
|
+
;
|
452
|
+
|
453
|
+
fragment
|
454
|
+
LETTER : '$'
|
455
|
+
| 'A'..'Z'
|
456
|
+
| 'a'..'z'
|
457
|
+
| '_'
|
458
|
+
;
|
459
|
+
|
460
|
+
/* Operators: */
|
461
|
+
|
462
|
+
STRINGIFICATION : '#_#_'
|
463
|
+
;
|
464
|
+
|
465
|
+
SHARPSHARP : '##';
|
466
|
+
|
467
|
+
ASSIGNEQUAL : '=' ;
|
468
|
+
|
469
|
+
COLON : ':' ;
|
470
|
+
|
471
|
+
COMMA : ',' ;
|
472
|
+
|
473
|
+
QUESTIONMARK : '?' ;
|
474
|
+
|
475
|
+
SEMICOLON : ';' ;
|
476
|
+
|
477
|
+
POINTERTO : '->' ;
|
478
|
+
|
479
|
+
LPAREN : '(' ;
|
480
|
+
|
481
|
+
RPAREN : ')'
|
482
|
+
{
|
483
|
+
if @cpp == ?( and @input.peek != ?\n
|
484
|
+
@in_define_mode = true
|
485
|
+
@in_directive = false
|
486
|
+
@cpp = ?X
|
487
|
+
end
|
488
|
+
}
|
489
|
+
;
|
490
|
+
|
491
|
+
LSQUARE : '[' ;
|
492
|
+
|
493
|
+
RSQUARE : ']' ;
|
494
|
+
|
495
|
+
LCURLY : '{' ;
|
496
|
+
|
497
|
+
RCURLY : '}' ;
|
498
|
+
|
499
|
+
EQUAL : '==';
|
500
|
+
|
501
|
+
NOTEQUAL : '!=';
|
502
|
+
|
503
|
+
LESSTHANOREQUALTO : '<=';
|
504
|
+
|
505
|
+
LESSTHAN : '<' ;
|
506
|
+
|
507
|
+
GREATERTHANOREQUALTO : '>=';
|
508
|
+
|
509
|
+
GREATERTHAN : '>' ;
|
510
|
+
|
511
|
+
DIVIDE : '/' ;
|
512
|
+
|
513
|
+
DIVIDEEQUAL : '/=';
|
514
|
+
|
515
|
+
PLUS : '+' ;
|
516
|
+
|
517
|
+
PLUSEQUAL : '+=';
|
518
|
+
|
519
|
+
PLUSPLUS : '++';
|
520
|
+
|
521
|
+
MINUS : '-' ;
|
522
|
+
|
523
|
+
MINUSEQUAL : '-=';
|
524
|
+
|
525
|
+
MINUSMINUS : '--';
|
526
|
+
|
527
|
+
STAR : '*' ;
|
528
|
+
|
529
|
+
TIMESEQUAL : '*=';
|
530
|
+
|
531
|
+
MOD : '%' ;
|
532
|
+
|
533
|
+
MODEQUAL : '%=';
|
534
|
+
|
535
|
+
SHIFTRIGHT : '>>';
|
536
|
+
|
537
|
+
SHIFTRIGHTEQUAL : '>>=';
|
538
|
+
|
539
|
+
SHIFTLEFT : '<<';
|
540
|
+
|
541
|
+
SHIFTLEFTEQUAL : '<<=';
|
542
|
+
|
543
|
+
AND : '&&';
|
544
|
+
|
545
|
+
NOT : '!' ;
|
546
|
+
|
547
|
+
OR : '||';
|
548
|
+
|
549
|
+
AMPERSAND : '&' ;
|
550
|
+
|
551
|
+
BITWISEANDEQUAL : '&=';
|
552
|
+
|
553
|
+
TILDE : '~' ;
|
554
|
+
|
555
|
+
BITWISEOR : '|' ;
|
556
|
+
|
557
|
+
BITWISEOREQUAL : '|=';
|
558
|
+
|
559
|
+
BITWISEXOR : '^' ;
|
560
|
+
|
561
|
+
BITWISEXOREQUAL : '^=';
|
562
|
+
|
563
|
+
DOT : '.' ;
|
564
|
+
|
565
|
+
POINTERTOMBR : '->*' ;
|
566
|
+
|
567
|
+
DOTMBR : '.*' ;
|
568
|
+
|
569
|
+
SCOPE : '::' ;
|
570
|
+
|
571
|
+
ELLIPSIS : '...' ;
|
572
|
+
|
573
|
+
fragment
|
574
|
+
INCLUDE_FILE
|
575
|
+
: '<' ( ' ' | '!' | '#' ..';' | '=' | '?' .. '[' | ']' .. '\u00FF')+ '>'
|
576
|
+
| '"' ( ' ' | '!' | '#' ..';' | '=' | '?' .. '[' | ']' .. '\u00FF')+ '"'
|
577
|
+
;
|
578
|
+
|
579
|
+
CHARACTER_LITERAL
|
580
|
+
: ('L')? '\'' ( EscapeSequence | ~('\''|'\\') ) '\''
|
581
|
+
;
|
582
|
+
|
583
|
+
//STRING_LITERAL: '"' (options {greedy=false;} : EscapeSequence | ~('"'))* '"'
|
584
|
+
STRING_LITERAL
|
585
|
+
: '"' (EscapeSequence | ~('"'))* '"'
|
586
|
+
;
|
587
|
+
|
588
|
+
HEX_LITERAL
|
589
|
+
: '0' ('x'|'X') HexDigit+ IntegerTypeSuffix?
|
590
|
+
;
|
591
|
+
|
592
|
+
DECIMAL_LITERAL
|
593
|
+
: ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix?
|
594
|
+
;
|
595
|
+
|
596
|
+
OCTAL_LITERAL
|
597
|
+
: '0' ('0'..'7')+ IntegerTypeSuffix?
|
598
|
+
;
|
599
|
+
|
600
|
+
fragment HexDigit
|
601
|
+
: ('0'..'9'|'a'..'f'|'A'..'F')
|
602
|
+
;
|
603
|
+
|
604
|
+
fragment IntegerTypeSuffix
|
605
|
+
: 'u' | 'ul' | 'U' | 'UL' | 'l' | 'L'
|
606
|
+
;
|
607
|
+
|
608
|
+
FLOATING_POINT_LITERAL
|
609
|
+
: ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix?
|
610
|
+
| '.' ('0'..'9')+ Exponent? FloatTypeSuffix?
|
611
|
+
| ('0'..'9')+ Exponent FloatTypeSuffix?
|
612
|
+
| ('0'..'9')+ FloatTypeSuffix
|
613
|
+
;
|
614
|
+
|
615
|
+
fragment Exponent
|
616
|
+
: ('e'|'E') ('+'|'-')? ('0'..'9')+
|
617
|
+
;
|
618
|
+
|
619
|
+
fragment FloatTypeSuffix
|
620
|
+
: ('f'|'F'|'d'|'D')
|
621
|
+
;
|
622
|
+
|
623
|
+
fragment EscapeSequence
|
624
|
+
: '\\' ('b'|'t'|'n'|'f'|'r'|'v'|'\"'|'\''|'\\')
|
625
|
+
| '\\' 'x' HexDigit+
|
626
|
+
| OctalEscape
|
627
|
+
;
|
628
|
+
|
629
|
+
fragment OctalEscape
|
630
|
+
: '\\' ('0'..'3') ('0'..'7') ('0'..'7')
|
631
|
+
| '\\' ('0'..'7') ('0'..'7')
|
632
|
+
| '\\' ('0'..'7')
|
633
|
+
;
|
634
|
+
|
635
|
+
fragment UnicodeEscape
|
636
|
+
: '\\' 'u' HexDigit HexDigit HexDigit HexDigit
|
637
|
+
;
|
638
|
+
|
639
|
+
COMMENT
|
640
|
+
: '/*' .* '*/' { $channel = HIDDEN }
|
641
|
+
| '/' '\\' '\n' '*' .* '*/' { $channel = HIDDEN }
|
642
|
+
;
|
643
|
+
|
644
|
+
LINE_COMMENT
|
645
|
+
: '//' ~('\n'|'\r')* '\r'? '\n'
|
646
|
+
{
|
647
|
+
if @in_directive
|
648
|
+
$type = End
|
649
|
+
else
|
650
|
+
case (@input.peek rescue nil)
|
651
|
+
when ?#, -1
|
652
|
+
$type = TEXT_END
|
653
|
+
else
|
654
|
+
$type = End
|
655
|
+
end
|
656
|
+
end
|
657
|
+
@in_define_mode = @in_directive = false
|
658
|
+
@discard_space = true
|
659
|
+
}
|
660
|
+
;
|
661
|
+
|
662
|
+
WS : {
|
663
|
+
c = @input.peek(-1) rescue End
|
664
|
+
c ||= End
|
665
|
+
@ltoken = c == ?\n ? End : c
|
666
|
+
}
|
667
|
+
(' '|'\r'|'\t'|'\f')+
|
668
|
+
{
|
669
|
+
if @in_directive
|
670
|
+
if @discard_space
|
671
|
+
$channel = HIDDEN
|
672
|
+
else
|
673
|
+
$type = WS
|
674
|
+
end
|
675
|
+
else
|
676
|
+
unless @in_define_mode
|
677
|
+
begin
|
678
|
+
c = @input.peek or $channel = HIDDEN
|
679
|
+
if c != EOF && c != ?# && @ltoken == End
|
680
|
+
$type = End
|
681
|
+
end
|
682
|
+
rescue
|
683
|
+
$channel = HIDDEN
|
684
|
+
end
|
685
|
+
end
|
686
|
+
end
|
687
|
+
}
|
688
|
+
;
|
689
|
+
|
690
|
+
macro_text
|
691
|
+
: source_text+ -> ^(MACRO_DEFINE source_text+)
|
692
|
+
;
|
693
|
+
|
694
|
+
End : WS? '\n'
|
695
|
+
{
|
696
|
+
if @in_directive
|
697
|
+
$type = End
|
698
|
+
else
|
699
|
+
if @in_define_mode
|
700
|
+
$type = End
|
701
|
+
else
|
702
|
+
begin
|
703
|
+
if c = @input.peek(1) and c != ?# and c != -1
|
704
|
+
$type = TEXT_END
|
705
|
+
elsif c.nil?
|
706
|
+
$type = End
|
707
|
+
end
|
708
|
+
rescue
|
709
|
+
$type = End
|
710
|
+
end
|
711
|
+
end
|
712
|
+
end
|
713
|
+
|
714
|
+
@ltoken = End
|
715
|
+
@in_directive = @in_define_mode = false
|
716
|
+
@discard_space = true
|
717
|
+
}
|
718
|
+
;
|
719
|
+
|
720
|
+
ESCAPED_NEWLINE
|
721
|
+
: ('\\\n' | '\\\r\n') { $channel = HIDDEN }
|
722
|
+
;
|
723
|
+
|
724
|
+
COPERATOR
|
725
|
+
: {!@in_directive}?
|
726
|
+
( COLON | QUESTIONMARK
|
727
|
+
| POINTERTO | LCURLY | RCURLY
|
728
|
+
| LSQUARE | RSQUARE | STAR
|
729
|
+
| EQUAL | NOTEQUAL | LESSTHANOREQUALTO | LESSTHAN
|
730
|
+
| GREATERTHANOREQUALTO | GREATERTHAN | DIVIDE | PLUSPLUS
|
731
|
+
| MINUSMINUS | MOD | SHIFTRIGHT | SHIFTLEFT
|
732
|
+
| AND | OR | BITWISEOR | BITWISEXOR
|
733
|
+
| DOT | POINTERTOMBR | DOTMBR | SCOPE
|
734
|
+
| AMPERSAND | PLUS | MINUS
|
735
|
+
| TILDE | ASSIGNEQUAL | TIMESEQUAL | DIVIDEEQUAL
|
736
|
+
| MODEQUAL | PLUSEQUAL | MINUSEQUAL | SHIFTLEFTEQUAL
|
737
|
+
| SHIFTRIGHTEQUAL | BITWISEANDEQUAL | BITWISEXOREQUAL | BITWISEOREQUAL
|
738
|
+
| NOT | ELLIPSIS
|
739
|
+
)
|
740
|
+
;
|
741
|
+
|
742
|
+
CKEYWORD: {!@in_directive}?
|
743
|
+
'typedef' | '__va_list__' | 'extern' | 'static' | 'auto' | 'register'
|
744
|
+
| 'void' | 'char' | 'short' | 'int' | 'long' | 'float'
|
745
|
+
| 'double' | 'signed' | 'unsigned' | '__fpreg' | '__float80' | 'struct'
|
746
|
+
| 'union' | 'enum' | 'const' | 'volatile' | 'case' | 'default'
|
747
|
+
| 'switch' | 'while' | 'do' | 'for' | 'goto' | 'continue'
|
748
|
+
| 'break' | 'return' | 'if' | 'else'
|
749
|
+
;
|