antlr2到antlr4类说明符、选项、标记等

antlr2到antlr4类说明符、选项、标记等,antlr,antlr4,antlr3,antlr2,Antlr,Antlr4,Antlr3,Antlr2,我需要将一个语法文件从antlr2语法重写为antlr4语法,并有以下问题 1) 巴特·基尔斯(Bart Kiers)表示,这里面有一个严格的顺序:语法、选项、标记、@header、@members。这不同意在选项之前声明标题。是否有资源说明antlr4的正确顺序(如果存在) 2) 同一篇antlr2.org文章指出:“语法的选项部分,如果指定,必须紧跟在类说明符的“;”之后: class MyParser extends Parser; options { k=2; } 但是,在使用antl

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

1) 巴特·基尔斯(Bart Kiers)表示,这里面有一个严格的顺序:语法、选项、标记、@header、@members。这不同意在选项之前声明标题。是否有资源说明antlr4的正确顺序(如果存在)

2) 同一篇antlr2.org文章指出:“语法的选项部分,如果指定,必须紧跟在类说明符的“;”之后:

class MyParser extends Parser;
options { k=2; }
但是,在使用antlr4运行时,任何类说明符都会创建此错误:

syntax error: missing COLON at 'MyParser' while matching a rule
3) 表示当时没有规则级别的选项

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中,但我不确定它的功能是否与以前相同

谢谢!

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

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

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

i、 )ANTLR4使用无限制的前瞻性(因此在所有(*)中使用*号。您不能指定任何其他前瞻性

exportVocab早已过时(甚至ANTLR3都不支持它)。它只为.tokens文件指定一个名称。请改用默认名称

iii.)不再需要或支持类似的内容。ANTLR4中的预测算法已完全改变

你可以使用一个错误监听器来代替。有很多这样做的例子(这里也有)

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

4) 我不能100%确定这一点,但我相信您不能再在令牌部分指定令牌应匹配的值。相反,这仅适用于虚拟令牌,其他所有内容都必须指定为普通lexer令牌


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

我在谈论ANTLR3。一个问题中有许多问题。这是不推荐的,因为它会破坏问答式方法。