]>
Commit | Line | Data |
---|---|---|
c60377d7 FB |
1 | /* @file\r |
2 | This file is used to be the grammar file of ECC tool\r | |
3 | \r | |
4 | Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r | |
2e351cbe | 5 | SPDX-License-Identifier: BSD-2-Clause-Patent\r |
c60377d7 FB |
6 | */\r |
7 | \r | |
8 | \r | |
9 | grammar C;\r | |
10 | options {\r | |
11 | language=Python;\r | |
12 | }\r | |
13 | \r | |
14 | \r | |
15 | @header {\r | |
16 | ## @file\r | |
17 | # The file defines the parser for C source files.\r | |
18 | #\r | |
19 | # THIS FILE IS AUTO-GENENERATED. PLEASE DON NOT MODIFY THIS FILE.\r | |
20 | # This file is generated by running:\r | |
21 | # java org.antlr.Tool C.g\r | |
22 | #\r | |
23 | # Copyright (c) 2009 - 2010, Intel Corporation All rights reserved.\r | |
24 | #\r | |
25 | # This program and the accompanying materials are licensed and made available\r | |
26 | # under the terms and conditions of the BSD License which accompanies this\r | |
27 | # distribution. The full text of the license may be found at:\r | |
28 | # http://opensource.org/licenses/bsd-license.php\r | |
29 | #\r | |
30 | # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
31 | # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
32 | #\r | |
33 | ##\r | |
34 | \r | |
35 | import Ecc.CodeFragment as CodeFragment\r | |
36 | import Ecc.FileProfile as FileProfile\r | |
37 | }\r | |
38 | \r | |
39 | @members {\r | |
40 | \r | |
41 | def printTokenInfo(self, line, offset, tokenText):\r | |
42 | print(str(line)+ ',' + str(offset) + ':' + str(tokenText))\r | |
43 | \r | |
44 | def StorePredicateExpression(self, StartLine, StartOffset, EndLine, EndOffset, Text):\r | |
45 | PredExp = CodeFragment.PredicateExpression(Text, (StartLine, StartOffset), (EndLine, EndOffset))\r | |
46 | FileProfile.PredicateExpressionList.append(PredExp)\r | |
47 | \r | |
48 | def StoreEnumerationDefinition(self, StartLine, StartOffset, EndLine, EndOffset, Text):\r | |
49 | EnumDef = CodeFragment.EnumerationDefinition(Text, (StartLine, StartOffset), (EndLine, EndOffset))\r | |
50 | FileProfile.EnumerationDefinitionList.append(EnumDef)\r | |
51 | \r | |
52 | def StoreStructUnionDefinition(self, StartLine, StartOffset, EndLine, EndOffset, Text):\r | |
53 | SUDef = CodeFragment.StructUnionDefinition(Text, (StartLine, StartOffset), (EndLine, EndOffset))\r | |
54 | FileProfile.StructUnionDefinitionList.append(SUDef)\r | |
55 | \r | |
56 | def StoreTypedefDefinition(self, StartLine, StartOffset, EndLine, EndOffset, FromText, ToText):\r | |
57 | Tdef = CodeFragment.TypedefDefinition(FromText, ToText, (StartLine, StartOffset), (EndLine, EndOffset))\r | |
58 | FileProfile.TypedefDefinitionList.append(Tdef)\r | |
59 | \r | |
60 | def StoreFunctionDefinition(self, StartLine, StartOffset, EndLine, EndOffset, ModifierText, DeclText, LeftBraceLine, LeftBraceOffset, DeclLine, DeclOffset):\r | |
61 | FuncDef = CodeFragment.FunctionDefinition(ModifierText, DeclText, (StartLine, StartOffset), (EndLine, EndOffset), (LeftBraceLine, LeftBraceOffset), (DeclLine, DeclOffset))\r | |
62 | FileProfile.FunctionDefinitionList.append(FuncDef)\r | |
63 | \r | |
64 | def StoreVariableDeclaration(self, StartLine, StartOffset, EndLine, EndOffset, ModifierText, DeclText):\r | |
65 | VarDecl = CodeFragment.VariableDeclaration(ModifierText, DeclText, (StartLine, StartOffset), (EndLine, EndOffset))\r | |
66 | FileProfile.VariableDeclarationList.append(VarDecl)\r | |
67 | \r | |
68 | def StoreFunctionCalling(self, StartLine, StartOffset, EndLine, EndOffset, FuncName, ParamList):\r | |
69 | FuncCall = CodeFragment.FunctionCalling(FuncName, ParamList, (StartLine, StartOffset), (EndLine, EndOffset))\r | |
70 | FileProfile.FunctionCallingList.append(FuncCall)\r | |
71 | \r | |
72 | }\r | |
73 | \r | |
74 | translation_unit\r | |
75 | : external_declaration*\r | |
76 | ;\r | |
77 | \r | |
78 | \r | |
79 | external_declaration\r | |
80 | : ( declaration_specifiers? declarator declaration* '{' )\r | |
81 | | function_definition\r | |
82 | | declaration\r | |
83 | | macro_statement (';')?\r | |
84 | ;\r | |
85 | \r | |
86 | function_definition\r | |
87 | locals [String ModifierText = '', String DeclText = '', int LBLine = 0, int LBOffset = 0, int DeclLine = 0, int DeclOffset = 0]\r | |
88 | @init {\r | |
89 | ModifierText = '';\r | |
90 | DeclText = '';\r | |
91 | LBLine = 0;\r | |
92 | LBOffset = 0;\r | |
93 | DeclLine = 0;\r | |
94 | DeclOffset = 0;\r | |
95 | }\r | |
96 | @after{\r | |
97 | self.StoreFunctionDefinition(localctx.start.line, localctx.start.column, localctx.stop.line, localctx.stop.column, ModifierText, DeclText, LBLine, LBOffset, DeclLine, DeclOffset)\r | |
98 | }\r | |
99 | : d=declaration_specifiers? declarator\r | |
100 | ( declaration+ a=compound_statement // K&R style\r | |
101 | | b=compound_statement // ANSI style\r | |
102 | ) {\r | |
103 | if localctx.d != None:\r | |
104 | ModifierText = $declaration_specifiers.text\r | |
105 | else:\r | |
106 | ModifierText = ''\r | |
107 | DeclText = $declarator.text\r | |
108 | DeclLine = $declarator.start.line\r | |
109 | DeclOffset = $declarator.start.column\r | |
110 | if localctx.a != None:\r | |
111 | LBLine = $a.start.line\r | |
112 | LBOffset = $a.start.column\r | |
113 | else:\r | |
114 | LBLine = $b.start.line\r | |
115 | LBOffset = $b.start.column\r | |
116 | }\r | |
117 | ;\r | |
118 | \r | |
119 | \r | |
120 | declaration_specifiers\r | |
121 | : ( storage_class_specifier\r | |
122 | | type_specifier\r | |
123 | | type_qualifier\r | |
124 | )+\r | |
125 | ;\r | |
126 | \r | |
127 | declaration\r | |
128 | : a='typedef' b=declaration_specifiers? c=init_declarator_list d=';'\r | |
129 | {\r | |
130 | if localctx.b is not None:\r | |
131 | self.StoreTypedefDefinition(localctx.a.line, localctx.a.column, $d.line, localctx.d.column, $b.text, $c.text)\r | |
132 | else:\r | |
133 | self.StoreTypedefDefinition(localctx.a.line, localctx.a.column, $d.line, localctx.d.column, '', $c.text)\r | |
134 | }\r | |
135 | | s=declaration_specifiers t=init_declarator_list? e=';'\r | |
136 | {\r | |
137 | if localctx.t is not None:\r | |
138 | self.StoreVariableDeclaration($s.start.line, $s.start.column, $t.start.line, $t.start.column, $s.text, $t.text)\r | |
139 | }\r | |
140 | ;\r | |
141 | \r | |
142 | init_declarator_list\r | |
143 | : init_declarator (',' init_declarator)*\r | |
144 | ;\r | |
145 | \r | |
146 | init_declarator\r | |
147 | : declarator ('=' initializer)?\r | |
148 | ;\r | |
149 | \r | |
150 | storage_class_specifier\r | |
151 | : 'extern'\r | |
152 | | 'static'\r | |
153 | | 'auto'\r | |
154 | | 'register'\r | |
155 | | 'STATIC'\r | |
156 | ;\r | |
157 | \r | |
158 | type_specifier\r | |
159 | : 'void'\r | |
160 | | 'char'\r | |
161 | | 'short'\r | |
162 | | 'int'\r | |
163 | | 'long'\r | |
164 | | 'float'\r | |
165 | | 'double'\r | |
166 | | 'signed'\r | |
167 | | 'unsigned'\r | |
168 | | s=struct_or_union_specifier\r | |
169 | {\r | |
170 | if localctx.s.stop is not None:\r | |
171 | self.StoreStructUnionDefinition($s.start.line, $s.start.column, $s.stop.line, $s.stop.column, $s.text)\r | |
172 | }\r | |
173 | | e=enum_specifier\r | |
174 | {\r | |
175 | if localctx.e.stop is not None:\r | |
176 | self.StoreEnumerationDefinition($e.start.line, $e.start.column, $e.stop.line, $e.stop.column, $e.text)\r | |
177 | }\r | |
178 | | (IDENTIFIER type_qualifier* declarator)\r | |
179 | | type_id\r | |
180 | ;\r | |
181 | \r | |
182 | type_id\r | |
183 | : IDENTIFIER\r | |
184 | //{self.printTokenInfo($a.line, $a.pos, $a.text)}\r | |
185 | ;\r | |
186 | \r | |
187 | struct_or_union_specifier\r | |
188 | : struct_or_union IDENTIFIER? '{' struct_declaration_list '}'\r | |
189 | | struct_or_union IDENTIFIER\r | |
190 | ;\r | |
191 | \r | |
192 | struct_or_union\r | |
193 | : 'struct'\r | |
194 | | 'union'\r | |
195 | ;\r | |
196 | \r | |
197 | struct_declaration_list\r | |
198 | : struct_declaration+\r | |
199 | ;\r | |
200 | \r | |
201 | struct_declaration\r | |
202 | : specifier_qualifier_list struct_declarator_list ';'\r | |
203 | ;\r | |
204 | \r | |
205 | specifier_qualifier_list\r | |
206 | : ( type_qualifier | type_specifier )+\r | |
207 | ;\r | |
208 | \r | |
209 | struct_declarator_list\r | |
210 | : struct_declarator (',' struct_declarator)*\r | |
211 | ;\r | |
212 | \r | |
213 | struct_declarator\r | |
214 | : declarator (':' constant_expression)?\r | |
215 | | ':' constant_expression\r | |
216 | ;\r | |
217 | \r | |
218 | enum_specifier\r | |
219 | : 'enum' '{' enumerator_list ','? '}'\r | |
220 | | 'enum' IDENTIFIER '{' enumerator_list ','? '}'\r | |
221 | | 'enum' IDENTIFIER\r | |
222 | ;\r | |
223 | \r | |
224 | enumerator_list\r | |
225 | : enumerator (',' enumerator)*\r | |
226 | ;\r | |
227 | \r | |
228 | enumerator\r | |
229 | : IDENTIFIER ('=' constant_expression)?\r | |
230 | ;\r | |
231 | \r | |
232 | type_qualifier\r | |
233 | : 'const'\r | |
234 | | 'volatile'\r | |
235 | | 'IN'\r | |
236 | | 'OUT'\r | |
237 | | 'OPTIONAL'\r | |
238 | | 'CONST'\r | |
239 | | 'UNALIGNED'\r | |
240 | | 'VOLATILE'\r | |
241 | | 'GLOBAL_REMOVE_IF_UNREFERENCED'\r | |
242 | | 'EFIAPI'\r | |
243 | | 'EFI_BOOTSERVICE'\r | |
244 | | 'EFI_RUNTIMESERVICE'\r | |
245 | | 'PACKED'\r | |
246 | ;\r | |
247 | \r | |
248 | declarator\r | |
249 | : pointer? ('EFIAPI')? ('EFI_BOOTSERVICE')? ('EFI_RUNTIMESERVICE')? direct_declarator\r | |
250 | // | ('EFIAPI')? ('EFI_BOOTSERVICE')? ('EFI_RUNTIMESERVICE')? pointer? direct_declarator\r | |
251 | | pointer\r | |
252 | ;\r | |
253 | \r | |
254 | direct_declarator\r | |
255 | : IDENTIFIER declarator_suffix*\r | |
256 | | '(' ('EFIAPI')? declarator ')' declarator_suffix+\r | |
257 | ;\r | |
258 | \r | |
259 | declarator_suffix\r | |
260 | : '[' constant_expression ']'\r | |
261 | | '[' ']'\r | |
262 | | '(' parameter_type_list ')'\r | |
263 | | '(' identifier_list ')'\r | |
264 | | '(' ')'\r | |
265 | ;\r | |
266 | \r | |
267 | pointer\r | |
268 | : '*' type_qualifier+ pointer?\r | |
269 | | '*' pointer\r | |
270 | | '*'\r | |
271 | ;\r | |
272 | \r | |
273 | parameter_type_list\r | |
274 | : parameter_list (',' ('OPTIONAL')? '...')?\r | |
275 | ;\r | |
276 | \r | |
277 | parameter_list\r | |
278 | : parameter_declaration (',' ('OPTIONAL')? parameter_declaration)*\r | |
279 | ;\r | |
280 | \r | |
281 | parameter_declaration\r | |
282 | : declaration_specifiers (declarator|abstract_declarator)* ('OPTIONAL')?\r | |
283 | //accomerdate user-defined type only, no declarator follow.\r | |
284 | | pointer* IDENTIFIER\r | |
285 | ;\r | |
286 | \r | |
287 | identifier_list\r | |
288 | : IDENTIFIER\r | |
289 | (',' IDENTIFIER)*\r | |
290 | ;\r | |
291 | \r | |
292 | type_name\r | |
293 | : specifier_qualifier_list abstract_declarator?\r | |
294 | | type_id\r | |
295 | ;\r | |
296 | \r | |
297 | abstract_declarator\r | |
298 | : pointer direct_abstract_declarator?\r | |
299 | | direct_abstract_declarator\r | |
300 | ;\r | |
301 | \r | |
302 | direct_abstract_declarator\r | |
303 | : ( '(' abstract_declarator ')' | abstract_declarator_suffix ) abstract_declarator_suffix*\r | |
304 | ;\r | |
305 | \r | |
306 | abstract_declarator_suffix\r | |
307 | : '[' ']'\r | |
308 | | '[' constant_expression ']'\r | |
309 | | '(' ')'\r | |
310 | | '(' parameter_type_list ')'\r | |
311 | ;\r | |
312 | \r | |
313 | initializer\r | |
314 | \r | |
315 | : assignment_expression\r | |
316 | | '{' initializer_list ','? '}'\r | |
317 | ;\r | |
318 | \r | |
319 | initializer_list\r | |
320 | : initializer (',' initializer )*\r | |
321 | ;\r | |
322 | \r | |
323 | // E x p r e s s i o n s\r | |
324 | \r | |
325 | argument_expression_list\r | |
326 | : assignment_expression ('OPTIONAL')? (',' assignment_expression ('OPTIONAL')?)*\r | |
327 | ;\r | |
328 | \r | |
329 | additive_expression\r | |
330 | : (multiplicative_expression) ('+' multiplicative_expression | '-' multiplicative_expression)*\r | |
331 | ;\r | |
332 | \r | |
333 | multiplicative_expression\r | |
334 | : (cast_expression) ('*' cast_expression | '/' cast_expression | '%' cast_expression)*\r | |
335 | ;\r | |
336 | \r | |
337 | cast_expression\r | |
338 | : '(' type_name ')' cast_expression\r | |
339 | | unary_expression\r | |
340 | ;\r | |
341 | \r | |
342 | unary_expression\r | |
343 | : postfix_expression\r | |
344 | | '++' unary_expression\r | |
345 | | '--' unary_expression\r | |
346 | | unary_operator cast_expression\r | |
347 | | 'sizeof' unary_expression\r | |
348 | | 'sizeof' '(' type_name ')'\r | |
349 | ;\r | |
350 | \r | |
351 | postfix_expression\r | |
352 | locals [FuncCallText='']\r | |
353 | @init\r | |
354 | {\r | |
355 | self.FuncCallText=''\r | |
356 | }\r | |
357 | : p=primary_expression {self.FuncCallText += $p.text}\r | |
358 | ( '[' expression ']'\r | |
359 | | '(' a=')'{self.StoreFunctionCalling($p.start.line, $p.start.column, $a.line, localctx.a.column, self.FuncCallText, '')}\r | |
360 | | '(' c=argument_expression_list b=')' {self.StoreFunctionCalling($p.start.line, $p.start.column, $b.line, localctx.b.column, self.FuncCallText, $c.text)}\r | |
361 | | '(' macro_parameter_list ')'\r | |
362 | | '.' x=IDENTIFIER {self.FuncCallText += '.' + $x.text}\r | |
363 | | '*' y=IDENTIFIER {self.FuncCallText = $y.text}\r | |
364 | | '->' z=IDENTIFIER {self.FuncCallText += '->' + $z.text}\r | |
365 | | '++'\r | |
366 | | '--'\r | |
367 | )*\r | |
368 | ;\r | |
369 | \r | |
370 | macro_parameter_list\r | |
371 | : parameter_declaration (',' parameter_declaration)*\r | |
372 | ;\r | |
373 | \r | |
374 | unary_operator\r | |
375 | : '&'\r | |
376 | | '*'\r | |
377 | | '+'\r | |
378 | | '-'\r | |
379 | | '~'\r | |
380 | | '!'\r | |
381 | ;\r | |
382 | \r | |
383 | primary_expression\r | |
384 | : IDENTIFIER\r | |
385 | | constant\r | |
386 | | '(' expression ')'\r | |
387 | ;\r | |
388 | \r | |
389 | constant\r | |
390 | : HEX_LITERAL\r | |
391 | | OCTAL_LITERAL\r | |
392 | | DECIMAL_LITERAL\r | |
393 | | CHARACTER_LITERAL\r | |
394 | | (IDENTIFIER* STRING_LITERAL+)+ IDENTIFIER*\r | |
395 | | FLOATING_POINT_LITERAL\r | |
396 | ;\r | |
397 | \r | |
398 | /////\r | |
399 | \r | |
400 | expression\r | |
401 | : assignment_expression (',' assignment_expression)*\r | |
402 | ;\r | |
403 | \r | |
404 | constant_expression\r | |
405 | : conditional_expression\r | |
406 | ;\r | |
407 | \r | |
408 | assignment_expression\r | |
409 | : lvalue assignment_operator assignment_expression\r | |
410 | | conditional_expression\r | |
411 | ;\r | |
412 | \r | |
413 | lvalue\r | |
414 | : unary_expression\r | |
415 | ;\r | |
416 | \r | |
417 | assignment_operator\r | |
418 | : '='\r | |
419 | | '*='\r | |
420 | | '/='\r | |
421 | | '%='\r | |
422 | | '+='\r | |
423 | | '-='\r | |
424 | | '<<='\r | |
425 | | '>>='\r | |
426 | | '&='\r | |
427 | | '^='\r | |
428 | | '|='\r | |
429 | ;\r | |
430 | \r | |
431 | conditional_expression\r | |
432 | : e=logical_or_expression ('?' expression ':' conditional_expression {self.StorePredicateExpression($e.start.line, $e.start.column, $e.stop.line, $e.stop.column, $e.text)})?\r | |
433 | ;\r | |
434 | \r | |
435 | logical_or_expression\r | |
436 | : logical_and_expression ('||' logical_and_expression)*\r | |
437 | ;\r | |
438 | \r | |
439 | logical_and_expression\r | |
440 | : inclusive_or_expression ('&&' inclusive_or_expression)*\r | |
441 | ;\r | |
442 | \r | |
443 | inclusive_or_expression\r | |
444 | : exclusive_or_expression ('|' exclusive_or_expression)*\r | |
445 | ;\r | |
446 | \r | |
447 | exclusive_or_expression\r | |
448 | : and_expression ('^' and_expression)*\r | |
449 | ;\r | |
450 | \r | |
451 | and_expression\r | |
452 | : equality_expression ('&' equality_expression)*\r | |
453 | ;\r | |
454 | equality_expression\r | |
455 | : relational_expression (('=='|'!=') relational_expression )*\r | |
456 | ;\r | |
457 | \r | |
458 | relational_expression\r | |
459 | : shift_expression (('<'|'>'|'<='|'>=') shift_expression)*\r | |
460 | ;\r | |
461 | \r | |
462 | shift_expression\r | |
463 | : additive_expression (('<<'|'>>') additive_expression)*\r | |
464 | ;\r | |
465 | \r | |
466 | // S t a t e m e n t s\r | |
467 | \r | |
468 | statement\r | |
469 | : labeled_statement\r | |
470 | | compound_statement\r | |
471 | | expression_statement\r | |
472 | | selection_statement\r | |
473 | | iteration_statement\r | |
474 | | jump_statement\r | |
475 | | macro_statement\r | |
476 | | asm2_statement\r | |
477 | | asm1_statement\r | |
478 | | asm_statement\r | |
479 | | declaration\r | |
480 | ;\r | |
481 | \r | |
482 | asm2_statement\r | |
483 | : '__asm__'? IDENTIFIER '(' (~(';'))* ')' ';'\r | |
484 | ;\r | |
485 | \r | |
486 | asm1_statement\r | |
487 | : '_asm' '{' (~('}'))* '}'\r | |
488 | ;\r | |
489 | \r | |
490 | asm_statement\r | |
491 | : '__asm' '{' (~('}'))* '}'\r | |
492 | ;\r | |
493 | \r | |
494 | macro_statement\r | |
495 | : IDENTIFIER '(' declaration* statement_list? expression? ')'\r | |
496 | ;\r | |
497 | \r | |
498 | labeled_statement\r | |
499 | : IDENTIFIER ':' statement\r | |
500 | | 'case' constant_expression ':' statement\r | |
501 | | 'default' ':' statement\r | |
502 | ;\r | |
503 | \r | |
504 | compound_statement\r | |
505 | : '{' declaration* statement_list? '}'\r | |
506 | ;\r | |
507 | \r | |
508 | statement_list\r | |
509 | : statement+\r | |
510 | ;\r | |
511 | \r | |
512 | expression_statement\r | |
513 | : ';'\r | |
514 | | expression ';'\r | |
515 | ;\r | |
516 | \r | |
517 | selection_statement\r | |
518 | : 'if' '(' e=expression ')' {self.StorePredicateExpression($e.start.line, $e.start.column, $e.stop.line, $e.stop.column, $e.text)} statement (:'else' statement)?\r | |
519 | | 'switch' '(' expression ')' statement\r | |
520 | ;\r | |
521 | \r | |
522 | iteration_statement\r | |
523 | : 'while' '(' e=expression ')' statement {self.StorePredicateExpression($e.start.line, $e.start.column, $e.stop.line, $e.stop.column, $e.text)}\r | |
524 | | 'do' statement 'while' '(' e=expression ')' ';' {self.StorePredicateExpression($e.start.line, $e.start.column, $e.stop.line, $e.stop.column, $e.text)}\r | |
525 | //| 'for' '(' expression_statement e=expression_statement expression? ')' statement {self.StorePredicateExpression($e.start.line, $e.start.column, $e.stop.line, $e.stop.column, $e.text)}\r | |
526 | ;\r | |
527 | \r | |
528 | jump_statement\r | |
529 | : 'goto' IDENTIFIER ';'\r | |
530 | | 'continue' ';'\r | |
531 | | 'break' ';'\r | |
532 | | 'return' ';'\r | |
533 | | 'return' expression ';'\r | |
534 | ;\r | |
535 | \r | |
536 | IDENTIFIER\r | |
537 | : LETTER (LETTER|'0'..'9')*\r | |
538 | ;\r | |
539 | \r | |
540 | fragment\r | |
541 | LETTER\r | |
542 | : '$'\r | |
543 | | 'A'..'Z'\r | |
544 | | 'a'..'z'\r | |
545 | | '_'\r | |
546 | ;\r | |
547 | \r | |
548 | CHARACTER_LITERAL\r | |
549 | : ('L')? '\'' ( EscapeSequence | ~('\''|'\\') ) '\''\r | |
550 | ;\r | |
551 | \r | |
552 | STRING_LITERAL\r | |
553 | : ('L')? '"' ( EscapeSequence | ~('\\'|'"') )* '"'\r | |
554 | ;\r | |
555 | \r | |
556 | HEX_LITERAL : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ;\r | |
557 | \r | |
558 | DECIMAL_LITERAL : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;\r | |
559 | \r | |
560 | OCTAL_LITERAL : '0' ('0'..'7')+ IntegerTypeSuffix? ;\r | |
561 | \r | |
562 | fragment\r | |
563 | HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;\r | |
564 | \r | |
565 | fragment\r | |
566 | IntegerTypeSuffix\r | |
567 | : ('u'|'U')\r | |
568 | | ('l'|'L')\r | |
569 | | ('u'|'U') ('l'|'L')\r | |
570 | | ('u'|'U') ('l'|'L') ('l'|'L')\r | |
571 | ;\r | |
572 | \r | |
573 | FLOATING_POINT_LITERAL\r | |
574 | : ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix?\r | |
575 | | '.' ('0'..'9')+ Exponent? FloatTypeSuffix?\r | |
576 | | ('0'..'9')+ Exponent FloatTypeSuffix?\r | |
577 | | ('0'..'9')+ Exponent? FloatTypeSuffix\r | |
578 | ;\r | |
579 | \r | |
580 | fragment\r | |
581 | Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;\r | |
582 | \r | |
583 | fragment\r | |
584 | FloatTypeSuffix : ('f'|'F'|'d'|'D') ;\r | |
585 | \r | |
586 | fragment\r | |
587 | EscapeSequence\r | |
588 | : '\\' ('b'|'t'|'n'|'f'|'r'|'\''|'\\')\r | |
589 | | OctalEscape\r | |
590 | ;\r | |
591 | \r | |
592 | fragment\r | |
593 | OctalEscape\r | |
594 | : '\\' ('0'..'3') ('0'..'7') ('0'..'7')\r | |
595 | | '\\' ('0'..'7') ('0'..'7')\r | |
596 | | '\\' ('0'..'7')\r | |
597 | ;\r | |
598 | \r | |
599 | fragment\r | |
600 | UnicodeEscape\r | |
601 | : '\\' 'u' HexDigit HexDigit HexDigit HexDigit\r | |
602 | ;\r | |
603 | \r | |
604 | WS : (' '|'\r'|'\t'|'\u000C'|'\n')\r | |
605 | -> channel(HIDDEN)\r | |
606 | ;\r | |
607 | \r | |
608 | // ingore '\' of line concatenation\r | |
609 | BS : ('\\')\r | |
610 | -> channel(HIDDEN)\r | |
611 | ;\r | |
612 | \r | |
613 | UnicodeVocabulary\r | |
614 | : '\u0003'..'\uFFFE'\r | |
615 | ;\r | |
616 | \r | |
617 | COMMENT\r | |
618 | : '/*' .*? '*/'\r | |
619 | -> channel(HIDDEN)\r | |
620 | ;\r | |
621 | \r | |
622 | LINE_COMMENT\r | |
623 | : '//' ~('\n'|'\r')* '\r'? '\n'\r | |
624 | -> channel(HIDDEN)\r | |
625 | ;\r | |
626 | \r | |
627 | // ignore #line info for now\r | |
628 | LINE_COMMAND\r | |
629 | : '#' ~('\n'|'\r')* '\r'? '\n'\r | |
630 | -> channel(HIDDEN)\r | |
631 | ;\r |