Простой язык FormatString с использованием Irony

Я пытаюсь определить упрощенный язык с помощью иронии. Некоторые языковые сценарии

Dear {Name},

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

var orText = new FreeTextLiteral("Text", FreeTextOptions.AllowEof | FreeTextOptions.AllowEmpty);
var orFieldName = new FreeTextLiteral("FieldName");

//Nonterminals
var orField = new NonTerminal("Field");
var orValue = new NonTerminal("Value");

//Rules
orField.Rule = "{" + orFieldName + "}";
orValue.Rule = orText | orField;

Root = orValue;

Однако Irony GrammarExplorer анализирует только значение, содержащее элемент Text. Поле не распознано. Что мне здесь не хватает?

1 ответ

Я не знаю много об Иронии, но я думаю, что вам нужно внести следующие изменения:

  1. Установите терминатор для вашего FreeTextLiteral, В противном случае парсер не будет знать, когда закончить анализ текста или имени поля.
  2. Задавать Root к нетерминалу, который позволяет вам записать последовательность значений, а не только одно.
  3. Избавляться от AllowEmpty, После того, как вы внесете изменение № 2, это будет означать, что Ирония будет думать, что ваш ввод заполнен пустыми Texts.

С этими изменениями грамматика выглядит так:

var orText = new FreeTextLiteral("Text", FreeTextOptions.AllowEof, "{");
var orFieldName = new FreeTextLiteral("FieldName", "}");

//Nonterminals
var orField = new NonTerminal("Field");
var orValue = new NonTerminal("Value");

var orFile = new NonTerminal("File");

//Rules
orField.Rule = "{" + orFieldName + "}";
orValue.Rule = orText | orField;

orFile.Rule = MakeStarRule(orFile, orValue);

Root = orFile;

Который анализирует ваш вклад во что-то вроде:

        File
         |
 /-------+-------\
 |       |       |
Text   Value    Text
 |       |       |
Dear FieldName   ,
         |
        Name
Другие вопросы по тегам