使用Irony的简单FormatString语言

时间:2014-11-07 16:13:41

标签: .net parsing programming-languages irony

我正在尝试使用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。字段无法识别。我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

我对Irony不太了解,但我认为您需要做出以下更改:

  1. FreeTextLiteral设置终结符。否则,解析器将不知道何时结束解析文本或字段名称。
  2. Root设置为非终端,可让您编写值的序列,而不只是一个。
  3. 摆脱AllowEmpty。在你做出改变#2之后,这只会意味着反讽会认为你的输入是空的Text
  4. 通过这些更改,语法如下所示:

    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