ANTLR Visitor是我使用的正确工具

时间:2016-02-11 13:53:16

标签: java antlr antlr4

我正在使用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);        
}

my 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生成了一个parsetree,如果我可以将值或对象作为String获取,那就很完美了。

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

如果再次肯定;-),那么我正在使用我的工具,我想问你们,因为我很难实现MyTsqlVisitor.java。你能告诉我一个推荐或类似的东西。

提前致谢

1 个答案:

答案 0 :(得分:0)

  

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

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

是的,ANTLR是适合它的工具,但它不一定很简单,特别是如果你是第一次处理语言实现的话。访客可能也是比Listener更好的选择(我也会选择访客)。 IMO Listener API仅适用于非常简单的用例(如漂亮打印或提取注释)。