我使用的是ANTLR4,这里有一些上下文:
我的语法:
我使用的是可用的tsql语法。除了一些例外,我还对这个语法进行了一些扩展和修改。
我生成的java类
ANTLRWorks 2生成了tsql.tokens
,tsqlBaseVisitor.java
,tsqlParser.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生成了一个解析树,如果我可以将值或对象作为字符串获得,那么它是完美的。
如果是,我的猜测是对的,Visitor
比Listener
更适合我的使用吗?
如果是的话;-),那么我的工具就在正确的方向上,我想问你们,因为我在实现MyTsqlVisitor.java
方面有困难。你们能告诉我推荐信之类的事吗。
提前感谢
发布于 2016-02-11 13:59:28
例如,我希望使用ANTLR获取var_etl_error_message的值,然后打印system.out.println(valueOfVar);
看来你得为这门语言开发一种或多或少的工作解释器。它可能不需要完全的功能,但是如果您想在执行之后获得结果,那么您必须以某种方式执行它(因此它将是某种解释器)。
是的,ANTLR是正确的工具,但它并不一定简单,特别是当您第一次处理语言实现时。访问者可能也是一个比听众更好的选择(我也会选择访问者)。IMO侦听器API仅适用于非常简单的使用(如prettyprinting或提取注释)。
https://stackoverflow.com/questions/35341221
复制相似问题