如何定义语法

时间:2010-08-02 16:43:30

标签: parsing text-processing irony

我是语言处理的新手,我想用以下语法为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)而不修改语法(比如在值周围添加引号)?

非常感谢!

1 个答案:

答案 0 :(得分:0)

如果键值对之间包含换行符,则很容易实现。我不知道“反讽”,但我最初的感觉是,只有一个天真的语法描述,几乎没有解析器/词法分析器生成器会处理这个问题。这需要基本上无限的前瞻。

从概念上讲(因为我对这个产品一无所知),我就是这样做的:

基于空格和冒号的标记(即,不是空格或冒号的每个连续字符序列都是某种“标识符”标记)。

然后你需要这样做,以便从冒号到冒号描述每个“句子”:

sentence = identifier_list
         | : identifier_list identifier : sentence

这还不足以让它发挥作用,但我希望至少你能得到这个想法。您需要非常小心地将identifier_list与单个标识符区分开来,以便可以明确地解析它们。类似地,如果您的工具允许您定义优先级和关联性,您可能能够使“:”非常紧密地绑定到左侧,这样您的语法就可以了:

sentence = identifier : identifier_list

其行为需要(identifier :) identifier_list