javascript - Antlr 解析器没有发生
问题描述
如果我有一个测试语法TestGrammar.g4,
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.
`
如果我运行这些数据,我已经获得了抽象语法树(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
中。当然,这将在输出中显示为单个词法分析器标记。如果这是您的意图,那么可以,但通常人们想要掌握查询的各个部分。
推荐阅读
- android - 我的应用程序停止工作。可能是兼容性问题?
- javascript - Javascript 到 PHP 的输入是空的。现场搜索PHP麻烦
- c# - 如何在revit api c#中创建屋顶而不创建墙壁
- java - 资源无法使用 maven-dependency-plugin 正确复制
- python - 尝试在 onedrive SDK 上进行身份验证时列出索引超出范围 - python
- android - 在地图中获取用户位置的程序出错
- mongodb - Mongo Aggregate $and in $match 不返回结果
- javascript - 如何在页面显示给用户之前修复尺寸?
- visual-studio - 调试在 Docker 容器中运行的应用程序所需的提升权限?
- git - 如何使用 Git 合并多个 Qt Creator UI