ANTLR Tree Grammar -> Generated java class has errors (getText) -
when generate tree parser, errors says method gettext() undefined type object. can't enter whole class here since 500000 characters.
but these similar error lines is
public int specialstatetransition(int s, intstream _input) throws noviablealtexception { treenodestream input = (treenodestream)_input; int _s = s; switch ( s ) { case 0 : int la3_11 = input.la(1); int index3_11 = input.index(); input.rewind(); s = -1; if ( ((synpred5_walker()&&(istypename(input.lt(1).gettext())))) ) {s = 1;} else if ( (true) ) {s = 8;} input.seek(index3_11); if ( s>=0 ) return s; break; case 1 : int la3_16 = input.la(1); int index3_16 = input.index(); input.rewind(); s = -1; if ( ((synpred5_walker()&&(istypename(input.lt(1).gettext())))) ) {s = 1;} else if ( (true) ) {s = 8;} input.seek(index3_16); if ( s>=0 ) return s; break; case 2 : int la3_20 = input.la(1); int index3_20 = input.index(); input.rewind(); s = -1; if ( ((synpred5_walker()&&(istypename(input.lt(1).gettext())))) ) {s = 1;} else if ( (true) ) {s = 8;} input.seek(index3_20); if ( s>=0 ) return s; break; case 3 : int la3_22 = input.la(1); int index3_22 = input.index(); input.rewind(); s = -1; if ( ((synpred5_walker()&&(istypename(input.lt(1).gettext())))) ) {s = 1;} else if ( (true) ) {s = 8;} input.seek(index3_22); if ( s>=0 ) return s; break; case 4 : int la3_23 = input.la(1); int index3_23 = input.index(); input.rewind(); s = -1; if ( ((synpred5_walker()&&(istypename(input.lt(1).gettext())))) ) {s = 1;} else if ( (true) ) {s = 8;} input.seek(index3_23); if ( s>=0 ) return s; break; case 5 : int la3_24 = input.la(1); int index3_24 = input.index(); input.rewind(); s = -1; if ( ((synpred5_walker()&&(istypename(input.lt(1).gettext())))) ) {s = 1;} else if ( (true) ) {s = 8;} input.seek(index3_24); if ( s>=0 ) return s; break; case 6 : int la3_25 = input.la(1); int index3_25 = input.index(); input.rewind(); s = -1; if ( ((synpred5_walker()&&(istypename(input.lt(1).gettext())))) ) {s = 1;} else if ( (true) ) {s = 8;} input.seek(index3_25); if ( s>=0 ) return s; break; case 7 : int la3_26 = input.la(1); int index3_26 = input.index(); input.rewind(); s = -1; if ( ((synpred5_walker()&&(istypename(input.lt(1).gettext())))) ) {s = 1;} else if ( (true) ) {s = 8;} input.seek(index3_26); if ( s>=0 ) return s; break; case 8 : int la3_27 = input.la(1); int index3_27 = input.index(); input.rewind(); s = -1; if ( ((synpred5_walker()&&(istypename(input.lt(1).gettext())))) ) {s = 1;} else if ( (true) ) {s = 8;} input.seek(index3_27); if ( s>=0 ) return s; break; } if (state.backtracking>0) {state.failed=true; return -1;} noviablealtexception nvae = new noviablealtexception(getdescription(), 3, _s, input); error(nvae); throw nvae; } } my tree grammar
tree grammar walker; options { tokenvocab = c2p; astlabeltype = commontree; backtrack=true; output=ast; } @header { package com.frankdaniel.compiler ; } translation_unit : external_declaration+ ; external_declaration options {k=1;} : (declaration_specifiers? declarator declaration* l_c_bracket! )=> function_definition //-> external_declarator function_definition | declaration ; function_definition : declaration_specifiers? declarator (declaration+ compound_statement|compound_statement) //-> ^(functiondef declaration_specifiers? declarator (declaration+ compound_statement|compound_statement)) ; declaration : 'typedef' declaration_specifiers? init_declarator_list semicolon! // special case, looking typedef | declaration_specifiers init_declarator_list? semicolon! ; declaration_specifiers : ( storage_class_specifier | type_specifier | type_qualifier )+ ; init_declarator_list : ^(init_declarator_list init_declarator+) ; init_declarator : declarator (assign^ initializer)? ; storage_class_specifier : extern | static | auto | register ; type_specifier : void | char | int | float | type_id ; type_id : identifier // {system.out.println($identifier.text+" type");} ; type_qualifier : const ; declarator : pointer? direct_declarator | pointer ; direct_declarator : (identifier|lparen! declarator rparen!) declarator_suffix* ; declarator_suffix : constant_expression | rbracket! lbracket! | parameter_type_list | identifier_list | lparen! rparen! ; pointer : times type_qualifier+ pointer? | times pointer | times ; parameter_type_list : parameter_list ; parameter_list : ^(parameter_list parameter_declaration) ; parameter_declaration : declaration_specifiers (declarator|abstract_declarator)* ; identifier_list : ^(identifier_list identifier+) ; type_name : specifier_qualifier_list abstract_declarator? ; specifier_qualifier_list : ( type_qualifier | type_specifier )+ ; abstract_declarator : pointer direct_abstract_declarator? | direct_abstract_declarator ; direct_abstract_declarator : ( lparen! abstract_declarator rparen | abstract_declarator_suffix ) abstract_declarator_suffix* ; abstract_declarator_suffix : rbracket! lbracket! | constant_expression | lparen! rparen! | parameter_type_list ; initializer : assignment_expression | initializer_list ; initializer_list : ^(initializer_list initializer+) ; // expressions argument_expression_list : ^(expression_list assignment_expression+) ; multiplicative_expression : (cast_expression) (times^ cast_expression | div^ cast_expression | mod^ cast_expression)* ; additive_expression : (multiplicative_expression) (plus^ multiplicative_expression | minus^ multiplicative_expression)* ; cast_expression : ^(cast_expression type_name cast_expression) | unary_expression ; unary_expression : postfix_expression | pplus unary_expression | mminus unary_expression | unary_operator cast_expression ; postfix_expression : primary_expression ( rbracket! expression lbracket! | lparen! rparen! | lparen! argument_expression_list rparen! | dot! identifier // | pplus // | mminus )* ; unary_operator : bitwiseand | times | plus | minus | not ; primary_expression : identifier | constant | expression ; constant : hex_literal | octal_literal | decimal_literal | character_literal | string_literal | floating_point_literal ; expression : ^(expression assignment_expression+) ; constant_expression : conditional_expression ; assignment_expression :^(assignment_operator lvalue assignment_expression) | conditional_expression ; lvalue : unary_expression ; assignment_operator : assign ; conditional_expression : logical_or_expression (questionmark! expression colon! conditional_expression)? ; logical_or_expression : logical_and_expression (or^ logical_and_expression)* ; logical_and_expression : inclusive_or_expression (and^ 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 ((equal|nonequal)^ relational_expression)* ; relational_expression : shift_expression ((st|gt|steq|gteq)^ shift_expression)* ; shift_expression : additive_expression ((lshift|rshift)^ additive_expression)* ; // statements 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 : ^(statement declaration* statement_list? ) ; statement_list : statement+ ; expression_statement : expression ; selection_statement :if^ lparen! expression rparen! i=statement (else^ e=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 expression?) ; the test file
int main(void) { int n; int i; int flag; printf("enter value of n > "); scanf("%d", &n); flag = 1; (i=2; (i<(n/2)) && flag; ) { /* may not need test values of greater square root of n? */ if ((n % i) == 0) /* if true n divisible */ flag = 0; else i=i+1; } if (flag) printf("%d prime\n", n); else printf("%d has %d factor\n", n, i); return 0; } the error
compiler\walker.g: node after line 3:4 mismatched tree node: parameter_list expecting semicolon compiler\walker.g: node after line 3:9 mismatched tree node: expecting semicolon compiler\walker.g: node line 5:2 mismatched tree node: int expecting semicolon compiler\walker.g: node line 6:2 mismatched tree node: int expecting semicolon compiler\walker.g: node after line 6:6 mismatched tree node: expecting semicolon compiler\walker.g: node after line 8:2 mismatched tree node: expression_list expecting semicolon compiler\walker.g: node after line 9:2 mismatched tree node: expression_list expecting semicolon compiler\walker.g: node after line 9:15 mismatched tree node: expecting semicolon compiler\walker.g: node line 10:9 mismatched tree node: 1 expecting semicolon compiler\walker.g: node line 11:9 mismatched tree node: 2 expecting semicolon compiler\walker.g: node after line 11:13 mismatched tree node: expression expecting semicolon compiler\walker.g: node line 11:18 mismatched tree node: 2 expecting semicolon compiler\walker.g: node after line 11:25 mismatched tree node: expecting semicolon compiler\walker.g: node after line 13:13 mismatched tree node: expecting semicolon compiler\walker.g: node line 14:13 mismatched tree node: 0 expecting semicolon compiler\walker.g: node line 16:9 mismatched tree node: + expecting semicolon compiler\walker.g: node line 16:10 mismatched tree node: 1 expecting semicolon compiler\walker.g: node after line 19:6 mismatched tree node: expecting semicolon compiler\walker.g: node after line 20:4 mismatched tree node: expression_list expecting semicolon compiler\walker.g: node after line 20:28 mismatched tree node: expecting semicolon compiler\walker.g: node after line 22:4 mismatched tree node: expression_list expecting semicolon compiler\walker.g: node after line 22:41 mismatched tree node: expecting semicolon
you need specify ast node type. if unspecified, default used in generated code object.
options { astlabeltype=commontree; }
Comments
Post a Comment