首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用antlr4 4/grun从分隔符、词法和解析器语法构建语法树

使用antlr4 4/grun从分隔符、词法和解析器语法构建语法树
EN

Stack Overflow用户
提问于 2021-07-08 12:41:14
回答 1查看 195关注 0票数 1

我试图使用antlr/grun为go文件构建AST。我把GoLexer.g4GoParser.g4这里那里拿走了。

编译时,javac抱怨现在了解GoParserBase。该类未在antlr生成的源代码中定义。

工作流程似乎与官方医生中的单个语法文件略有不同。

错过了哪些台阶?

下面是从上面提到的语法中复制错误的命令:

代码语言:javascript
复制
$ 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调用:

代码语言:javascript
复制
grun Go sourceFile -gui $GOPATH/src/encoding/json/encode.go
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-08 12:43:07

您还应该包括GoParserBase.java

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

它还使在grammars-v4存储库中集成变得更容易,但只有了解grammars-v4存储库是如何设置和单元测试如何运行的,这才有意义。

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

代码语言:javascript
复制
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谓词的更多信息:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68301839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档