我试图使用antlr/grun为go文件构建AST。我把GoLexer.g4和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-kier。
为了完整起见,下面是grun调用:
grun Go sourceFile -gui $GOPATH/src/encoding/json/encode.go发布于 2021-07-08 12:43:07
您还应该包括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谓词的更多信息:
https://stackoverflow.com/questions/68301839
复制相似问题