我正在使用Irony DSL框架来解析一种语言。该语言允许在没有引号(“)的情况下编写字符串,即使它们包含点(。)或减号( - )等特殊字符。
如果我编辑我得到的文本文件,所以字符串在它们周围有引号,它们可以被解析得很好。但是,我想按原样阅读这些文件。如何在不设置StartEndSymbol的情况下使Irony解析字符串?
我正在使用当前版本的Irony(2012_03_15)。
答案 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。