我需要将语法文件从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中,但我不确定它是否会像以前一样运行。
谢谢!
答案 0 :(得分:2)
1)只需查看语法的最终来源:ANTLR4 grammar。正如您所看到的,订单在前传部分(包括命名操作,选项等)中没有任何作用,您甚至可以有多个选项部分。唯一的条件是前传部分必须出现在任何规则之前。
2)错误是关于错误的选项。删除它,错误将消失。
3)ANTLR4中不再需要和支持许多(实际上大多数旧的)选项。
i。)ANTLR4使用无限前瞻(因此在ALL(*)中为*)。你不能指定任何其他的前瞻。
ii。)exportVocab早已不复存在(甚至ANTLR3也不支持)。它仅指定.tokens文件的名称。请改用默认值。
iii。)不再需要这样的东西了。预测算法在ANTLR4中已完全改变。
iv。)您使用错误监听器。有很多例子如何做到这一点(也在这里)。
v。)这是一个问题还是只是大声思考?提示:基于ANTLR4的解析器生成一个解析树。
4)我不是百分之百确定这个,但我相信你不能再在令牌部分指定一个令牌应该匹配的值。相反,这仅适用于虚拟标记,其他所有内容都必须指定为普通词法分析器标记。
总结:不再需要旧的ANTLR语法所需的大多数特殊选项和技巧,必须将其删除。新的解析算法可以自动处理所有的环境问题,以前的版本遇到了麻烦,需要用户提供指导。