Parsing 如何定义语法
我是语言处理新手,我想为以下语法创建一个具有讽刺意味的解析器:Parsing 如何定义语法,parsing,text-processing,irony,Parsing,Text Processing,Irony,我是语言处理新手,我想为以下语法创建一个具有讽刺意味的解析器: name1:value1 name2:value2 name3:value ... 其中,name1是xml元素的名称,value是元素的值,该元素也可以包含空格 我试图修改包含的示例,如下所示: public TestGrammar() { var name = CreateTerm("name"); var value = new IdentifierTerminal("valu
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;
}
但是,如果值包含空格,则这不起作用。在不修改语法(比如在值周围加引号)的情况下(使用反语)可以做到这一点吗
非常感谢 如果在键值对之间包含换行符,则很容易实现。我对“反讽”一无所知,但我最初的感觉是,只要给出一个简单的语法描述,几乎没有解析器/词法生成器会处理这个问题。这需要本质上无限的前瞻性 从概念上讲(因为我对这个产品一无所知),我会这样做: 基于空格和冒号的标记化(即不是空格或冒号的每个连续字符序列都是某种“标识符”标记) 然后,您需要使每个“句子”从一个冒号到另一个冒号进行描述:
sentence = identifier_list
| : identifier_list identifier : sentence
这还不足以让它发挥作用,但我希望你至少能得到这个想法。您需要非常小心地区分标识符列表和单个标识符,以便能够明确地解析它们。类似地,如果您的工具允许您定义优先级和关联性,那么您可能可以不使用“:”将其绑定到左侧,这样您的语法就是:
sentence = identifier : identifier_list
而其行为需要是
(identifier:)identifier_list
如果在键值对之间包含换行符,则很容易实现。我对“反讽”一无所知,但我最初的感觉是,只要给出一个简单的语法描述,几乎没有解析器/词法生成器会处理这个问题。这需要本质上无限的前瞻性
从概念上讲(因为我对这个产品一无所知),我会这样做:
基于空格和冒号的标记化(即不是空格或冒号的每个连续字符序列都是某种“标识符”标记)
然后,您需要使每个“句子”从一个冒号到另一个冒号进行描述:
sentence = identifier_list
| : identifier_list identifier : sentence
这还不足以让它发挥作用,但我希望你至少能得到这个想法。您需要非常小心地区分标识符列表和单个标识符,以便能够明确地解析它们。类似地,如果您的工具允许您定义优先级和关联性,那么您可能可以不使用“:”将其绑定到左侧,这样您的语法就是:
sentence = identifier : identifier_list
它的行为需要是(identifier:)identifier\u list