我需要将语法文件从 antlr2 语法重写为 antlr4 语法,并有以下问题。
1) Bart Kiers 指出有一个严格的顺序:语法、选项、标记、@header,@members 在这篇文章中。这篇 antlr2.org 帖子不同意将标题放在选项之前。 是否有资源为 antlr4 声明正确的顺序(如果存在)?
2)同一 antlr2.org 帖子指出:"语法的选项部分,如果指定,必须紧跟在类说明符的';'之后:
class MyParser extends Parser;
options { k=2; }
但是,当使用 antlr4 运行时,任何类说明符都会创建此错误:
syntax error: missing COLON at 'MyParser' while matching a rule
3) antlr4 中的选项发生了什么变化?说当时没有规则级别的选项。
warning(83): MyGrammar.g4:4:4: unsupported option k
warning(83): MyGrammar.g4:5:4: unsupported option exportVocab
warning(83): MyGrammar.g4:6:4: unsupported option codeGenMakeSwitchThreshold
warning(83): MyGrammar.g4:7:4: unsupported option codeGenBitsetTestThreshold
warning(83): MyGrammar.g4:8:4: unsupported option defaultErrorHandler
warning(83): MyGrammar.g4:9:4: unsupported option buildAST
i.) antlr4 的自适应 LL(*) 解析算法是否不再需要 k 个令牌查找头?
ii.) antlr4 中是否有用于出口词汇的等价物?
iii.) antlr4 中是否有用于优化代码GenMakeSwitchThreshold和代码GenBitsetTestThreshold的等价物,或者它们已经过时了?
iv.) 是否有 defaultErrorHandler 的等效项?
v.)我知道antlr4不再构建AST。 我仍在尝试掌握这将如何影响使用当前生成的 *Parser.java 和 *Lexer.java。
4)我当前的语法文件指定了令牌部分
tokens {
ROOT; FOO; BAR; TRUE="true"; FALSE="false"; NULL="null";
}
我将双引号更改为单引号,将分号更改为逗号,将等号更改为冒号,以尝试摆脱每个语法错误,但出现此错误:
mismatched input ':' expecting RBRACE
以及其他人。 重写后如下所示:
tokens {
ROOT; FOO; BAR; TRUE:'true'; FALSE:'false' ...
}
所以我删除了:'true'和:'false',TRUE和FALSE将出现在生成的MyGrammar.tokens中,但我不确定它的功能是否会像以前一样。
谢谢!
-
看看语法的最终来源:ANTLR4语法。如您所见,顺序在前传部分(包括命名操作、选项等)中没有任何作用,您甚至可以拥有多个选项部分)。唯一的条件是前传部分必须出现在任何规则之前。
-
该错误与错误的选项有关。删除它,错误将消失。
-
许多(实际上是大多数旧的)选项在ANTLR4中不再需要和支持。
i.) ANTLR4 使用无限前瞻(因此 ALL(*) 中的 *)。您不能指定任何其他前瞻。
ii.) 导出词汇早已消失(甚至 ANTLR3 也不支持它)。它仅指定 .tokens 文件的名称。请改用默认值。
iii.) 不再需要或支持这样的事情。ANTLR4 中的预测算法已完全改变。
iv.) 请改用错误侦听器。有很多例子可以做到这一点(也在SO这里)。
v.)这是一个问题还是只是大声思考?提示:基于 ANTLR4 的解析器生成解析树。
- 我不是 100% 确定这一点,但我相信您无法再在令牌部分中指定令牌应匹配的值。相反,这仅适用于虚拟令牌,其他所有内容都必须指定为普通词法分析器令牌。
总而言之:旧的ANTLR语法所需的大多数特殊选项和技巧不再需要,必须删除。新的解析算法可以自动处理所有歧义,以前的版本有问题,需要用户的指导。