Вопрос по whitespace, antlr4, parser-generator, antlr, parsing – ANTLR4: обработка пробелов

16

Я видел много грамматик ANTLR, которые используют обработку пробелов, как это:

WS: [ \n\t\r]+ -> skip;
// or
WS: [ \n\t\r]+ -> channel(HIDDEN);

Таким образом, пробелы выбрасываются и отправляются в скрытый канал.

С такой грамматикой:

grammar Not;

start:      expression;
expression: NOT expression
          | (TRUE | FALSE);

NOT:    'not';
TRUE:   'true';
FALSE:  'false';
WS: [ \n\t\r]+ -> skip;

действительные входыне правда' или же 'не ложь' но и 'не правдачто не является желаемым результатом. Изменение грамматики на:

grammar Not;

start:      expression;

expression: NOT WS+ expression
          | (TRUE | FALSE);

NOT:    'not';

TRUE:   'true';
FALSE:  'false';

WS: [ \n\t\r];

решает проблему, но я не хочу обрабатывать пробелы вручную в каждом правиле.

Обычно я хочу иметь пробел между каждым токеном с некоторыми исключениями (например, '!правда'не нужны пробелы между).

Есть ли простой способ сделать это?

Ваш Ответ

1   ответ
15

ДобавитьIDENTIFIER Правило лексера для обработки слов, которые не являются ключевыми словами.

IDENTIFIER : [a-zA-Z]+;

Теперь текстnottrue это одинIDENTIFIER токен, который ваш парсер не принял бы вместо отдельных ключевых слов вnot true.

УбедисьIDENTIFIER определенопосле ваши другие ключевые слова. Лексер обнаружит, что обаNOT а такжеIDENTIFIER сопоставить текстnotи назначит тип токена первому, который появится в грамматике.

Благодарю. Это работает так, как хотелось быне правда'(неверно) и'!правда'(действительный). У вас также есть идея, как я могу сделать исключение из этого правила, чтобы некоторые другие входы могли пропустить пробел? Подобно 'A B верно', где пробел между A и B является необязательным. Так что это также верно:AB true', но 'ABtrue'нет. flux

Похожие вопросы