antlr2 到 antlr4 类说明符、选项、代币等



我需要将语法文件从 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中,但我不确定它的功能是否会像以前一样。

谢谢!

  1. 看看语法的最终来源:ANTLR4语法。如您所见,顺序在前传部分(包括命名操作、选项等)中没有任何作用,您甚至可以拥有多个选项部分)。唯一的条件是前传部分必须出现在任何规则之前。

  2. 该错误与错误的选项有关。删除它,错误将消失。

  3. 许多(实际上是大多数旧的)选项在ANTLR4中不再需要和支持。

i.) ANTLR4 使用无限前瞻(因此 ALL(*) 中的 *)。您不能指定任何其他前瞻。

ii.) 导出词汇早已消失(甚至 ANTLR3 也不支持它)。它仅指定 .tokens 文件的名称。请改用默认值。

iii.) 不再需要或支持这样的事情。ANTLR4 中的预测算法已完全改变。

iv.) 请改用错误侦听器。有很多例子可以做到这一点(也在SO这里)。

v.)这是一个问题还是只是大声思考?提示:基于 ANTLR4 的解析器生成解析树。

  1. 我不是 100% 确定这一点,但我相信您无法再在令牌部分中指定令牌应匹配的值。相反,这仅适用于虚拟令牌,其他所有内容都必须指定为普通词法分析器令牌。

总而言之:旧的ANTLR语法所需的大多数特殊选项和技巧不再需要,必须删除。新的解析算法可以自动处理所有歧义,以前的版本有问题,需要用户的指导。

最新更新