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

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

/.+?;/

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

[^;]+ ';'

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

3 ответа

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

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

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

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

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

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

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


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

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

Другие вопросы по тегам