我正在使用ANTLR4,这里有一些上下文:
我正在使用提供的tsql语法。我稍微扩展和修改了这个语法,只有少数例外。
ANTLRWorks 2为我生成tsql.tokens
,tsqlBaseVisitor.java
,tsqlParser.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);
}
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获取,那就很完美了。
如果是,我的猜测是正确的,Visitor
比Listener
更适合我的用途吗?
如果再次肯定;-),那么我正在使用我的工具,我想问你们,因为我很难实现MyTsqlVisitor.java
。你能告诉我一个推荐或类似的东西。
提前致谢
答案 0 :(得分:0)
我想用ANTLR来获取var_etl_error_message的值,然后打印system.out.println(valueOfVar);
您似乎必须为这种语言开发一个或多或少的工作解释器。它可能不一定非常全功能,但如果你想在执行后获得结果,那么你将不得不以某种方式执行它(因此它将是某种解释器)。
是的,ANTLR是适合它的工具,但它不一定很简单,特别是如果你是第一次处理语言实现的话。访客可能也是比Listener更好的选择(我也会选择访客)。 IMO Listener API仅适用于非常简单的用例(如漂亮打印或提取注释)。