Non-greedy matching in Treetop/PEG?

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-01 03:39:09

问题


How would I do something like this in Treetop?

/.+?;/

It seems like the only way is to do:

[^;]+ ';'

Which is kind of ugly.. any other way? .+? doesn't seem to work..


回答1:


PEGs are greedy and blind by default, that means they eat as much input as they can and they do not consider what comes afterwards:

S <- P1* P2 (greedy, blind)

That can be considerably easy fixed though by making use of the ordered choice (and without using lookaheads):

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

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




回答2:


Well, I learnt PEGs are greedy, and there's no way around it. Lookaheads can be used to mimic this behavior though, like !(';' .)




回答3:


I don't know Treetop, but would /[^;]+;/ work?


From a quick search, I saw suggestion that Treetop doesn't do greedy nor lazy (non-greedy) quantifiers, and that the + is actually a possessive quantifier (represented by ++ in other regex flavours).

If this is the case, I'm not sure you've got any other regex-based options than the negated class.



来源:https://stackoverflow.com/questions/1045932/non-greedy-matching-in-treetop-peg

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!