1

我是 Antlr 的新手,在这一点上我真的很迷茫。ANTLRWorks 的经典示例(我的版本是 1.5)似乎不起作用。

在这里,我在 Expr.g 中的主要代码:

grammar Expr;

@header {
package test;
import java.util.HashMap;
}

@lexer::header {package test;}

@members {
/** Map variable name to Integer object holding value */
HashMap memory = new HashMap();
}

prog:   stat+ ;

stat:   expr NEWLINE {System.out.println($expr.value);}
    |   ID '=' expr NEWLINE
        {memory.put($ID.text, new Integer($expr.value));}
    |   NEWLINE
    ;

expr returns [int value]
    :   e=multExpr {$value = $e.value;}
        (   '+' e=multExpr {$value += $e.value;}
        |   '-' e=multExpr {$value -= $e.value;}
        )*
    ;

multExpr returns [int value]
    :   e=atom {$value = $e.value;} ('*' e=atom {$value *= $e.value;})*
    ; 

atom returns [int value]
    :   INT {$value = Integer.parseInt($INT.text);}
    |   ID
        {
        Integer v = (Integer)memory.get($ID.text);
        if ( v!=null ) $value = v.intValue();
        else System.err.println("undefined variable "+$ID.text);
        }
    |   '(' e=expr ')' {$value = $e.value;}
    ;

ID  :   ('a'..'z'|'A'..'Z')+ ;
INT :   '0'..'9'+ ;
NEWLINE:'\r'? '\n' ;
WS  :   (' '|'\t')+ {skip();} ;

在尝试调试它时,我在控制台中遇到了这个错误:

[04:43:42] C:\Users\GreyZ0mbie\Documents\output\ExprParser.java:91: error: <identifier> expected
[04:43:42]  public final void prog() throws  {
[04:43:42]                                 ^
[04:43:42] C:\Users\GreyZ0mbie\Documents\output\ExprParser.java:171: error: <identifier> expected
[04:43:42]  public final void stat() throws  {
[04:43:42]                                 ^
[04:43:42] C:\Users\GreyZ0mbie\Documents\output\ExprParser.java:297: error: <identifier> expected
[04:43:42]  public final int expr() throws  {
[04:43:42]                                ^
[04:43:42] C:\Users\GreyZ0mbie\Documents\output\ExprParser.java:401: error: <identifier> expected
[04:43:42]  public final int multExpr() throws  {
[04:43:42]                                    ^
[04:43:42] C:\Users\GreyZ0mbie\Documents\output\ExprParser.java:488: error: <identifier> expected
[04:43:42]  public final int atom() throws  {
[04:43:42]                                ^
[04:43:42] 5 errors

我认为,这个问题可能出在程序版本或 Java 版本中(来自站点的最后一个 Java)。最不幸的是,我刚刚开始使用该程序,根本无法解决这个错误。

4

2 回答 2

3

请切换到 AntlrWorks 1.4.3,

http://antlr3.org/download/

我遇到了与 AntlrWorks 1.5 生成此类损坏的 Java 文件完全相同的错误。

(更新:上面的链接不再有效。您可以从 Google Code 下载)

  1. 使用网络浏览器,例如 Google Chrome。
  2. 转到http://code.google.com/p/fast-el/source/browse/trunk/lib/antlrworks-1.4.3.jar?r=86
  3. 右键单击查看原始文件链接,然后选择将链接另存为...以将此文件保存为 antlrworks-1.4.3.jar。
于 2013-04-08T02:24:34.380 回答
2

这是 ANTLRWorks 1.5 中的一个错误,它只影响 ANTLRWorks 的调试功能,并且已经在下一个版本中修复。
#5:ANTLRworks 无法生成正确的 Java 代码

于 2013-04-09T19:51:23.400 回答