0

我正在尝试使用 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 仅解析具有文本元素的值。无法识别字段。我在这里想念什么?

4

1 回答 1

0

我对 Irony 了解不多,但我认为您需要进行以下更改:

  1. 为您的FreeTextLiteral. 否则,解析器将不知道何时结束解析文本或字段名称。
  2. 设置Root为非终结符,可让您编写一系列值,而不仅仅是一个值。
  3. 摆脱AllowEmpty. 在您进行更改 #2 之后,这将意味着 Irony 会认为您的输入充满了 empty Texts。

通过这些更改,语法如下所示:

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
于 2014-11-15T22:59:13.687 回答