【问题标题】:ANTLR - Synthesized and inherited attributesANTLR - 综合和继承的属性
【发布时间】: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

我知道错误在哪里,但我不知道如何解决它们。有人向我解释出了什么问题,我该如何解决?非常感谢

【问题讨论】:

    标签: antlr grammar


    【解决方案1】:

    问题在于您的exprterm 规则。

    1. expr 中,您尝试分配$exprP.i 而不仅仅是传递参数。它应该如下所示。

      expr returns [int val]
          : term exprP[$term.val]     { $val = $exprP.val; }
          ;
      
    2. expr 中,您尝试分配$termP.i 而不仅仅是传递参数。它应该如下所示。

      term returns [int val]
          : fact termP[$fact.val]     { $val = $termpP.val; }
          ;
      

    我认为 ANTLR 3 的较新版本(3.5.2 是最新版本)在为这些错误提供行号和列号方面做得更好,但这可能是 ANTLR 4 的新功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-23
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多