.net 使用反语的简单格式化字符串语言

.net 使用反语的简单格式化字符串语言,.net,parsing,programming-languages,irony,.net,Parsing,Programming Languages,Irony,我试图用反讽来定义一种过于简单的语言。有些语言用例是 Dear {Name}, 它是自由文本,其中引用了用大括号括起来的字段。双大括号转义字段声明。我提出了以下规范: var orText = new FreeTextLiteral("Text", FreeTextOptions.AllowEof | FreeTextOptions.AllowEmpty); var orFieldName = new FreeTextLiteral("FieldName"); //Nonterminals

我试图用反讽来定义一种过于简单的语言。有些语言用例是

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;

但是,讽刺语法explorer只解析具有文本元素的值。无法识别字段。我在这里遗漏了什么?

我对反讽了解不多,但我认为您需要做以下更改:

设置FreeTextLiteral的终止符。否则,解析器将不知道何时结束对文本或字段名的解析。 将Root设置为非终端,允许您写入值序列,而不仅仅是单个值。 摆脱允许的空虚。在你做出改变2之后,这只意味着反讽会认为你的输入充满了空文本。 通过这些更改,语法如下所示:

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