ANTLR - идентификатор с пробелами - PullRequest
2 голосов
/ 27 июля 2011

Мне нужны идентификаторы, которые могут содержать пробелы.

grammar WhitespaceInSymbols;

premise :   ( options {greedy=false;} : 'IF' )  id=ID{
System.out.println($id.text);
};

ID  :   ('a'..'z'|'A'..'Z')+ (' '('a'..'z'|'A'..'Z')+)* 
;

WS  :   ' '+ {skip();}
;

Когда я проверяю это с помощью «IF-оператора проанализировано», я получаю MissingTokenException и выводим «IF-оператор проанализировано».используя greedy = false, я мог бы указать ANTLR выйти после 'IF' и принять его в качестве токена.Но вместо этого IF является частью идентификатора.Есть ли способ достичь моей цели?Я уже попробовал некоторые варианты опции жадности = ложь, но безуспешно.

1 Ответ

5 голосов
/ 27 июля 2011

Я подумал, что, используя жадность = ложь, я могу сказать 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 в следующее дерево:

enter image description here

...