【发布时间】:2014-03-30 21:22:59
【问题描述】:
我有一个简单的语法,我必须适当地注意特定的 ANTLR 来实现算术表达式的求值器。
语法:
start ::= expr
expr ::= term exprp
exprp ::= + term exprp
| - term exprp
| e
term ::= fact termp
termp ::= * fact termp
| / fact termp
| e
fact ::= ( expr ) | ID | NUM
带有属性的语法:
start ::= expr
expr ::= term {exprp.i = term.val} exprp {expr.val = exprp.val}
exprp ::= + term {exprp1.i = exprp.i + term.val} exprp1 {exprp.val = exprp1.val}
| - term {exprp1.i = exprp.i - term.val} exprp1 {exprp.val = exprp1.val}
| e {exprp.val = exprp.i}
term ::= fact {termp.i = fact.val} termp {term.val = termp.val}
termp ::= * fact {termp1.i = termp.i * fact.val} termp1 {termp.val = termp1.val}
| / fact {termp1.i = termp.i/fact.val} termp1 {termp.val = termp1.val}
| e {termp.val = termp.i}
fact ::= ( expr ) {fact.val = expr.val}
| NUM {fact.val = Integer.parseInt(NUM.text)}
这是我写的:
grammar Expr;
start
: expr EOF { System.out.println($expr.val); }
;
expr returns [int val]
: term exprP[$exprP.i = $term.val] { $val = $exprP.val; }
;
exprP[int i] returns [int val]
: { $val = $i; }
| '+' term e = exprP[$i + $term.val] { $val = $e.val; }
| '-' term e = exprP[$i - $term.val] { $val = $e.val; }
;
term returns [int val]
: fact termP[$termP.i = $fact.val] { $val = $termpP.val; }
;
termP[int i] returns [int val]
: { $val = $i; }
| '*' fact e = termP[$i * $fact.val] { $val = $e.val; }
| '/' fact e = termP[$i / $fact.val] { $val = $e.val; }
;
fact returns [int val]
: '(' expr ')' { $val = $expr.val; }
| NUM { $val = Integer.parseInt($NUM.text); }
;
ID : ('a'.. 'z'|'A'.. 'Z') ('a'.. 'z'|'A'.. 'Z'|'0'.. '9'|'_')* ;
NUM : '0'.. '9'+ ;
WS : (' ' | '\t' | '\r' | '\n')+ { skip (); } ;
但是当我使用命令调用 ANTLR 工具时:
java -cp antlr-3.5-complete.jar org.antlr.Tool Expr.g
有以下错误:
error(115): II.2/Expr.g:0:: cannot access rule exprP's parameter: i
error(115): II.2/Expr.g:0:: cannot access rule termP's parameter: i
我知道错误在哪里,但我不知道如何解决它们。有人向我解释出了什么问题,我该如何解决?非常感谢
【问题讨论】: