Почему правило токена (в ANTLR) «IDENT: LETTER (LETTER | DIGIT) *;» не распознает «xyz»? - PullRequest
2 голосов
/ 15 ноября 2011

Скажем, у меня есть кусок грамматики ANTLR (лексическая часть)

fragment LETTER : ('a'..'z' | 'A'..'Z') ;
fragment DIGIT : '0'..'9';
INTEGER : DIGIT+ ;
Ident : LETTER (LETTER | DIGIT)*;
WS : (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel = HIDDEN;};
COMMENT : '//' .* ('\n'|'\r') {$channel = HIDDEN;};

Я думаю, что, поскольку WS потребляет все пробелы между токенами, и "x y z", и "xyz" должны были быть идентифицированы как один и тот же токен Ident. Но, по-видимому, только «x y z» будет рассматриваться как 3 Ident. Поэтому я действительно смущен поведением, когда встречается пробел для правила лексера.

Конкретнее, у меня есть правило

VARIABLE: ('A'..'Z')+ DIGIT*  ;

Я хочу, чтобы он распознавал идентификаторы переменных, такие как X3, Y4, XX55 и т. Д. Но удивительно, что это правило распознает «X Y», так что это кажется совершенно непонятным. Какая у тебя идея?

Ответы [ 2 ]

3 голосов
/ 15 ноября 2011

Ident : LETTER (LETTER | DIGIT)*; означает, что Ident - это буква, за которой следует ноль или более букв или цифр. НЕТ пробелов!
Вот почему "xyz" распознается как 3 Идентификатор

1 голос
/ 15 ноября 2011

Хотя вы поместили WS на канал HIDDEN, "x y z" - это три токена Ident, поскольку токены WS отбрасываются только в правилах синтаксического анализатора, не в правилах лексера.,

Более конкретно, у меня есть правило

   VARIABLE: ('A'..'Z')+ DIGIT*  ;

Я хочу, чтобы оно распознавало идентификаторы переменных, такие как X3, Y4, XX55 и т. Д. Но, что удивительно, это правило распознает "XY"Так что это кажется совершенно непонятным.Какова ваша идея?

Нет, правило VARIABLE не соответствует " X Y" (включая пробелы): вы, должно быть, делаете что-то не так.

...