Java ANTLR Visitor是适合我使用的工具吗

Java ANTLR Visitor是适合我使用的工具吗,java,antlr,antlr4,Java,Antlr,Antlr4,我使用的是ANTLR4,这里是一些上下文: 我的语法: 我正在使用可用的语法。我对这个语法进行了一些扩展和修改,但也有一些例外 我生成的java类 ANTLRWorks 2生成了metsql.tokens,tsqlBaseVisitor.java,tsqlParser.java等等 我的“MyTsqlVisitor.java” 我的测试 我的问题 例如,我想使用ANTLR获取var\u etl\u error\u message的值,然后打印system.out.println(valueOfV

我使用的是ANTLR4,这里是一些上下文:

我的语法: 我正在使用可用的语法。我对这个语法进行了一些扩展和修改,但也有一些例外

我生成的java类 ANTLRWorks 2生成了me
tsql.tokens
tsqlBaseVisitor.java
tsqlParser.java
等等

我的“MyTsqlVisitor.java” 我的测试 我的问题 例如,我想使用ANTLR获取
var\u etl\u error\u message的值,然后打印
system.out.println(valueOfVar)

首先,ANTLR是适合我使用的工具吗?我读了很多关于ANTLR的东西,它看起来非常好,适合我的使用。我确实使用ANTLRWorks2生成了一个parsetree,如果我能够以字符串的形式获取值或对象,那就太完美了

如果是,我的猜测是否正确,
Visitor
Listener
更适合我使用

如果再次是;-),那么,我正在使用我的工具,我想问问你们,因为我在实现
mytsqlvister.java
时遇到了麻烦。你们能告诉我推荐信之类的吗

提前谢谢

例如,我想使用ANTLR获取var_etl_error_消息的值,然后打印system.out.println(valueOfVar)

似乎你必须为这种语言开发一个或多或少能工作的解释器。它可能不必是全功能的,但是如果您想在执行后得到结果,那么您必须以某种方式执行它(因此它将是某种解释器)


是的,ANTLR是适合它的工具,但它不一定简单,特别是当您第一次处理语言实现时。访客可能也是比听者更好的选择(我也会选择访客)。在我看来,Listener API仅适用于非常简单的用例(如预打印或提取注释)。

不幸的是,stack over flow不是询问“abc是执行xyz的最佳工具吗;还是还有其他工具?”.这可能是真的,但我已经不知所措,不知道该问谁——所以我在这里试过了:/我理解你试图在外面说些什么,但在你的回答中是支持性的(这是可能的)最可怕的是^^最大的问题是我不知道如何从我的
mytsqlvister.java
开始,因为语法不是很好,如果你不介意的话,我不会深入研究语法,也不会给你具体的代码。相反,你可以看看我的一个老爱好项目:这是一个类似pascal语言的骨架原型解释器,它是基于访问者的。它可以作为控制结构解释、表达式求值、基本符号表管理等方面的示例。当然,这只是给你一些想法,它并不完美,也不实用。如果你有时间研究的话,我还可以推荐以下几本书:权威的ANTLR4参考书;语言实现模式首先谢谢你给我举个例子。我已经订了这本书:)
import ...

public class MyTsqlVisitor extends tsqlBaseVisitor<String>{
    //here I need to implement my rules
}
public static void main(String[] args) {
    tsqlLexer lexer = null;
    
    try {
        lexer = new tsqlLexer(new ANTLRFileStream("test.iql"));
    } catch (Exception e) {}
    
    tsqlParser parser = new tsqlParser(new CommonTokenStream(lexer));
    
    ParseTree tree = parser.tsql_file();
    MyTsqlVisitor visitor = new MyTsqlVisitor();
    visitor.visit(tree);        
}
begin   
    declare var_etl_log_message varchar(2000);
    declare var_etl_proc_line int;

    exception
        when others then

        set var_etl_error_message = sqlstate || errormsg ();

        resignal;
end;