我有以下语法(将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,它工作得很好,但是当我有2位数字(例如c10 )时,它会说:
extraneous input '92' expecting {<EOF>, Digit, Alpha, '_'}所以我猜它解析了9,解析了2,不知道这应该是TEN_TO_NINETYNINE还是2 Digit Digit。我是这方面的新手,所以想知道我的分析是否正确,我怎样才能减轻这一切……
发布于 2013-08-01 23:15:13
您的输入将产生一个Alpha令牌和一个TEN_TO_NINETYNINE令牌。虽然解析器规则identifierLeadingCharacter确实允许Alpha令牌,但identifierCharacter规则不能匹配TEN_TO_NINETYNINE令牌。
输入10总是产生一个TEN_TO_NINETYNINE令牌,而不是两个Digit令牌,因为前者匹配更多的输入和Digit规则是贪婪的。
https://stackoverflow.com/questions/18005972
复制相似问题