ANTLR Visitor 是适合我使用的工具吗
Is ANTLR Visitor the right tool for my usage
我正在使用 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
时遇到了麻烦。你们能告诉我推荐人或类似的东西吗?
提前致谢
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 仅适用于非常简单的用例(如漂亮打印或提取评论)。
我正在使用 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
时遇到了麻烦。你们能告诉我推荐人或类似的东西吗?
提前致谢
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 仅适用于非常简单的用例(如漂亮打印或提取评论)。