Нежадное сопоставление в Treetop / PEG?

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

/.+?;/

Похоже, единственный способ сделать:

[^;]+ ';'

Что некрасиво .. по-другому? .+? не работает ..


person cloudhead    schedule 25.06.2009    source источник
comment
в 'parslet' я бы сделал rule(:line) { (str(";").absent? >> any).repeat(1) >> str(";") }, что, я думаю, совпадает с вашим вторым вариантом.   -  person Nigel Thorne    schedule 16.02.2013


Ответы (3)


По умолчанию PEG жадные и слепые, это означает, что они съедают столько входных данных, сколько могут, и не учитывают то, что приходит потом:

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

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

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

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

person Lukas Renggli    schedule 08.02.2010

Что ж, я узнал, что PEG жадные, и нет никакого способа обойти это. Однако для имитации этого поведения можно использовать опережения, например !(';' .)

person cloudhead    schedule 03.07.2009

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


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

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

person Peter Boughton    schedule 25.06.2009
comment
/[^;]+;/ работает, написано как [^;]+ ';', как показано в моем вопросе. Но я надеялся, что есть способ получше. - person cloudhead; 26.06.2009