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