Как определить синтаксис - PullRequest
       20

Как определить синтаксис

2 голосов
/ 02 августа 2010

Я новичок в языковой обработке и хочу создать парсер с 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 голосов
/ 26 августа 2010

Если бы между парами ключ-значение были включены символы новой строки, это было бы легко достижимо.Я не знаю «иронии», но мое первоначальное ощущение, что почти ни один генератор парсера / лексера не будет иметь дело с этим, учитывая только наивное грамматическое описание.Это требует, по сути, неограниченного взгляда.

Концептуально (поскольку я ничего не знаю об этом продукте), вот как я бы это сделал:

Токениз, основанный на пробелах и двоеточиях (то есть на каждой случайной последовательности символов, которыене пробел или двоеточие не является каким-либо токеном «идентификатора».

Затем необходимо сделать так, чтобы каждое «предложение» описывалось от двоеточия:

sentence = identifier_list
         | : identifier_list identifier : sentence

Этого недостаточно, чтобы заставить это работать, но я надеюсь, что вы поняли идею, по крайней мере.Вы должны быть очень осторожны, чтобы отличить identifier_list от одного идентификатора, чтобы они могли быть проанализированы однозначно.Точно так же, если ваш инструмент позволяет вам определять приоритет и ассоциативность, вам, возможно, не удастся выполнить привязку ":" очень сильно влево, так что ваша грамматика будет просто:

sentence = identifier : identifier_list

Иповедение должно быть (identifier :) identifier_list.

...