向规则添加自定义属性



在ANTLR中:有一个简单的例子吗?,一个关于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'

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

排 当地人 [ 数组列表单元格 = 空 ] : A B { $cells = $A; } ;

我想使用 @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);
  }
  ;

相关内容

  • 没有找到相关文章

最新更新