英文:
About hard-coded `self`-references in antlr4 grammar files
问题
在生成 PL/SQL 解析器和词法分析器后,使用以下命令:
antlr4 -Dlanguage=JavaScript PlSqlParser.g4 PlSqlLexer.g4,
我发现生成的 PlSqlParser.js 和 PlSqlLexer.js 包含变量 self,当在 antlr4 的节点运行时产生 ReferenceError: self is not defined 错误。
语法文件可以在这里找到:https://github.com/antlr/grammars-v4/tree/master/sql/plsql
正如您所看到的,实际上,这个列表中的 *.g4 文件都在某些语句中硬编码了这个变量,例如在 PlSqlParser.g4 的第 1377 行:
alter_view_editionable
    : {self.isVersion12()}? (EDITIONABLE | NONEDITIONABLE)
    ;
可以正确地假设这个语法是硬编码为在浏览器环境中运行的吗,其中 self 将引用 Window 对象?因此,我需要做的只是将 *.g4 文件中的 self 替换为 this,以使其与节点兼容吗?
英文:
Got a question about antlr4-grammars:
After generating a PL/SQL-parser and lexer using:
antlr4 -Dlanguage=JavaScript PlSqlParser.g4 PlSqlLexer.g4,
I find that the resulting PlSqlParser.js and PlSqlLexer.js contains the variable self which produces ReferenceError: self is not defined, when run with the antlr4 node runtime.
The grammar files can be found here: https://github.com/antlr/grammars-v4/tree/master/sql/plsql
As you'll see, both the the *.g4 files in this listing, actually contains this variable hard-coded in some of its statements, e.g. in PlSqlParser.g4 at line 1377:
alter_view_editionable
    : {self.isVersion12()}? (EDITIONABLE | NONEDITIONABLE)
    ;
Is it correct to assume this grammar, then, is hard-coded to be run in a browser-context, in which self would reference the Window object? So all I need to do, is replace self with this in the *.g4-files to make it compatible with node?
答案1
得分: 1
根据 @kaby76 的解释,在为 PL/SQL 生成 JavaScript 目标时,缺少了一个语法转换步骤(将 self 替换为 this)。
现在已经被 修复,并合并到 antlr/grammars-v4 的主分支中。
英文:
As explained by @kaby76, there was a grammar transformation step (replacing self with this) missing when generating the JavaScript target for PL/SQL.
It's now been fixed, and merged into the master branch of antlr/grammars-v4.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论