2014-12-07 1 views
0

Я пытался сделать следующее, чтобы разобрать число «а», то один «а»:Non стремится Клини звезда в повышении дух й

*(lit("a")) >> lit("a") 

К сожалению, Клини звезда * в повышении :: spirit :: qi потребляет все «а» с нетерпением, после чего нет возврата, а последний lit(a) ничего не может сопоставить.

Конечно, используя (например) grep, следующий будет работать:

$ echo "aaa" | grep "a*a" 
aaa 

Каков наилучший способ обойти поведение ци здесь? Я понимаю, что откат может испортить семантические действия, поэтому давайте предположим, что qi используется только для хранения атрибутов в AST.

Использование + вместо * не решит мою проблему; Предположим, например, что у меня есть анализатор ignore_int_ который анализирует целые, но не производит никакого атрибута, то я мог бы использовать:

*ignore_int_ >> int_

хранить только последнее число.

ответ

1

Вы можете только негативно утверждать вещи загодя:

*(graph - 'z') >> 'z' 

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

*(graph - (graph >> eoi)) >> graph >> eoi 

или

*(!(graph >> eoi) >> graph) >> graph >> eoi 

Короче говоря, вам нужен положительный предпросмотр к "отстаивать против". Неявные утверждения не заставят вас ожидать возврата, поскольку Spirit является генератором парсера PEG, а не регулярным выражением.

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

  • Нет связанных вопросов^_^