我们有一个针对antlr V2的语法,我想迁移到antlr v4。有迁移指南吗?我还想知道对现有V2语法的修改,以便我们很好地利用v4功能。
答案 0 :(得分:1)
再次见到你很高兴!
我们最近将一组大型语法迁移到ANTLR 4,并在此处编写了一些课程:https://tomassetti.me/migrating-from-antlr2-to-antlr4/
让我在这里总结要点。
ANTLR 4具有使语法更加简洁和可维护的功能
ANTLR2仅支持少数目标平台:Java,C#和C ++,而ANTLR4支持更多目标平台。
ANTLR4接受左递归语法:这是一个很大的语法,因为它可以导致更简单和“深度不够”的语法
ANTLR4解析器采用自适应LL(*)算法:无需您确定“ k”,这绝非易事
ANTLR4不再构建抽象语法树(AST)。这将对您的迁移影响最大
在本文中,我们将详细介绍有关转换单个选项或令牌操作的细节。
核心部分是如何处理ANTLR 4中不再存在的树重写规则。
在实践中,您将需要一个库来定义AST,您可以通过简化ANTLRv4生成的解析树来获得它。现在,在ANTLR v2中,您以前是在语法本身中执行此操作的,而在使用ANTLR v4时,您将执行此操作作为后续步骤。这很好,因为您将拥有两个更简单的阶段,而不是一个复杂的语法(有利于可维护性和可测试性)。但是,这需要您编写一个小的库来表示AST。
如果您使用Java目标,则可能会对使用此开源库表示AST感兴趣:https://github.com/Strumenta/kolasu
答案 1 :(得分:0)
我通过编写一个新的Antlr 4语法文件解决了这个问题。从Antlr 2到Antlr 4没有很好的转换。