Я разрабатываю сценарий с использованием библиотеки 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?