antlr4 - 使用 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
解决方案
您还应该包括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 谓词:
推荐阅读
- http - 在 URL 中包含标题
- c# - 从 thispersondoesnotexist.com 在 c# 中获取 4 个不同的图像?
- node.js - 在sailsjs中流式传输原始sql查询数据
- python - 用相似的键在python中合并Dict
- react-native - 如何在 react-native 功能组件中呈现从 firebase 数据库中提取的数据
- python - 用超时跳过输入函数
- java - 在 Spring 中通过 @RequestParam 发送 %
- typescript - 为什么 TypeScript 在 node-fetch 中接受 URL
- postgresql - Postgresql - 如何将数字四舍五入到最接近的重要倍数?
- java - TestNG - 尝试运行 XML 文件时出现“无法解析套件”错误