如何解决Antlr解析器未发生
grammar TestGrammar;
startRule : compilationunit EOF;
compilationunit
: programunit*
;
programunit
: execsqlStatement
;
execsqlStatement
: EXEC sql EXECsqlLINE+ END_EXEC DOT?
;
freeText
//: ~NL*
: STRING+
;
EXECsqlLINE : EXECsqlTAG WS ~('\n' | '\r' | '}')* ('\n' | '\r' | '}');
EXECsqlTAG : '*>EXECsql';
END_EXEC : E N D '-' E X E C;
EXEC : E X E C;
sql : S Q L;
// symbols
STRING : .+?;
NL : '\r'? '\n' | '\r';
//NEWLINE : '\r'? '\n' -> channel(HIDDEN);
DOT : '.';
WS : [ \t\f;]+ -> channel(HIDDEN);
在其中输入简单文本,
const input = `
EXEC sql
somethig goes here
END-EXEC.
`
如果我运行这些数据,我已经获得了Abstract语法树(AST),并且它似乎没有被完全解析,
programunit
(
execsqlStatement EXEC sql \n s o m e t h i g g o e s h e r e \n s o m e t h i g g o e s h e r e \n END-EXEC
)
预期输出
(
startRule
(
compilationunit
(
programunit
(
execsqlStatement EXEC sql
(
freeText
(
something goes here
)
)
(
END EXEC
)
)
)
)
)
因为它必须解析execsqlStatement
内部的内容,但我无法检索。
预先感谢
解决方法
这里有几件事:
- ANTLR4不会产生语法树(AST),但会解析树。 AST由以(或多或少)树状方式匹配的输入符号组成。解析树由解析上下文节点组成,这些上下文节点描述了语法中匹配的路径。它们还包含匹配的符号,因此它们是AST的超集。
- 您的语法不完整,例如它错过了规则
S
,Q
,E
,X
等的定义。问题中的示例应该是自包含的,并且可以在不进行额外调整的情况下进行变换。 - 您永远不会使用规则
freeText
。那么它如何对输出做出贡献? - 您已将整个SQL代码编码为单个词法分析器规则
EXECSQLLINE
。当然,这将在输出中显示为单个词法分析器令牌。如果那是您的意图,那么可以,但是通常人们希望掌握查询的各个部分。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。