我是 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)。最不幸的是,我刚刚开始使用该程序,根本无法解决这个错误。