Antlr 向规则添加自定义属性

Antlr 向规则添加自定义属性,antlr,antlr4,Antlr,Antlr4,在关于antlr3的问题中,公认的答案有以下语法: grammar Exp; eval returns [double value] : exp=additionExp {$value = $exp.value;} ; additionExp returns [double value] : m1=multiplyExp {$value = $m1.value;} ( '+' m2=multiplyExp {$value

在关于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
属性向上传递解析树中的信息

我想在第四天做同样的事情。似乎不再存在
$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);
  }
  ;

我想使用
@init
返回值来代替
局部变量

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);
  }
  ;
行返回[java.util.ArrayList单元格]
@初始化{
java.util.ArrayList单元格=null;
}
:部分行分隔符
{
$cells=$partial_row.cells;
}
;
部分_行返回[java.util.ArrayListArrayList单元格]
@初始化{
java.util.ArrayListStarrayList单元格=null;
}
:单元格
{ 
$cells=new java.util.ArrayList();
$cells.add($Cell.text);
}
|部分行单元
{
$cells=$partial_row.cells;
$cells.add($Cell.text);
}
;

我想你是在寻找“回报”,而不是本地人。这也应该行得通。我的测试工作:

划船 当地人[ ArrayList单元格=null ] :A B { $cells=$A; }
;

局部变量[]
的范围仅限于一条规则<代码>返回[]
使用相同的语法,但这些声明对调用规则可见。请注意,由于自动生成的侦听器ams访问接口可用于将语法本身与其他特定语言的逻辑分离,因此在ANTLR 4中不再推荐这两种语言。@280Z28:我没有看到任何关于侦听器臂的提及。你能给我一些他们的文档吗?我指的是听众和访客,但我把打字或打电话搞砸了。很抱歉。
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);
  }
  ;