Я подумал, что, используя жадность = ложь, я могу сказать ANTLR, что нужно выйти после 'IF' и принять его в качестве маркера.
Нет, парсеру нечего сказать о создании токенов: сначала ввод вводится в токены, а затем к ним применяются правила парсера. Поэтому установка greedy=false
не имеет никакого эффекта.
Вы можете сделать это (создав * токены ID
с пробелами), но это будет ужасное решение с большим количеством предикатов и несколькими пользовательскими методами в лексере, выполняющими ручные просмотры: действительно, действительно не хочу этого! Гораздо более чистым решением было бы ввести правило id
в свой анализатор и позволить ему соответствовать одному или нескольким токенам ID
.
Демонстрация:
grammar WhitespaceInSymbols;
premise
: IF id THEN EOF
;
id
: ID+
;
IF
: 'IF'
;
THEN
: 'THEN'
;
ID
: ('a'..'z' | 'A'..'Z')+
;
WS
: ' '+ {skip();}
;
будет анализировать входные данные IF statement analyzed THEN
в следующее дерево: