将ANTLR v2语法迁移到ANTLR v4

时间:2018-07-19 13:15:48

标签: antlr antlr4 antlr2

我们有一个针对antlr V2的语法,我想迁移到antlr v4。有迁移指南吗?我还想知道对现有V2语法的修改,以便我们很好地利用v4功能。

2 个答案:

答案 0 :(得分:1)

再次见到你很高兴!

我们最近将一组大型语法迁移到ANTLR 4,并在此处编写了一些课程:https://tomassetti.me/migrating-from-antlr2-to-antlr4/

让我在这里总结要点。

为什么要迁移?

  • ANTLR 4具有使语法更加简洁和可维护的功能

  • ANTLR2仅支持少数目标平台:Java,C#和C ++,而ANTLR4支持更多目标平台。

ANTLR4的功能和差异

  • ANTLR4接受左递归语法:这是一个很大的语法,因为它可以导致更简单和“深度不够”的语法

  • ANTLR4解析器采用自适应LL(*)算法:无需您确定“ k”,这绝非易事

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

过程

  1. 重写语法,一次重写一条规则,并删除所有AST构造逻辑(如果存在)。
  2. 生成解析器和访问者。
  3. 如果使用方代码需要AST,请编写一个从解析树构建AST的访问者。
  4. 如果ANTLR2语法包含语义动作,请编写一个从解析树或抽象语法树运行该动作的访问者。

在本文中,我们将详细介绍有关转换单个选项或令牌操作的细节。

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

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

如果您使用Java目标,则可能会对使用此开源库表示AST感兴趣:https://github.com/Strumenta/kolasu

答案 1 :(得分:0)

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