t033backtracking.g
来自「antlr最新版本V3源代码」· G 代码 · 共 535 行
G
535 行
grammar t033backtracking;options { language=Python; backtrack=true; memoize=true; k=2;}scope Symbols { types;}@header {# compatibility stufftry: set = set frozenset = frozensetexcept NameError: from sets import Set as set, ImmutableSet as frozensettry: reversed = reversedexcept NameError: def reversed(l): l = l[:] l.reverse() return l}@members { def isTypeName(self, name): for scope in reversed(self.Symbols_stack): if name in scope.types: return True return False}translation_unitscope Symbols; // entire file is a scope@init { $Symbols::types = set()} : external_declaration+ ;/** Either a function definition or any other kind of C decl/def. * The LL(*) analysis algorithm fails to deal with this due to * recursion in the declarator rules. I'm putting in a * manual predicate here so that we don't backtrack over * the entire function. Further, you get a better error * as errors within the function itself don't make it fail * to predict that it's a function. Weird errors previously. * Remember: the goal is to avoid backtrack like the plague * because it makes debugging, actions, and errors harder. * * Note that k=1 results in a much smaller predictor for the * fixed lookahead; k=2 made a few extra thousand lines. ;) * I'll have to optimize that in the future. */external_declarationoptions {k=1;} : ( declaration_specifiers? declarator declaration* '{' )=> function_definition | declaration ;function_definitionscope Symbols; // put parameters and locals into same scope for now@init { $Symbols::types = set()} : declaration_specifiers? declarator// ( declaration+ compound_statement // K&R style// | compound_statement // ANSI style// ) ;declarationscope { isTypedef;}@init { $declaration::isTypedef = False} : 'typedef' declaration_specifiers? {$declaration::isTypedef = True} init_declarator_list ';' // special case, looking for typedef | declaration_specifiers init_declarator_list? ';' ;declaration_specifiers : ( storage_class_specifier | type_specifier | type_qualifier )+ ;init_declarator_list : init_declarator (',' init_declarator)* ;init_declarator : declarator //('=' initializer)? ;storage_class_specifier : 'extern' | 'static' | 'auto' | 'register' ;type_specifier : 'void' | 'char' | 'short' | 'int' | 'long' | 'float' | 'double' | 'signed' | 'unsigned'// | struct_or_union_specifier// | enum_specifier | type_id ;type_id : {self.isTypeName(self.input.LT(1).getText())}? IDENTIFIER// {System.out.println($IDENTIFIER.text+" is a type");} ;// struct_or_union_specifier// options {k=3;}// scope Symbols; // structs are scopes// @init {// $Symbols::types = set()// }// : struct_or_union IDENTIFIER? '{' struct_declaration_list '}'// | struct_or_union IDENTIFIER// ;// struct_or_union// : 'struct'// | 'union'// ;// struct_declaration_list// : struct_declaration+// ;// struct_declaration// : specifier_qualifier_list struct_declarator_list ';'// ;// specifier_qualifier_list// : ( type_qualifier | type_specifier )+// ;// struct_declarator_list// : struct_declarator (',' struct_declarator)*// ;// struct_declarator// : declarator (':' constant_expression)?// | ':' constant_expression// ;// enum_specifier// options {k=3;}// : 'enum' '{' enumerator_list '}'// | 'enum' IDENTIFIER '{' enumerator_list '}'// | 'enum' IDENTIFIER// ;// enumerator_list// : enumerator (',' enumerator)*// ;// enumerator// : IDENTIFIER ('=' constant_expression)?// ;type_qualifier : 'const' | 'volatile' ;declarator : pointer? direct_declarator | pointer ;direct_declarator : ( IDENTIFIER { if len($declaration)>0 and $declaration::isTypedef: $Symbols::types.add($IDENTIFIER.text) print "define type "+$IDENTIFIER.text } | '(' declarator ')' ) declarator_suffix* ;declarator_suffix : /*'[' constant_expression ']' |*/ '[' ']'// | '(' parameter_type_list ')'// | '(' identifier_list ')' | '(' ')' ;pointer : '*' type_qualifier+ pointer? | '*' pointer | '*' ;// parameter_type_list// : parameter_list (',' '...')?// ;// parameter_list// : parameter_declaration (',' parameter_declaration)*// ;// parameter_declaration// : declaration_specifiers (declarator|abstract_declarator)*// ;// identifier_list// : IDENTIFIER (',' IDENTIFIER)*// ;// type_name// : specifier_qualifier_list abstract_declarator?// ;// abstract_declarator// : pointer direct_abstract_declarator?// | direct_abstract_declarator// ;// direct_abstract_declarator// : ( '(' abstract_declarator ')' | abstract_declarator_suffix ) abstract_declarator_suffix*// ;// abstract_declarator_suffix// : '[' ']'// | '[' constant_expression ']'// | '(' ')'// | '(' parameter_type_list ')'// ; // initializer// : assignment_expression// | '{' initializer_list ','? '}'// ;// initializer_list// : initializer (',' initializer)*// ;// // E x p r e s s i o n s// argument_expression_list// : assignment_expression (',' assignment_expression)*// ;// additive_expression// : (multiplicative_expression) ('+' multiplicative_expression | '-' multiplicative_expression)*// ;// multiplicative_expression// : (cast_expression) ('*' cast_expression | '/' cast_expression | '%' cast_expression)*// ;// cast_expression// : '(' type_name ')' cast_expression// | unary_expression// ;// unary_expression// : postfix_expression// | '++' unary_expression// | '--' unary_expression// | unary_operator cast_expression// | 'sizeof' unary_expression// | 'sizeof' '(' type_name ')'// ;// postfix_expression// : primary_expression// ( '[' expression ']'// | '(' ')'// | '(' argument_expression_list ')'// | '.' IDENTIFIER// | '*' IDENTIFIER// | '->' IDENTIFIER// | '++'// | '--'// )*// ;// unary_operator// : '&'// | '*'// | '+'// | '-'// | '~'// | '!'// ;// primary_expression// : IDENTIFIER// | constant// | '(' expression ')'// ;// constant// : HEX_LITERAL// | OCTAL_LITERAL// | DECIMAL_LITERAL// | CHARACTER_LITERAL// | STRING_LITERAL// | FLOATING_POINT_LITERAL// ;// /////// expression// : assignment_expression (',' assignment_expression)*// ;// constant_expression// : conditional_expression// ;// assignment_expression// : lvalue assignment_operator assignment_expression// | conditional_expression// ; // lvalue// : unary_expression// ;// assignment_operator// : '='// | '*='// | '/='// | '%='// | '+='// | '-='// | '<<='// | '>>='// | '&='// | '^='// | '|='// ;// conditional_expression// : logical_or_expression ('?' expression ':' conditional_expression)?// ;// logical_or_expression// : logical_and_expression ('||' logical_and_expression)*// ;// logical_and_expression// : inclusive_or_expression ('&&' inclusive_or_expression)*// ;// inclusive_or_expression// : exclusive_or_expression ('|' exclusive_or_expression)*// ;// exclusive_or_expression// : and_expression ('^' and_expression)*// ;// and_expression// : equality_expression ('&' equality_expression)*// ;// equality_expression// : relational_expression (('=='|'!=') relational_expression)*// ;// relational_expression// : shift_expression (('<'|'>'|'<='|'>=') shift_expression)*// ;// shift_expression// : additive_expression (('<<'|'>>') additive_expression)*// ;// // S t a t e m e n t s// statement// : labeled_statement// | compound_statement// | expression_statement// | selection_statement// | iteration_statement// | jump_statement// ;// labeled_statement// : IDENTIFIER ':' statement// | 'case' constant_expression ':' statement// | 'default' ':' statement// ;// compound_statement// scope Symbols; // blocks have a scope of symbols// @init {// $Symbols::types = {}// }// : '{' declaration* statement_list? '}'// ;// statement_list// : statement+// ;// expression_statement// : ';'// | expression ';'// ;// selection_statement// : 'if' '(' expression ')' statement (options {k=1; backtrack=false;}:'else' statement)?// | 'switch' '(' expression ')' statement// ;// iteration_statement// : 'while' '(' expression ')' statement// | 'do' statement 'while' '(' expression ')' ';'// | 'for' '(' expression_statement expression_statement expression? ')' statement// ;// jump_statement// : 'goto' IDENTIFIER ';'// | 'continue' ';'// | 'break' ';'// | 'return' ';'// | 'return' expression ';'// ;IDENTIFIER : LETTER (LETTER|'0'..'9')* ; fragmentLETTER : '$' | 'A'..'Z' | 'a'..'z' | '_' ;CHARACTER_LITERAL : '\'' ( EscapeSequence | ~('\''|'\\') ) '\'' ;STRING_LITERAL : '"' ( EscapeSequence | ~('\\'|'"') )* '"' ;HEX_LITERAL : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ;DECIMAL_LITERAL : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;OCTAL_LITERAL : '0' ('0'..'7')+ IntegerTypeSuffix? ;fragmentHexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;fragmentIntegerTypeSuffix : ('u'|'U')? ('l'|'L') | ('u'|'U') ('l'|'L')? ;FLOATING_POINT_LITERAL : ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix? | '.' ('0'..'9')+ Exponent? FloatTypeSuffix? | ('0'..'9')+ Exponent FloatTypeSuffix? | ('0'..'9')+ Exponent? FloatTypeSuffix ;fragmentExponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;fragmentFloatTypeSuffix : ('f'|'F'|'d'|'D') ;fragmentEscapeSequence : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') | OctalEscape ;fragmentOctalEscape : '\\' ('0'..'3') ('0'..'7') ('0'..'7') | '\\' ('0'..'7') ('0'..'7') | '\\' ('0'..'7') ;fragmentUnicodeEscape : '\\' 'u' HexDigit HexDigit HexDigit HexDigit ;WS : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;} ;COMMENT : '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;} ;LINE_COMMENT : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} ;// ignore #line info for nowLINE_COMMAND : '#' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} ;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?