【问题标题】:Add custom attributes to rules将自定义属性添加到规则
【发布时间】:2013-10-12 23:35:02
【问题描述】:

ANTLR: Is there a simple example?,一个关于antlr3的问题,接受的答案有这样的语法:

grammar Exp;

eval returns [double value]
    :    exp=additionExp {$value = $exp.value;}
    ;

additionExp returns [double value]
    :    m1=multiplyExp       {$value =  $m1.value;} 
         ( '+' m2=multiplyExp {$value += $m2.value;} 
         | '-' m2=multiplyExp {$value -= $m2.value;}
         )* 
    ;

multiplyExp returns [double value]
    :    a1=atomExp       {$value =  $a1.value;}
         ( '*' a2=atomExp {$value *= $a2.value;} 
         | '/' a2=atomExp {$value /= $a2.value;}
         )* 
    ;

atomExp returns [double value]
    :    n=Number                {$value = Double.parseDouble($n.text);}
    |    '(' exp=additionExp ')' {$value = $exp.value;}
    ;

Number
    :    ('0'..'9')+ ('.' ('0'..'9')+)?
    ;

WS  
    :   (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;}

它使用$value 属性将信息向上传递到解析树。

我想做同样的事情 antlr4。看起来$value 属性不再存在。如何向规则添加自定义属性以将信息向上传递到解析树?如果这不是完成我想要的正确机制,那么有什么机制可以完成类似的事情?


我尝试使用本地人,像这样:

/* Store each row in an ArrayList */
row
  locals [
  ArrayList<String> cells = null
  ]
  : partial_row RowSeparator
  {
    $cells = $partial_row.cells;
  }
  ;

partial_row
  locals [
    ArrayList<String> cells = null
  ]
  : Cell
  { 
    $cells = new java.util.ArrayList<String>();
    $cells.add($Cell.text);
  }
  | partial_row Cell
  {
    $cells = $partial_row.cells;
    $cells.add($Cell.text);
  }
  ;

但这不起作用,给我这个错误:

error(65): csce322a1p2.g:70:24: unknown attribute 'cells' for rule 'partial_row' in '$partial_row.cells'

【问题讨论】:

  • locals[] 的范围为单个规则。 returns[] 使用相同的语法,但这些声明将对调用规则可见。请注意,由于自动生成的监听器 ams 访问者接口可用于将语法本身与其他特定于语言的逻辑分离,因此在 ANTLR 4 中不再推荐使用这些方法。
  • @280Z28:我还没有看到任何关于听众手臂的提及。你能给我一些他们的文件吗?
  • 我的意思是听众访问者,但我在打字或手机上搞砸了。对此感到抱歉。

标签: antlr antlr4


【解决方案1】:

我认为您正在寻找“回报”而不是当地人。这也应该有效。我的测试有效:

行 当地人 [ ArrayList 单元格 = null ] : 乙 { $细胞 = $A; } ;

【讨论】:

    【解决方案2】:

    我想使用@initreturns,而不是locals

    row returns [java.util.ArrayList<String> cells]
      @init {
        java.util.ArrayList<String> cells = null;
      }
      : partial_row RowSeparator
      {
        $cells = $partial_row.cells;
      }
      ;
    
    partial_row returns [java.util.ArrayListArrayList<String> cells]
      @init {
      java.util.ArrayListArrayList<String> cells = null;
      }
      : Cell
      { 
        $cells = new java.util.ArrayList<String>();
        $cells.add($Cell.text);
      }
      | partial_row Cell
      {
        $cells = $partial_row.cells;
        $cells.add($Cell.text);
      }
      ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 2014-10-30
      • 2016-05-23
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      相关资源
      最近更新 更多