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

Я пытаюсь определить упрощенный язык, используя 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. Поле не распознано. Что мне здесь не хватает?


person Ruudjah    schedule 07.11.2014    source источник


Ответы (1)


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

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

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

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
person svick    schedule 15.11.2014