1

我正在尝试使用 ANTLR 学习 EBNF 语法。所以我想我会将 Wikipedia 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';

通知IDENTIFIER仅指LETTERS

如果我提供此输入:

a;

然后我得到这个错误:

line 1:0 mismatched input 'a' expecting IDENTIFIER
(program a ;\n)

但是,如果我取消注释代码并提供相同的输入,我会得到合法的输出:

(program (statement a ;\n))

我不明白为什么一个有效而另一个无效。

4

1 回答 1

3

令牌a只会被分配一种令牌类型。由于此输入文本同时匹配LETTERSIDENTIFIER规则,ANTLR 4 将根据出现在词法分析器中的第一条规则分配类型,这意味着输入a将是 type 的标记LETTERS

如果您只想LETTERS成为其他词法分析器规则的子部分,而不是LETTERS自己形成标记,则可以将其声明为fragment规则。

fragment LETTERS : [a-z]+;
IDENTIFIER : LETTERS;

在这种情况下,a将分配令牌类型IDENTIFIER并且原始解析器规则将起作用。

于 2013-05-13T17:46:54.503 回答