0

次の文法があります(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_NINETYNINE2 Digit Digit

4

1 に答える 1

1

あなたの入力は、トークンのAlpha後にトークンが続く結果になりTEN_TO_NINETYNINEます。パーサー ルールidentifierLeadingCharacterはトークンを許可しAlphaますが、identifierCharacterルールはトークンと一致できませんTEN_TO_NINETYNINE

入力10は常に2 つのトークンTEN_TO_NINETYNINEではなく 1 つのDigitトークンを生成します。これは、前者がより多くの入力に一致し、レクサー ルールが貪欲であるためです。

于 2013-08-01T23:15:13.067 に答える