Antlr4 当令牌只提到另一个令牌时,antlr不进行解析
我正在尝试用ANTLR学习EBNF语法。所以我想我会把维基百科的EBNF语法转换成ANTLR 4,然后玩它。然而,我在这方面经历了一段糟糕的时光。我能够将语法简化为产生问题的一个步骤 似乎如果我只有一个令牌引用另一个令牌,那么ANTLR 4就无法解析输入 这是我的语法:Antlr4 当令牌只提到另一个令牌时,antlr不进行解析,antlr4,Antlr4,我正在尝试用ANTLR学习EBNF语法。所以我想我会把维基百科的EBNF语法转换成ANTLR 4,然后玩它。然而,我在这方面经历了一段糟糕的时光。我能够将语法简化为产生问题的一个步骤 似乎如果我只有一个令牌引用另一个令牌,那么ANTLR 4就无法解析输入 这是我的语法: grammar Hello; program : statement+ ; statement : IDENTIFIER STATEMENTEND /*| LETTERS STATEMENTEND */ ; LETTERS
grammar Hello;
program : statement+ ;
statement : IDENTIFIER STATEMENTEND /*| LETTERS STATEMENTEND */ ;
LETTERS : [a-z]+ ;
IDENTIFIER : LETTERS ;
SEMICOLON : [;] ;
STATEMENTEND : SEMICOLON NEWLINE* | NEWLINE+ ;
fragment NEWLINE : '\r' '\n' | '\n' | '\r';
注意标识符
仅指字母
如果我提供此输入:
a;
然后我得到这个错误:
line 1:0 mismatched input 'a' expecting IDENTIFIER
(program a ;\n)
但是,如果我取消对代码的注释并提供相同的输入,我将获得合法的输出:
(program (statement a ;\n))
我不明白为什么一个有效,另一个无效 令牌
a
将只分配一种令牌类型。由于此输入文本与字母
和标识符
规则都匹配,因此ANTLR 4将根据lexer中出现的第一条规则分配类型,这意味着输入a
将是类型字母
的标记
如果您只想让字母
成为其他lexer规则的子部分,而不是形成字母
标记本身,则可以将其声明为片段
规则
fragment LETTERS : [a-z]+;
IDENTIFIER : LETTERS;
在这种情况下,
a
将被分配令牌类型标识符
,原始解析器规则将起作用。Ahh这更有意义。您是否有一个关于antlr4文档的链接来介绍这一点?