我目前正在使用一种编程语言,并且大约9个月以来,我一直在使用手写的词法分析器和解析器。我现在想要做的是将其转换为ANTLR解析器。 parser system of the compiler的结构大致如下:


将输入流转换为双向链接的令牌列表(由词法分析器完成)。
设置某种具有变量currentParser并且可以执行诸如reparse()skip(n tokens)之类的帮助器
使用Parser的特定子类开始解析(使用方法parse(ParserManager pm, Token token)
根据当前令牌,当前解析器可能在解析器堆栈上push一个new Parser,或者从解析器堆栈中弹出自身,这意味着堆栈中的下一个解析器将解析下一个令牌。
整个编译器建立在ITypeList之类的接口上,这些接口也作为单个参数传递给解析器。


Parser子类的一个示例是TypeParser

public TypeParser(ITyped typed) { ... }


TypeListParser

public TypeListParser(ITypeList typeList) { ... }


这种简单的结构适用于每个Parser实现。有没有办法在ANTLR中使用这些接口?

最佳答案

您的描述看起来像是Parser组合器模式的变体。

要将这样的设计转换为ANTLR:


将令牌映射到ANTLR令牌。这很容易,因为ANTLR-Tokens和您的令牌的接口相似。它们可能被包装或映射。
将每个解析器子类映射到ANTLR解析规则(或多个规则)。您将需要此解析器中的操作和语义谓词,因为您的解析器并非仅由语法驱动
ANTLR4不会创建AST,因此您的AST节点可以完全回收,您只需要根据语法决定如何创建AST:


创建AST作为语法(动作)的一部分,这是有效的,但会使您的语法严重依赖于AST类和实现语言
为了在第二遍与解析树访问者一起创建AST,这将解析与AST构造分离,但是要构建一个中间的解析树,这会花费一些时间。

10-06 10:32
查看更多