Основное разбор Treetop и использование регулярных выражений - PullRequest
2 голосов
/ 08 марта 2010

Я разрабатываю сценарий с использованием библиотеки ruby ​​Treetop и у меня возникают проблемы с синтаксисом для регулярных выражений.Во-первых, многие регулярные выражения, которые работают в других настройках, не работают одинаково в верхушке дерева.

Это моя грамматика: (myline.treetop)

grammar MyLine
    rule line
        string whitespace condition
    end
    rule string
        [\S]*
    end
    rule whitespace
        [\s]*
    end
    rule condition
        "new" / "old" / "used"
    end
end

Это мое использование: (использование.rb)

require 'rubygems'
require 'treetop'
require 'polyglot'
require 'myline'

parser = MyLineParser.new
p parser.parse("randomstring new")

Это должно найти слово новое наверняка, и это так!Теперь я хочу расширить его, чтобы он мог найти новый, если входная строка становится «случайной строкой, новой строкой, новой, еще одной и другой» и, возможно, содержит любое количество строк, за которыми следует пробел (включая табуляцию) до и после регулярного выражения для условия правила.Другими словами, если я передаю ему любое предложение со словом «новый» и т. Д., Оно должно соответствовать этому.

Итак, допустим, я изменил свою грамматику на:

rule line
    string whitespace condition whitespace string
end

Затем он должен быть в состоянии найти соответствие для:

p parser.parse("randomstring new anotherstring")

Итак, что мне нужно сделать, чтобы разрешить повторение строки до и после условия?Если я попытаюсь написать это:

rule line
    (string whitespace)* condition (whitespace string)*
end

, это пойдет в бесконечный цикл.Если я заменяю выше () на [], он возвращает ноль. В общем, регулярное выражение возвращает совпадение, когда я использую вышеупомянутое, но регулярное выражение на верхушке дерева не делает.У кого-нибудь есть какие-нибудь советы / баллы о том, как это сделать?Кроме того, поскольку документации для treetop не так много, а примеры слишком тривиальны или слишком сложны, есть ли кто-нибудь, кто знает более подробную документацию / руководство для treetop?

Ответы [ 2 ]

1 голос
/ 15 марта 2010

Похоже, вам даже не нужна грамматика, чтобы делать то, что вы просите.В этом случае достаточно простого регулярного выражения:

line.match(/(.*)\s(new|old|used)\s(.*)/)

(Пример: http://rubular.com/r/Kl8rUifxeu)

Вы можете получить массив, содержащий материал до и после условия с помощью:

Regexp.last_match(1).split + Regexp.last_match(3)

И проверить условие с помощью:

return "Sweet, it's new!" if Regexp.last_match(2) == "new"
0 голосов
/ 09 марта 2010

Это не имеет никакого отношения к верхушке дерева и всему, что связано с вашей грамматикой.Правило условия полностью соответствует вашему строковому правилу, поэтому оно неоднозначно, когда вы переходите от повторения (string whitespace)* к условию.Очистите правило строки, чтобы у вас была однозначная грамматика, и все будет в порядке.Возможно, вы захотите сделать так, чтобы такие вещи / атрибуты, как условие, были помечены так:

cond:new

Это лексически отличается от правила строки.

...