Как мне сделать что-то подобное в Treetop?Нежелательное соответствие в Treetop/PEG?
/.+?;/
Похоже, единственный способ это сделать:
[^;]+ ';'
Какой вид уродливого .. любым другим способом? .+?
, похоже, не работает.
Как мне сделать что-то подобное в Treetop?Нежелательное соответствие в Treetop/PEG?
/.+?;/
Похоже, единственный способ это сделать:
[^;]+ ';'
Какой вид уродливого .. любым другим способом? .+?
, похоже, не работает.
Я не знаю Treetop, но будет /[^;]+;/
работы?
От быстрого поиска, я увидел, что предложение Treetop не делает жадные, ни ленивых (не жадные) кванторов, и что на самом деле +
притяжательный квантор (представлен ++
в других регулярных выражениях вкусов).
Если это так, я не уверен, что у вас есть другие варианты, основанные на регулярном выражении, чем отрицательный класс.
'/ [^;] +; /' works, он написан как '[^;] + ';'', как показано в моем вопросе. Но я надеялся, что есть лучший способ. – cloudhead
Ну, я узнал, что PEG являются жадными, и вокруг него нет никакого способа. Lookaheads может быть использован для имитации такого поведения, хотя, как !(';' .)
колков жадные и слеп по умолчанию, это означает, что они едят столько ввод, как они могут, и они не считают, что приходит позже:
S <- P1* P2
(жадные , слепой)
Это может быть значительно легко фиксируется, хотя путем использования упорядоченного выбора (и без использования lookaheads):
S <- P1 S/P2
(жадный, не слепой)
S <- P2/P1 S
(lazy, non-blind)
в 'parslet' Я бы сделал 'rule (: line) {(str ("; "). Отсутствует? >> any) .repeat (1) >> str (";")} ', который, как я полагаю, совпадает с вашим вторым вариантом. –