我有以下语法(最小化为SO)
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
它工作正常,但当我有两位数时,例如c10
,它说:
extraneous input '92' expecting {<EOF>, Digit, Alpha, '_'}
所以我猜它解析9
并解析2
并且不知道这应该是TEN_TO_NINETYNINE
还是2
Digit
Digit
。
我是一个菜鸟,所以想知道我的分析是否正确,我怎么能减轻这个......
答案 0 :(得分:1)
您的输入产生Alpha
令牌,后跟TEN_TO_NINETYNINE
令牌。虽然解析器规则identifierLeadingCharacter
允许Alpha
令牌,但identifierCharacter
规则无法匹配TEN_TO_NINETYNINE
令牌。
输入10
将始终生成TEN_TO_NINETYNINE
令牌而不是两个Digit
令牌,因为前者匹配更多输入和词法分析器规则是贪婪的。