我正在尝试使用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元素的Value。字段无法识别。我在这里缺少什么?
答案 0 :(得分:0)
我对Irony不太了解,但我认为您需要做出以下更改:
FreeTextLiteral
设置终结符。否则,解析器将不知道何时结束解析文本或字段名称。Root
设置为非终端,可让您编写值的序列,而不只是一个。AllowEmpty
。在你做出改变#2之后,这只会意味着反讽会认为你的输入是空的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