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