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

Is ANTLR Visitor the right tool for my usage

我正在使用 ANTLR4,这里有一些上下文:

我的语法:

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

我生成的java类

ANTLRWorks 2 生成了我 tsql.tokenstsqlBaseVisitor.javatsqlParser.java 等等

我的“MyTsqlVisitor.java”

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);        
}

我的test.iql

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; 

我的问题

我想使用 ANTLR 来获取 var_etl_error_message 的值,然后打印 system.out.println(valueOfVar);

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

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

如果还是 ;-),那么我的工具是正确的,我想问问你们,因为我在实施 MyTsqlVisitor.java 时遇到了麻烦。你们能告诉我推荐人或类似的东西吗?

提前致谢

I want use ANTLR for example to get the value of var_etl_error_message and then to print system.out.println(valueOfVar);

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

是的,ANTLR 是适合它的工具,但它不一定很简单,尤其是如果您是第一次处理语言实现。 Visitor 可能也是比 Listener 更好的选择(我也会选择 Visitor)。 IMO Listener API 仅适用于非常简单的用例(如漂亮打印或提取评论)。