2013-02-07 64 views
4

我一直在使用ANTLRwork 1.5以及antlr runtime 3.5。下面是我发现了一个奇怪的事情: ANTLR的是产生这种java代码对我来说:ANTLR生成无效的java异常抛出代码

public final BLABLABLAParser.addExpression_return addExpression() throws { 
    blablabla... 
} 

注意,此函数抛出什么,这是Java无效。所以我需要手动纠正这些错误。

任何人都知道为什么?

这里是示例语法,它直接取自书语言实现模式

// 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?)// E.g., "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;} 
    ; 
+0

您可能有一个无效的语法。你能发布你的产生这个无效代码的语法吗? –

+0

以上是发布的语法。这几乎与“语言实现模式”中的语法相同 – tylaar

+2

我试过使用antlrworks 1.4.2,并且此错误消失了。我认为这是antlrworks 1.5的一个缺陷 – tylaar

回答

1

编辑:这是已经被固定在下一版本ANTLRWorks 1.5的bug。
#5: ANTLRworks fails to generate proper Java Code

我用上面描述的确切配置和复制/粘贴语法。您提到的规则生成的签名如下:

// $ANTLR start "addExpression" 
// C:\\dev\\Cymbol.g:72:1: addExpression : postfixExpression ('+'^postfixExpression)* ; 
public final CymbolParser.addExpression_return addExpression() throws RecognitionException { 

您可以发布生成的文件的第一行吗?它应该从// $ANTLR 3.5开始,如下所示:

// $ANTLR 3.5 C:\\dev\\Cymbol.g 2013-02-13 09:55:44