如何从Antlr4解析器中获取解析树?
我正在使用antlr4来解析SQL。我设法生成了解析器,似乎有效。
我现在坚持如何从解析器中获取一棵树。
string input="SELECT * FROM myTable";
ITokenSource lexer = new PlSqlLexer(new AntlrInputStream(input));
ITokenStream tokens = new CommonTokenStream(lexer);
var parser = new PlSqlParser(tokens, writerOutput, writerError);
parser.AddErrorListener(new ThrowExceptionErrorListener());
parser.BuildParseTree = true;
myTree = parser.# what method here #();
我看到我可以在某个时候使用sql_statement()方法,sql_create_table()均取决于SQL源内的内容。但是,我应该怎么知道在解析内容之前是什么类型呢?我期望有一种通用方法在树结构中创建对象,因此以后可以将其馈送到MyVisitor类并生成对象。如果我不使用正确的方法,我得到了访问者无法处理的无类型对象的树。
我在做什么错?
编辑:我正在使用
当我使用sql_script()时,我得到了这个未类型的对象(我看不到弹出标签中的类型)
输入是:
string input = @"
CREATE TABLE ot.persons(
person_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
first_name VARCHAR2(50) NOT NULL,
last_name VARCHAR2(50) NOT NULL,
PRIMARY KEY(person_id)
);
";
I'm using ANTLR4 to parse SQL. I managed to generate the parser and it seems to work.
I'm now stuck at how to get a tree from the parser.
string input="SELECT * FROM myTable";
ITokenSource lexer = new PlSqlLexer(new AntlrInputStream(input));
ITokenStream tokens = new CommonTokenStream(lexer);
var parser = new PlSqlParser(tokens, writerOutput, writerError);
parser.AddErrorListener(new ThrowExceptionErrorListener());
parser.BuildParseTree = true;
myTree = parser.# what method here #();
I saw that I can use the sql_statement() method sometime, sql_create_table() all depending on what is inside the SQL source. But how am I supposed to know what type is the content before I parsed it ? I was expecting a generic method that create objects in a tree structure so I can later feed it to MyVisitor class and generate my objects. If I don't use the right method I got a tree of typeless objects that my visitor can't handle.
What am I doing wrong ?
Edit : I'm using this grammar
When I use sql_script() I got this untyped object (I can't see the type in the popup label)
The input is this:
string input = @"
CREATE TABLE ot.persons(
person_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
first_name VARCHAR2(50) NOT NULL,
last_name VARCHAR2(50) NOT NULL,
PRIMARY KEY(person_id)
);
";
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
前提您将调用
sql_script
规则:Assuming you're using this grammar, you'd invoke the
sql_script
rule: