我正在使用Irony DSL框架来解析一种语言。该语言允许不带引号(")的字符串,即使它们包含点(.)或减号(-)等特殊字符。
如果我编辑我得到的文本文件,字符串两边有引号,它们就可以被很好地解析。但是,我想按原样读取这些文件。如何在不设置StartEndSymbol的情况下对字符串进行反讽解析?
我使用的是当前版本的Irony (2012_03_15)。
发布于 2012-07-25 19:11:13
看一下示例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,那么它也应该适用于您。
发布于 2016-03-18 15:47:16
让我试着澄清一下。声明的"id“变量在SQL类:”//涵盖了简单的标识符,如abcd,也包括引号版本: abc d,"abc d“和下划线和数字,但没有更多。这一事实,CreateSqlExtIdentifier解析器包含点像"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);
最好的问候,迪奥尼斯。
发布于 2012-07-24 23:37:30
我也希望看到这样做的适当方式。目前,我只是通过在IdentifierTerminal的构造函数中设置必要的额外字符来使用它。
https://stackoverflow.com/questions/11326968
复制相似问题