Sync EDKII BaseTools to BaseTools project r1903.
[efi/edk2/.git] / edk2 / BaseTools / Source / Python / Ecc / C.g
1 /* @file\r
2  This file is used to be the grammar file of ECC tool\r
3 \r
4  Copyright (c) 2009 - 2010, Intel Corporation\r
5  All rights reserved. This program and the accompanying materials\r
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
13 \r
14 grammar C;\r
15 options {\r
16     language=Python;\r
17     backtrack=true;\r
18     memoize=true;\r
19     k=2;\r
20 }\r
21 \r
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
43 @header {\r
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
63 import CodeFragment\r
64 import FileProfile\r
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
102 translation_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
114 external_declaration\r
115 options {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
126 function_definition\r
127 scope {\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
166 declaration\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
182 declaration_specifiers\r
183         :   (   storage_class_specifier\r
184                 |   type_specifier\r
185         |   type_qualifier\r
186         )+\r
187         ;\r
188 \r
189 init_declarator_list\r
190         : init_declarator (',' init_declarator)*\r
191         ;\r
192 \r
193 init_declarator\r
194         : declarator ('=' initializer)? \r
195         ;\r
196 \r
197 storage_class_specifier\r
198         : 'extern'\r
199         | 'static'\r
200         | 'auto'\r
201         | 'register'\r
202         | 'STATIC'\r
203         ;\r
204 \r
205 type_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
228 type_id\r
229     :   IDENTIFIER\r
230         //{self.printTokenInfo($a.line, $a.pos, $a.text)}\r
231     ;\r
232 \r
233 struct_or_union_specifier\r
234 options {k=3;}\r
235         : struct_or_union IDENTIFIER? '{' struct_declaration_list '}'\r
236         | struct_or_union IDENTIFIER\r
237         ;\r
238 \r
239 struct_or_union\r
240         : 'struct'\r
241         | 'union'\r
242         ;\r
243 \r
244 struct_declaration_list\r
245         : struct_declaration+\r
246         ;\r
247 \r
248 struct_declaration\r
249         : specifier_qualifier_list struct_declarator_list ';'\r
250         ;\r
251 \r
252 specifier_qualifier_list\r
253         : ( type_qualifier | type_specifier )+\r
254         ;\r
255 \r
256 struct_declarator_list\r
257         : struct_declarator (',' struct_declarator)*\r
258         ;\r
259 \r
260 struct_declarator\r
261         : declarator (':' constant_expression)?\r
262         | ':' constant_expression\r
263         ;\r
264 \r
265 enum_specifier\r
266 options {k=3;}\r
267         : 'enum' '{' enumerator_list ','? '}'\r
268         | 'enum' IDENTIFIER '{' enumerator_list ','? '}'\r
269         | 'enum' IDENTIFIER\r
270         ;\r
271 \r
272 enumerator_list\r
273         : enumerator (',' enumerator)*\r
274         ;\r
275 \r
276 enumerator\r
277         : IDENTIFIER ('=' constant_expression)?\r
278         ;\r
279 \r
280 type_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
293         | 'PACKED'\r
294         ;\r
295 \r
296 declarator\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
302 direct_declarator\r
303         : IDENTIFIER declarator_suffix*\r
304         | '(' ('EFIAPI')? declarator ')' declarator_suffix+\r
305         ;\r
306 \r
307 declarator_suffix\r
308         :   '[' constant_expression ']'\r
309     |   '[' ']'\r
310     |   '(' parameter_type_list ')'\r
311     |   '(' identifier_list ')'\r
312     |   '(' ')'\r
313         ;\r
314 \r
315 pointer\r
316         : '*' type_qualifier+ pointer?\r
317         | '*' pointer\r
318         | '*'\r
319         ;\r
320 \r
321 parameter_type_list\r
322         : parameter_list (',' ('OPTIONAL')? '...')?\r
323         ;\r
324 \r
325 parameter_list\r
326         : parameter_declaration (',' ('OPTIONAL')? parameter_declaration)*\r
327         ;\r
328 \r
329 parameter_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
335 identifier_list\r
336         : IDENTIFIER\r
337         (',' IDENTIFIER)*\r
338         ;\r
339 \r
340 type_name\r
341         : specifier_qualifier_list abstract_declarator?\r
342         | type_id\r
343         ;\r
344 \r
345 abstract_declarator\r
346         : pointer direct_abstract_declarator?\r
347         | direct_abstract_declarator\r
348         ;\r
349 \r
350 direct_abstract_declarator\r
351         :       ( '(' abstract_declarator ')' | abstract_declarator_suffix ) abstract_declarator_suffix*\r
352         ;\r
353 \r
354 abstract_declarator_suffix\r
355         :       '[' ']'\r
356         |       '[' constant_expression ']'\r
357         |       '(' ')'\r
358         |       '(' parameter_type_list ')'\r
359         ;\r
360         \r
361 initializer\r
362 \r
363         : assignment_expression\r
364         | '{' initializer_list ','? '}'\r
365         ;\r
366 \r
367 initializer_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
373 argument_expression_list\r
374         :   assignment_expression ('OPTIONAL')? (',' assignment_expression ('OPTIONAL')?)*\r
375         ;\r
376 \r
377 additive_expression\r
378         : (multiplicative_expression) ('+' multiplicative_expression | '-' multiplicative_expression)*\r
379         ;\r
380 \r
381 multiplicative_expression\r
382         : (cast_expression) ('*' cast_expression | '/' cast_expression | '%' cast_expression)*\r
383         ;\r
384 \r
385 cast_expression\r
386         : '(' type_name ')' cast_expression\r
387         | unary_expression\r
388         ;\r
389 \r
390 unary_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
399 postfix_expression\r
400 scope {\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
419 macro_parameter_list\r
420         : parameter_declaration (',' parameter_declaration)*\r
421         ;\r
422 \r
423 unary_operator\r
424         : '&'\r
425         | '*'\r
426         | '+'\r
427         | '-'\r
428         | '~'\r
429         | '!'\r
430         ;\r
431 \r
432 primary_expression\r
433         : IDENTIFIER\r
434         | constant\r
435         | '(' expression ')'\r
436         ;\r
437 \r
438 constant\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
449 expression\r
450         : assignment_expression (',' assignment_expression)*\r
451         ;\r
452 \r
453 constant_expression\r
454         : conditional_expression\r
455         ;\r
456 \r
457 assignment_expression\r
458         : lvalue assignment_operator assignment_expression\r
459         | conditional_expression\r
460         ;\r
461         \r
462 lvalue\r
463         :       unary_expression\r
464         ;\r
465 \r
466 assignment_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
480 conditional_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
484 logical_or_expression\r
485         : logical_and_expression ('||' logical_and_expression)*\r
486         ;\r
487 \r
488 logical_and_expression\r
489         : inclusive_or_expression ('&&' inclusive_or_expression)*\r
490         ;\r
491 \r
492 inclusive_or_expression\r
493         : exclusive_or_expression ('|' exclusive_or_expression)*\r
494         ;\r
495 \r
496 exclusive_or_expression\r
497         : and_expression ('^' and_expression)*\r
498         ;\r
499 \r
500 and_expression\r
501         : equality_expression ('&' equality_expression)*\r
502         ;\r
503 equality_expression\r
504         : relational_expression (('=='|'!=') relational_expression )*\r
505         ;\r
506 \r
507 relational_expression\r
508         : shift_expression (('<'|'>'|'<='|'>=') shift_expression)*\r
509         ;\r
510 \r
511 shift_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
517 statement\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
531 asm2_statement\r
532         : '__asm__'? IDENTIFIER '(' (~(';'))* ')' ';'\r
533         ;\r
534         \r
535 asm1_statement\r
536         : '_asm' '{' (~('}'))* '}'\r
537         ;\r
538 \r
539 asm_statement\r
540         : '__asm' '{' (~('}'))* '}'\r
541         ;\r
542         \r
543 macro_statement\r
544         : IDENTIFIER '(' declaration*  statement_list? expression? ')'\r
545         ;\r
546         \r
547 labeled_statement\r
548         : IDENTIFIER ':' statement\r
549         | 'case' constant_expression ':' statement\r
550         | 'default' ':' statement\r
551         ;\r
552 \r
553 compound_statement\r
554         : '{' declaration* statement_list? '}'\r
555         ;\r
556 \r
557 statement_list\r
558         : statement+\r
559         ;\r
560 \r
561 expression_statement\r
562         : ';'\r
563         | expression ';'\r
564         ;\r
565 \r
566 selection_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
571 iteration_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
577 jump_statement\r
578         : 'goto' IDENTIFIER ';'\r
579         | 'continue' ';'\r
580         | 'break' ';'\r
581         | 'return' ';'\r
582         | 'return' expression ';'\r
583         ;\r
584 \r
585 IDENTIFIER\r
586         :       LETTER (LETTER|'0'..'9')*\r
587         ;\r
588         \r
589 fragment\r
590 LETTER\r
591         :       '$'\r
592         |  'A'..'Z'\r
593         |  'a'..'z'\r
594         |       '_'\r
595         ;\r
596 \r
597 CHARACTER_LITERAL\r
598     :   ('L')? '\'' ( EscapeSequence | ~('\''|'\\') ) '\''\r
599     ;\r
600 \r
601 STRING_LITERAL\r
602     :  ('L')? '"' ( EscapeSequence | ~('\\'|'"') )* '"'\r
603     ;\r
604     \r
605 HEX_LITERAL : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ;\r
606 \r
607 DECIMAL_LITERAL : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;\r
608 \r
609 OCTAL_LITERAL : '0' ('0'..'7')+ IntegerTypeSuffix? ;\r
610 \r
611 fragment\r
612 HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;\r
613 \r
614 fragment\r
615 IntegerTypeSuffix\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
622 FLOATING_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
629 fragment\r
630 Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;\r
631 \r
632 fragment\r
633 FloatTypeSuffix : ('f'|'F'|'d'|'D') ;\r
634 \r
635 fragment\r
636 EscapeSequence\r
637     :  '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')\r
638     |   OctalEscape\r
639     ;\r
640 \r
641 fragment\r
642 OctalEscape\r
643     :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')\r
644     |   '\\' ('0'..'7') ('0'..'7')\r
645     |   '\\' ('0'..'7')\r
646     ;\r
647 \r
648 fragment\r
649 UnicodeEscape\r
650     :   '\\' 'u' HexDigit HexDigit HexDigit HexDigit\r
651     ;\r
652 \r
653 WS  :  (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}\r
654     ;\r
655 \r
656 // ingore '\' of line concatenation\r
657 BS  : ('\\') {$channel=HIDDEN;}\r
658     ;\r
659     \r
660 // ingore function modifiers\r
661 //FUNC_MODIFIERS  : 'EFIAPI' {$channel=HIDDEN;}\r
662 //    ;\r
663         \r
664 UnicodeVocabulary\r
665     : '\u0003'..'\uFFFE'\r
666     ;\r
667 COMMENT\r
668     :   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}\r
669     ;\r
670 \r
671 \r
672 LINE_COMMENT\r
673     : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}\r
674     ;\r
675 \r
676 // ignore #line info for now\r
677 LINE_COMMAND \r
678     : '#' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}\r
679     ;\r