antlr2到antlr4类说明符,选项,TOKENS等等

时间:2017-04-03 22:53:56

标签: antlr antlr4 antlr3 antlr2

我需要将语法文件从antlr2语法重写为antlr4语法,并提出以下问题。

1)Bart Kiers表示有一个严格的命令:语法,选项,标记,@ header,@ Firebase Doc中的@members。这个SO post不同意说明标题在选项之前。是否有资源说明antlr4的正确顺序(如果存在)?

2)相同的antlr2.org帖子指出:"语法的选项部分(如果指定)必须紧跟在&#39 ;;'类说明符:

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

但是,当使用antlr4运行时,任何类说明符都会创建此错误:

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

3)antlr2.org post表示当时没有规则级选项。

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。)对于exportVocab,antlr4中有一个等价物吗?

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中,但我不确定它是否会像以前一样运行。

谢谢!

1 个答案:

答案 0 :(得分:2)

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

2)错误是关于错误的选项。删除它,错误将消失。

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

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

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

iii。)不再需要这样的东西了。预测算法在ANTLR4中已完全改变。

iv。)您使用错误监听器。有很多例子如何做到这一点(也在这里)。

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

4)我不是百分之百确定这个,但我相信你不能再在令牌部分指定一个令牌应该匹配的值。相反,这仅适用于虚拟标记,其他所有内容都必须指定为普通词法分析器标记。

总结:不再需要旧的ANTLR语法所需的大多数特殊选项和技巧,必须将其删除。新的解析算法可以自动处理所有的环境问题,以前的版本遇到了麻烦,需要用户提供指导。