antlr4在标记中混合了碎片

时间:2015-10-29 17:12:06

标签: antlr4

我观察到一种奇怪的行为,试图使用包含如下语句的语法来解析文本:

fragment A : ('a'|'A') ;
fragment D : ('d'|'D') ;
fragment N : ('n'|'N') ;
KEY_AND : A N D;

我创建了一个简单的语法来产生我遇到的问题:

grammar AndTest;  
mainRule: NAME SEP KEY_AND SEP NAME;
NAME: ('A'..'Z')+ ;
SEP: ';' ;
fragment A : ('a'|'A') ;
fragment D : ('d'|'D') ;
fragment N : ('n'|'N') ;
KEY_AND : A N D;
WS: [ \r\t\n]+ -> skip ;

在grun执行期间,我得到了以下内容(这里我们有'AND'并得到一个错误,但是如果我们有'And'那么我们没有):

AND echo ANDY ; AND ; ANDY | grun AndTest mainRule -tree

line 1:7 mismatched input 'AND' expecting KEY_AND
(mainRule ANDY ; AND ; ANDY)

echo ANDY ; And ; ANDY | grun AndTest mainRule -tree

(mainRule ANDY ; And ; ANDY)

我的问题:执行期间发生的错误是预期的,我错过了语法中的某些内容,或者它是antlr4中的一种错误?

环境:Windows7x32,Java SE 1.8.0_60-b27,antlr 4.5.1

1 个答案:

答案 0 :(得分:2)

在与AND规则匹配之前,您的语法将输入“NAME”与KEY_AND规则匹配。

预计会出错。 AND符合NAME的要求,NAME列在之前 KEY_AND。规则的顺序在antlr中很重要。

KEY_AND规则移到NAME以上可以解决此错误。