antlr4 令牌中的混合片段
antlr4 mixed fragments in tokens
我观察到一个奇怪的行为,尝试使用包含如下语句的语法来解析文本:
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
您的语法将输入“AND
”与 NAME
规则匹配,然后再与 KEY_AND
规则匹配。
错误在意料之中。 AND
满足 NAME
的要求,并且 NAME
列在 之前 KEY_AND
。规则的顺序在 antlr 中很重要。
将 KEY_AND
规则移动到 NAME
上方应该可以修复此错误。
我观察到一个奇怪的行为,尝试使用包含如下语句的语法来解析文本:
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
您的语法将输入“AND
”与 NAME
规则匹配,然后再与 KEY_AND
规则匹配。
错误在意料之中。 AND
满足 NAME
的要求,并且 NAME
列在 之前 KEY_AND
。规则的顺序在 antlr 中很重要。
将 KEY_AND
规则移动到 NAME
上方应该可以修复此错误。