首页 > 解决方案 > 使用 antlr4/grun 从单独的词法分析器和解析器语法构建语法树

问题描述

我正在尝试使用 antlr/grun 为 go 文件构建 AST。我从这里GoLexer.g4拿了and 。GoParser.g4

编译时,javac抱怨现在知道GoParserBase。antlr 生成的源代码中没有定义该类。

看起来工作流程与官方文档中的单个语法文件略有不同。

缺少哪些步骤?

这些是从上述语法中重现错误的命令:

$ antlr4 -no-visitor GoLexer.g4 GoParser.g4
$ javac -cp ".:/usr/share/java/antlr-complete.jar" -g *.java
GoParser.java:12: error: cannot find symbol
public class GoParser extends GoParserBase {
                              ^
  symbol: class GoParserBase
# and lots more errors

编辑:感谢您的解决方案,@bart-kiers。

为了完整起见,这里是 grun 调用:

grun Go sourceFile -gui $GOPATH/src/encoding/json/encode.go

标签: antlr4

解决方案


您还应该包括GoParserBase.java

解析器扩展基类的事实是因为在解析器规则中有几个谓词(查找{noTerminatorAfterParams(int)}?和其他{...}? occurences)。这是特定于目标的代码,作者决定不将此代码包含在语法中(当然,除了方法的调用之外),而是将其与语法分开。

它还使得在grammars-v4存储库中集成变得更容易,但这只有在您知道grammars-v4存储库是如何设置以及单元测试如何运行时才有意义。

如果您不想扩展基本解析器,也可以这样做:

parser grammar GoParser;

options {
    tokenVocab = GoLexer;
    // superClass = GoParserBase; <-- can be removed
}

@header {
  // Add the methods present inside GoParserBase.java
}

// the rest of the grammar

更多关于 ANTLR 谓词:


推荐阅读