.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