#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 и двоеточием может быть пробел).