- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
Antlr4 有一个新类 ParseTreeWalker。但是我该如何使用它呢?我正在寻找一个最小的工作示例。我的语法文件是 'gram.g4',我想解析一个文件 'program.txt'
到目前为止,这是我的代码。 (假设 ANTLR 已经运行了我的语法文件并创建了所有的 gramBaseListener、gramLexer 等等):
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import static org.antlr.v4.runtime.CharStreams.fromFileName;
public class launch{
public static void main(String[] args) {
CharStream cs = fromFileName("gram.g4"); //load the file
gramLexer lexer = new gramLexer(cs); //instantiate a lexer
CommonTokenStream tokens = new CommonTokenStream(lexer); //scan stream for tokens
gramParser parser = new gramParser(tokens); //parse the tokens
// Now what?? How do I connect the above with the below?
ParseTreeWalker walker = new ParseTreeWalker(); // how do I use this to parse program.txt??
}}
我正在使用 java,但我认为它在其他语言中也是类似的。
ANTLR 文档 ( http://www.antlr.org/api/Java/index.html ) 缺少示例。互联网上有很多教程,但它们大多是针对 ANTLR 版本 3 的。少数使用版本 4 的教程不起作用或已过时(例如,没有 parser.init() 函数,并且像 ANTLRInputStream 这样的类已被弃用)
在此先感谢任何可以提供帮助的人。
最佳答案
对于语法中的每个解析器规则,生成的解析器都会有一个具有该名称的对应方法。调用该方法将按照该规则开始解析。
因此,如果您的“root-rule”被命名为 start
然后你将通过 gramParser.start()
开始解析返回 ParseTree
.然后可以将这棵树送入 ParseTreeWalker
与您要使用的监听器一起使用。
总而言之,它可能看起来像这样(由 OP 编辑):
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import static org.antlr.v4.runtime.CharStreams.fromFileName;
public class launch{
public static void main(String[] args) {
CharStream cs = fromFileName("program.txt"); //load the file
gramLexer lexer = new gramLexer(cs); //instantiate a lexer
CommonTokenStream tokens = new CommonTokenStream(lexer); //scan stream for tokens
gramParser parser = new gramParser(tokens); //parse the tokens
ParseTree tree = parser.start(); // parse the content and get the tree
Mylistener listener = new Mylistener();
ParseTreeWalker walker = new ParseTreeWalker();
walker.walk(listener,tree);
}}
************ 新文件 Mylistener.java ************
public class Mylistener extends gramBaseListener {
@Override public void enterEveryRule(ParserRuleContext ctx) { //see gramBaseListener for allowed functions
System.out.println("rule entered: " + ctx.getText()); //code that executes per rule
}
}
当然你必须更换<listener>
与您实现 BaseListener
还有一个小节点:在 Java 中,类名以大写字母开头是一种惯例,我建议您坚持这一点,以使代码对其他人更具可读性。
关于java - Antlr4 - 是否有使用 ParseTree Walker 的简单示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48555825/
ANTLR4 当前的 TestRig 工具支持 -gui 选项来解析整个输入文件并以图形方式显示整个结果解析树。我们是否可以先获取解析树,对其进行修改并调用一些 API 以图形方式显示解析树的子集/子
我正在尝试使用带有 C++ 目标的 ANTLR4 来实现 TSql 解析器。我抓取了语法文件 here .该jar用于制作相应的源文件(因冲突将TSqlParser.cpp中的NULL全部改为null
我的问题既是语言实现问题,也是 ANTLR4 API 问题。 有什么办法可以修改 ParseTree 及其附带的 TokenStream 吗? 这是场景。我有一种定义数据流程序的简单语言。您可以在gi
我想用目标语言 C# 中的 ANTLR 创建一个解析树(不是 AST)。这似乎不那么微不足道,也许我在寻找所有错误的地方。 到目前为止,我尝试在生成的解析器中实现部分,如下所示: public par
require 'ruby2ruby' require 'parsetree' code = "puts(var)" sexp = SexpProcessor.new.process(ParseTre
Antlr4 有一个新类 ParseTreeWalker。但是我该如何使用它呢?我正在寻找一个最小的工作示例。我的语法文件是 'gram.g4',我想解析一个文件 'program.txt' 到目前为
根据 this parsetree 在 ruby 1.9 中不起作用。我没有计算机科学背景,但已经编程了几年。有人可以更详细地解释一下为什么 parsetree 在 ruby 1.9 中不起作
我正在为一个简单的程序使用 htmlcxx 库,但我遇到了一个问题,我搜索了许多其他相关的解决方案,但我的问题仍然是一个问题,希望有人能帮助我,这是我在 Kdevelop 上使用的代码Ubuntu:
我是一名优秀的程序员,十分优秀!