将ANTLR v2语法迁移到ANTLR v4

将ANTLR v2语法迁移到ANTLR v4,antlr,antlr4,antlr2,Antlr,Antlr4,Antlr2,我们为Antlrv2编写了语法,我想迁移到Antlrv4。有迁移指南吗?我还想知道对现有V2语法的修改,以便更好地利用v4功能。我通过编写一个新的Antlr 4语法文件解决了这个问题。从Antlr 2到Antlr 4没有很好的转换。很高兴再次见到您 我们最近将一组大型语法迁移到ANTLR 4,并在这里编写了一些课程: 让我在这里总结一下要点 为什么要迁移? ANTLR 4具有使语法更加简洁和易于维护的特性 R.L.R2支持的目标平台只有几个:java、C++、C++,而ANTLR4支持更多

我们为Antlrv2编写了语法,我想迁移到Antlrv4。有迁移指南吗?我还想知道对现有V2语法的修改,以便更好地利用v4功能。

我通过编写一个新的Antlr 4语法文件解决了这个问题。从Antlr 2到Antlr 4没有很好的转换。

很高兴再次见到您

我们最近将一组大型语法迁移到ANTLR 4,并在这里编写了一些课程:

让我在这里总结一下要点

为什么要迁移?
  • ANTLR 4具有使语法更加简洁和易于维护的特性

  • R.L.R2支持的目标平台只有几个:java、C++、C++,而ANTLR4支持更多的

ANTLR4的特点和差异
  • ANTLR4接受左递归语法:这是一个很大的语法,因为它导致了更简单和“不太深入”的语法

  • ANTLR4解析器采用自适应LL(*)算法:不需要确定“k”,这从来都不是一件小事

  • ANTLR4不再构建抽象语法树(AST)。这一点对您的迁移影响最大

过程
  • 重写语法,一次重写一条规则,删除所有AST构造逻辑(如果存在)
  • 生成解析器和访问者
  • 如果消费代码需要AST,请编写一个访问者,从解析树构建AST
  • 如果ANTLR2语法包含语义操作,则编写一个访问者,从解析树或抽象语法树运行操作
  • 在本文中,我们将详细介绍如何转换单个选项或令牌上的操作

    核心部分是如何处理树重写规则,这些规则在ANTLR 4中不再存在

    实际上,您需要一个库来定义AST,您可以通过简化ANTLRv4生成的解析树来获得AST。现在,在Antlrv2中,您曾经在语法本身中这样做,而在使用Antlrv4时,您将这样做作为后续步骤。这很好,因为您将有两个更简单的阶段,而不是一个复杂的语法(有利于可维护性和可测试性)。但是,它需要您编写一个小库来表示AST


    如果您使用Java目标,您可能会对使用这个开源库来表示AST感兴趣:

    据我所知,V2在变量lookahead方面遇到了一些问题。如果在语法中使用常量前瞻,V4将解析更广泛的一类语言(即使使用LL(*),也是如此,但可能意义不大)。语法文件位于,我认为版本如此不同,您不妨从Scratch开始编写V4,我最终这样做了。我仍然有问题,所以我和费德里科·托马塞蒂签约,帮我完成语法。结果将在其移动到xqDoc帐户时发布:语法文件位于