Migration 将语法文件升级到Antlr4

Migration 将语法文件升级到Antlr4,migration,grammar,antlr4,Migration,Grammar,Antlr4,我正在将我的Antlr语法文件升级到最新的Antlr4 我已经转换了文件的大部分内容,但仍然存在语法上的差异,我无法理解。这三个区别是: equationset: equation* EOF!; equation: variable ASSIGN expression -> ^(EQUATION variable expression) ; orExpression : andExpression ( OR^ andExpression )* ; 在第一个示例中,错误是由

我正在将我的Antlr语法文件升级到最新的Antlr4

我已经转换了文件的大部分内容,但仍然存在语法上的差异,我无法理解。这三个区别是:

equationset:    equation* EOF!;
equation:   variable ASSIGN expression -> ^(EQUATION variable expression)
;
orExpression
:   andExpression ( OR^ andExpression )* 
;
在第一个示例中,错误是由于!。我不确定是否EOF和EOF!两者是否相同。移除!解决了错误,但我想确定这是正确的修复

在第二条规则中,->和^给出了错误。我不确定什么是Antlr4等效物

在第三条规则中,^给出了错误。删除它可以修复错误,但我找不到任何迁移指南来解释应该等效于什么

你能给我这3条规则的ANTR4等价物,并简单解释一下区别是什么吗?如果你可以参考任何其他资源,我可以找到答案是好的


提前感谢。

许多ANTLR3语法包含ANTLR4不再支持的语法树操作(现在我们得到的是解析树而不是语法树)。你在这里看到的正是这个

  • EOF表示EOF应匹配,但不出现在AST中。因为已经没有AST了,所以您无法更改它,所以请删除感叹号
  • 构造
    ->^(等式变量表达式)
    重写由
    等式
    规则创建的AST。因为已经没有AST了,所以你不能改变它,所以移除那个部分
  • 或^
    最终确定
    运算符应成为生成的AST的根。因为已经没有AST了…,你现在明白了:-)

在v4中,如果您需要AST,您必须自己生成它(这并不是那么糟糕,我认为它给了您更多的自由),我写了一个如何实现的示例。