Как мне сделать что-то подобное в Treetop?
/.+?;/
Похоже, единственный способ сделать:
[^;]+ ';'
Что некрасиво .. по-другому? .+?
не работает ..
Как мне сделать что-то подобное в Treetop?
/.+?;/
Похоже, единственный способ сделать:
[^;]+ ';'
Что некрасиво .. по-другому? .+?
не работает ..
По умолчанию PEG жадные и слепые, это означает, что они съедают столько входных данных, сколько могут, и не учитывают то, что приходит потом:
S <- P1* P2
(жадный, слепой)
Это можно значительно легко исправить, используя упорядоченный выбор (и без использования опережающих просмотров):
S <- P1 S / P2
(жадный, неслепой)
S <- P2 / P1 S
(ленивый, не слепой)
Что ж, я узнал, что PEG жадные, и нет никакого способа обойти это. Однако для имитации этого поведения можно использовать опережения, например !(';' .)
Я не знаю Treetop, но будет ли /[^;]+;/
работать?
При быстром поиске я увидел предположение, что Treetop не выполняет ни жадных, ни ленивых (не жадных) квантификаторов, и что +
на самом деле является притяжательным квантификатором (представленным ++
в других разновидностях регулярных выражений).
Если это так, я не уверен, что у вас есть другие варианты на основе регулярных выражений, кроме отрицательного класса.
/[^;]+;/
работает, написано как [^;]+ ';'
, как показано в моем вопросе. Но я надеялся, что есть способ получше.
- person cloudhead; 26.06.2009
rule(:line) { (str(";").absent? >> any).repeat(1) >> str(";") }
, что, я думаю, совпадает с вашим вторым вариантом. - person Nigel Thorne   schedule 16.02.2013