antlr2 到 antlr4 class 说明符、选项、令牌等

antlr2 to antlr4 class specifier, options, TOKENS and more

我需要重写一个语法文件,从antlr2语法到antlr4语法,有以下问题。

1) Bart Kiers 指出有一个严格的顺序:语法、选项、标记、@header,此 SO post. This antlr2.org post 中的@members 不同意 header 在选项之前的说法。是否有资源说明 antlr4 的正确顺序(如果存在)?

2) 同样的 antlr2.org post 指出:“语法的选项部分,如果指定,必须紧跟在 ';' 之后class 说明符的:

class MyParser extends Parser;
options { k=2; }

但是,当 运行 antlr4 时,任何 class 说明符都会产生此错误:

syntax error: missing COLON at 'MyParser' while matching a rule

3) What happened to options in antlr4? 表示当时没有 rule-level 选项。

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 个标记 lookhead?

ii.) antlr4 中是否有对应的 exportVocab?

iii.) antlr4 中是否有用于优化 codeGenMakeSwitchThreshold 和 codeGenBitsetTestThreshold 的等价物,或者它们已经过时了?

iv.) 是否有 defaultErrorHandler 的等价物?

v.) 我知道 antlr4 不再构建 AST。我仍在尝试了解这将如何影响使用当前生成的 *Parser.java 和 *Lexer.java.

4) 我当前的语法文件指定了一个 TOKENS 部分

tokens {
    ROOT; FOO; BAR; TRUE="true"; FALSE="false"; NULL="null";
}

我将双引号更改为单引号,将 semi-colons 更改为逗号,将等号更改为冒号,以尝试消除每个语法错误,但出现以下错误:

mismatched input ':' expecting RBRACE

和其他人一起。重写后的样子:

tokens {
    ROOT; FOO; BAR; TRUE:'true'; FALSE:'false' ...
}

所以我删除了 :'true' 和 :'false' 并且 TRUE 和 FALSE 将出现在生成的 MyGrammar.tokens 中,但我不确定它是否会像以前一样发挥作用。

谢谢!

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

  2. 错误是关于一个错误的选项。删除它,错误就会消失。

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

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

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

iii.) 不再需要也不支持类似的东西。预测算法在ANTLR4中已经完全改变。

iv.) 您改为使用错误侦听器。有很多如何做到这一点的例子(也在 SO 处)。

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

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

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