Нежадное сопоставление в Treetop / PEG? - PullRequest
2 голосов
/ 26 июня 2009

Как бы я сделал что-то подобное в Treetop?

/.+?;/

Кажется, что единственный способ сделать это:

[^;]+ ';'

Что уродливо ... как-нибудь иначе? .+? похоже не работает ..

Ответы [ 3 ]

9 голосов
/ 09 февраля 2010

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

S <- P1* P2 (жадный, слепой)

Это может быть легко исправлено, если использовать упорядоченный выбор (и без использования заглядываний):

S <- P1 S / P2 (жадный, не слепой)

S <- P2 / P1 S (ленивый, не слепой)

1 голос
/ 03 июля 2009

Ну, я узнал, что ПЭГ жадные, и нет никакого пути к этому. Впрочем, подражания могут быть использованы для имитации этого поведения, например !(';' .)

0 голосов
/ 26 июня 2009

Я не знаю Treetop, но будет ли /[^;]+;/ работать?


В результате быстрого поиска я обнаружил предположение, что Treetop не выполняет жадные или ленивые (не жадные) квантификаторы и что + на самом деле является собственническим квантификатором (представленным ++ в других вариантах регулярных выражений).

Если это так, я не уверен, что у вас есть какие-либо другие опции на основе регулярных выражений, кроме отрицательного класса.

...