1

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

1) Bart Kiers 声明在这个SO 帖子中有一个严格的顺序:语法、选项、标记、@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 个令牌的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";
}

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

mismatched input ':' expecting RBRACE

和其他人一起。重写看起来像:

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

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

谢谢!

4

1 回答 1

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

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

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

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

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

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

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

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

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

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

于 2017-04-04T07:11:19.357 回答