Antlr4 当令牌只提到另一个令牌时,antlr不进行解析

Antlr4 当令牌只提到另一个令牌时,antlr不进行解析,antlr4,Antlr4,我正在尝试用ANTLR学习EBNF语法。所以我想我会把维基百科的EBNF语法转换成ANTLR 4,然后玩它。然而,我在这方面经历了一段糟糕的时光。我能够将语法简化为产生问题的一个步骤 似乎如果我只有一个令牌引用另一个令牌,那么ANTLR 4就无法解析输入 这是我的语法: grammar Hello; program : statement+ ; statement : IDENTIFIER STATEMENTEND /*| LETTERS STATEMENTEND */ ; LETTERS

我正在尝试用ANTLR学习EBNF语法。所以我想我会把维基百科的EBNF语法转换成ANTLR 4,然后玩它。然而,我在这方面经历了一段糟糕的时光。我能够将语法简化为产生问题的一个步骤

似乎如果我只有一个令牌引用另一个令牌,那么ANTLR 4就无法解析输入

这是我的语法:

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文档的链接来介绍这一点?