反讽:没有StartEndSymbol的StringLiteral

时间:2012-07-04 10:11:45

标签: c# dsl irony

我正在使用Irony DSL框架来解析一种语言。该语言允许在没有引号(“)的情况下编写字符串,即使它们包含点(。)或减号( - )等特殊字符。

如果我编辑我得到的文本文件,所以字符串在它们周围有引号,它们可以被解析得很好。但是,我想按原样阅读这些文件。如何在不设置StartEndSymbol的情况下使Irony解析字符串?

我正在使用当前版本的Irony(2012_03_15)。

3 个答案:

答案 0 :(得分:2)

看看Sample SQL语法。它允许标识符包含'.',例如SELECT a.x FROM table。在这种情况下,'Id'将是您的分隔符的列表。

var dot = ToTerm(".");
var dash = ToTerm("-");
var Id_simple = TerminalFactory.CreateSqlExtIdentifier(this, "id_simple"); //covers normal identifiers (abc) and quoted id's ([abc d], "abc d")
Id.Rule = MakePlusRule(Id, dot, Id_simple) | MakePlusRule(Id, dash, Id_simple)

 //Covers simple identifiers like abcd, and also quoted versions: [abc d], "abc d".
    public static IdentifierTerminal CreateSqlExtIdentifier(Grammar grammar, string name) {
      var id = new IdentifierTerminal(name);
      StringLiteral term = new StringLiteral(name + "_qouted");
      term.AddStartEnd("[", "]", StringOptions.NoEscapes);
      term.AddStartEnd("\"", StringOptions.NoEscapes);
      term.SetOutputTerminal(grammar, id); //term will be added to NonGrammarTerminals automatically 
      return id;
    }

如果它适用于SQL,它应该适合你。

答案 1 :(得分:1)

让我试着澄清一下。 宣言" id" CreateSqlExtIdentifier类中的varibale:" //包含简单标识符,如abcd,以及引用版本:[abc d]," abc d"和下划线和数字,但不是更多。事实上,SQL解析器包含了像#34; id" - 是遵循规则的结果: **"Id.Rule = MakePlusRule(Id, dot, Id_simple);"** 作为一种解决方案,您可以声明特殊字符(如果没有多少)并创建自定义规则,这将包含代码中可能的显示。
例如:
    specialSymbols.Rule = ToTerm(".") | "-" | ...etc.;
    myId.Rule = id_simple | specialSymbols;
    myIds.Rule = MakePlusRule(myIds<,Delimiter if nedeed>,myId);

最诚挚的问候,Dionis。

答案 2 :(得分:0)

我也希望看到这样做的合适。目前我只是通过在其构造函数中设置必要的额外字符来使用IdentifierTerminal。