Простой язык 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 ответ
Я не знаю много об Иронии, но я думаю, что вам нужно внести следующие изменения:
- Установите терминатор для вашего
FreeTextLiteral
, В противном случае парсер не будет знать, когда закончить анализ текста или имени поля. - Задавать
Root
к нетерминалу, который позволяет вам записать последовательность значений, а не только одно. - Избавляться от
AllowEmpty
, После того, как вы внесете изменение № 2, это будет означать, что Ирония будет думать, что ваш ввод заполнен пустымиText
s.
С этими изменениями грамматика выглядит так:
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