2013-08-01 168 views
0

我有以下语法(最小化SO)Antlr4语法歧义

grammar Hello; 

odataIdentifier : identifierLeadingCharacter identifierCharacter*; 


identifierLeadingCharacter : Alpha| UNDERSCORE; 
identifierCharacter : identifierLeadingCharacter | Digit; 
identifierUnreserved : identifierCharacter | (MINUS | DOT | TILDE); 

Digit : ZERO_TO_FIVE |[6-9]; 

ONEHUNDRED_TO_ONEHUNDREDNINETYNINE : '1' Digit Digit;   // 100-199 
TWOHUNDRED_TO_TWOHUNDREDFOURTYNINE : '2' ZERO_TO_FOUR Digit;  // 200-249 
TWOHUNDREDFIFTY_TO_TWOHUNDREDFIFTYFIVE : '25' ZERO_TO_FIVE;  // 250-255 
TEN_TO_NINETYNINE : ONE_TO_NINE Digit;       // 10-99 

ZERO_TO_ONE : [0-1]; 
ZERO_TO_TWO : ZERO_TO_ONE | [2]; 
ZERO_TO_THREE : ZERO_TO_TWO | [3]; 
ZERO_TO_FOUR : ZERO_TO_THREE | [4]; 
ZERO_TO_FIVE : ZERO_TO_FOUR | [5]; 

ONE_TO_TWO : [1-2]; 
ONE_TO_THREE : ONE_TO_TWO | [3]; 
ONE_TO_FOUR : ONE_TO_THREE | [4]; 
ONE_TO_NINE : ONE_TO_FOUR | [5-9]; 

Alpha : [a-zA-Z]; 

MINUS : [-]; 
DOT : '.'; 
UNDERSCORE : '_'; 
TILDE : '~'; 

WS : (' '|'\r'|'\t'|'\u000C'|'\n') -> skip 
    ; 

输入c9它工作得很好,但是当我有2位例如c10它说:

extraneous input '92' expecting {<EOF>, Digit, Alpha, '_'} 

所以我想它解析9和解析2并不知道这应该是​​或2DigitDigit。 我是一个菜鸟到这一点,所以想知道如果我的分析是正确的,我怎么能解决这个...

回答

1

你输入导致的Alpha令牌,接着是​​令牌。虽然解析器规则identifierLeadingCharacter确实允许Alpha令牌,但identifierCharacter规则不能与​​令牌匹配。

输入10将始终产生一个​​令牌而不是两个Digit令牌,因为前者匹配更多的输入并且词法分析器规则很贪婪。