如何从Antlr4解析器中获取解析树?

发布于 2025-02-09 21:10:20 字数 1140 浏览 3 评论 0原文

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

An object without type

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

城歌 2025-02-16 21:10:20

前提您将调用sql_script规则:

myTree = parser.sql_script();

Assuming you're using this grammar, you'd invoke the sql_script rule:

myTree = parser.sql_script();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文