我是语言处理的新手,我想用以下语法为Irony创建一个解析器:
name1:value1 name2:value2 name3:value ...
其中name1是xml元素的名称,value是元素的值,也可以包含空格。
我试图像这样修改包含的样本:
public TestGrammar()
{
var name = CreateTerm("name");
var value = new IdentifierTerminal("value");
var queries = new NonTerminal("queries");
var query = new NonTerminal("query");
queries.Rule = MakePlusRule(queries, null, query);
query.Rule = name + ":" + value;
Root = queries;
}
private IdentifierTerminal CreateTerm(string name)
{
IdentifierTerminal term = new IdentifierTerminal(name, "!@#$%^*_'.?-", "!@#$%^*_'.?0123456789");
term.CharCategories.AddRange(new[]
{
UnicodeCategory.UppercaseLetter, //Ul
UnicodeCategory.LowercaseLetter, //Ll
UnicodeCategory.TitlecaseLetter, //Lt
UnicodeCategory.ModifierLetter, //Lm
UnicodeCategory.OtherLetter, //Lo
UnicodeCategory.LetterNumber, //Nl
UnicodeCategory.DecimalDigitNumber, //Nd
UnicodeCategory.ConnectorPunctuation, //Pc
UnicodeCategory.SpacingCombiningMark, //Mc
UnicodeCategory.NonSpacingMark, //Mn
UnicodeCategory.Format //Cf
});
//StartCharCategories are the same
term.StartCharCategories.AddRange(term.CharCategories);
return term;
}
但如果值包含空格,则不起作用。可以这样做(使用Irony)而不修改语法(比如在值周围添加引号)?
非常感谢!
答案 0 :(得分:0)
如果键值对之间包含换行符,则很容易实现。我不知道“反讽”,但我最初的感觉是,只有一个天真的语法描述,几乎没有解析器/词法分析器生成器会处理这个问题。这需要基本上无限的前瞻。
从概念上讲(因为我对这个产品一无所知),我就是这样做的:
基于空格和冒号的标记(即,不是空格或冒号的每个连续字符序列都是某种“标识符”标记)。
然后你需要这样做,以便从冒号到冒号描述每个“句子”:
sentence = identifier_list
| : identifier_list identifier : sentence
这还不足以让它发挥作用,但我希望至少你能得到这个想法。您需要非常小心地将identifier_list与单个标识符区分开来,以便可以明确地解析它们。类似地,如果您的工具允许您定义优先级和关联性,您可能能够使“:”非常紧密地绑定到左侧,这样您的语法就可以了:
sentence = identifier : identifier_list
其行为需要(identifier :) identifier_list
。