These days I use ANTLRwork 1.5 along with antlr runtime 3.5. Here is the strange thing I found: Antlr generates such java code for me:
public final BLABLABLAParser.addExpression_return addExpression() throws { blablabla... }
note that this function does not throw anything and it is not valid in java. Therefore, I need to fix these errors manually.
Does anyone know why?
Here is an example grammar, it is directly taken from the templates of the language implementation of the book.
// START: header // START: header grammar Cymbol; // my grammar is called Cymbol options { output = AST; ASTLabelType = CommonTree; } tokens{ METHOD_DECL; ARG_DECL; BLOCK; VAR_DECL; CALL; ELIST; EXPR; } // define a SymbolTable field in generated parser compilationUnit // pass symbol table to start rule : (methodDeclaration | varDeclaration)+ // recognize at least one variable declaration ; // END: header methodDeclaration : type ID '(' formalParameters? ')' block -> ^(METHOD_DECL type ID formalParameters? block) ; formalParameters : type ID (',' type ID)* -> ^(ARG_DECL type ID)+ ; // START: type type : 'float' | 'int' | 'void' ; // END: type block : '{' statement* '}' -> ^(BLOCK statement*) ; // START: decl varDeclaration : type ID ('=' expression)? ';' -> ^(VAR_DECL type ID expression?)// Eg, "int i = 2;", "int i;" ; // END: decl statement : block | varDeclaration | 'return' expression? ';' -> ^('return' expression?) | postfixExpression ( '=' expression -> ^('=' postfixExpression expression) | -> ^(EXPR postfixExpression) ) ';' ; expressionList : expression(',' expression)* -> ^(ELIST expression+) | -> ELIST ; expression : addExpression -> ^(EXPR addExpression) ; addExpression : postfixExpression('+'^ postfixExpression)* ; postfixExpression : primary (lp='('^ expressionList ')'! {$lp.setType(CALL);})* ; // START: primary primary : ID // reference variable in an expression | INT | '(' expression ')' -> expression ; // END: primary // LEXER RULES ID : LETTER (LETTER | '0'..'9')* ; fragment LETTER : ('a'..'z' | 'A'..'Z') ; INT : '0'..'9'+ ; WS : (' '|'\r'|'\t'|'\n') {$channel=HIDDEN;} ; SL_COMMENT : '//' ~('\r'|'\n')* '\r'? '\n' {$channel=HIDDEN;} ;
source share