Нежадное сопоставление в Treetop/PEG?
Как бы я сделал что-то подобное в Treetop?
/.+?;/
Похоже, единственный способ сделать это:
[^;]+ ';'
Что некрасиво... по-другому? .+?
не похоже на работу..
3 ответа
По умолчанию PEG являются жадными и слепыми, это означает, что они потребляют столько информации, сколько могут, и не учитывают, что будет потом:
S <- P1* P2
(жадный, слепой)
Это может быть легко исправлено, если использовать упорядоченный выбор (и не использовать заглядывания):
S <- P1 S / P2
(жадный, не слепой)
S <- P2 / P1 S
(ленивый, не слепой)
Ну, я узнал, что ПЭГ жадные, и нет пути к этому. Lookaheads могут быть использованы для имитации этого поведения, хотя, как !(';' .)
Я не знаю Treetop, но будет /[^;]+;/
Работа?
В результате быстрого поиска я обнаружил предположение, что Treetop не выполняет жадные или ленивые (не жадные) квантификаторы, и что +
на самом деле собственнический квантификатор (представлен ++
в других регулярных выражениях).
Если это так, я не уверен, что у вас есть какие-либо другие опции, основанные на регулярных выражениях, кроме отрицательного класса.