将手写解析器转换为ANTLR

时间:2015-03-24 17:02:27

标签: java parsing antlr

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

  1. 将输入流转换为双向链接令牌列表(由词法分析器完成)。
  2. 设置某种具有变量currentParser的帮助程序,可以执行reparse()skip(n tokens)
  3. 之类的操作
  4. 开始使用Parser的特定子类解析(使用方法parse(ParserManager pm, Token token)
  5. 根据当前令牌,当前解析器可能{em} Parser Stack 上的push new Parser,或者从解析器堆栈弹出自身,这意味着下一个解析器堆栈将解析下一个令牌。
  6. 整个编译器都是在ITypeList之类的接口上构建的,它们也作为单个参数传递给解析器。
  7. 一个示例Parser子类是TypeParser

    public TypeParser(ITyped typed) { ... }
    

    TypeListParser

    public TypeListParser(ITypeList typeList) { ... }
    

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

1 个答案:

答案 0 :(得分:1)

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

将此类设计转换为ANTLR:

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

    1. 创建AST作为语法(动作)的一部分,这是有效的,但会使你的语法严重依赖于AST类和实现语言
    2. 使用解析树访问者在第二次传递中创建AST,这解析了解析和AST构造,但是构建了一个中间解析树,这花费了一些时间。