Синтаксический анализ строк в Xtext

#xtext

#xtext

Вопрос:

В настоящее время я пытаюсь написать редактор на основе Eclipse для внутреннего языка, который мы используем в компании. Язык представляет собой набор инструкций вида:

 {action}: {arguments}
  

…в отдельной строке. Формат {аргументов} зависит от типа выполняемого {действия}. Пример фрагмента скрипта может выглядеть следующим образом:

 banner: Some string with numbers and punctuation (23) in it!
# some comment
timeout: 42
  

Моя проблема заключается в разборе такого фрагмента. У меня есть комментарии и инструкция timeout, но, похоже, я не могу создать правило, охватывающее инструкцию banner. Все мои попытки привели к появлению предупреждений Antlr «определение токена недоступно» или к тому, что редактор не смог сопоставить входные данные. Я попробовал следующие правила для инструкции banner:

 Banner:
  'banner:' name=ANY_OTHER*;
  

и

 Banner:
  'banner:' name=FF_STRING;
terminal FF_STRING : ('a'..'z'|'A'..'Z'|'0'..'9'|'.'|':'|' ') ;
  

…что выдает мне предупреждения antlr. Способ, который я придумал, заключается в простом создании терминала, идентичного SL_COMMENT, с ‘banner:’ вместо ‘#’ в начале. Недостатком является то, что я не получаю цвет синтаксиса, и ‘banner’ не отображается в списке автозаполнения.

Приветствуются любые советы.

Ответ №1:

Вы могли бы попробовать использовать правило типа данных и сокращенный набор правил терминала. Что-то вроде этого могло бы сработать:

 Banner
  'Banner:' name=Value;
Value hidden(): 
  (ID | WS | INT | <any keyword from your grammar>)* LineBreak;
terminal LineBreak: 'r' 'n'? | 'n';
termianl WS: (' '|'t') *
  

Комментарии:

1. Спасибо за ответ. Кажется, это работает, хотя я все еще получаю предупреждения типа antlr «Решение может соответствовать вводимым данным, таким как …», когда я пытаюсь добавить ‘:’ в мое правило значений. Я думаю, это потому, что у меня есть ‘:’ в качестве отдельного ключевого слова сразу после ‘banner’ (т. Е. Между banner и двоеточием может быть пробел).