2009-06-25 3 views
2

Как мне сделать что-то подобное в Treetop?Нежелательное соответствие в Treetop/PEG?

/.+?;/ 

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

[^;]+ ';' 

Какой вид уродливого .. любым другим способом? .+?, похоже, не работает.

+0

в 'parslet' Я бы сделал 'rule (: line) {(str ("; "). Отсутствует? >> any) .repeat (1) >> str (";")} ', который, как я полагаю, совпадает с вашим вторым вариантом. –

ответ

0

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


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

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

+0

'/ [^;] +; /' works, он написан как '[^;] + ';'', как показано в моем вопросе. Но я надеялся, что есть лучший способ. – cloudhead

1

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

9

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

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

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

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

S <- P2/P1 S (lazy, non-blind)

Смежные вопросы