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