2014-02-13 3 views
1

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

return foo; 

и

return (foo); 

Я пытался чего-л, как это:

start %= "return" >> -boost::spirit::qi::char_('(') >> identifier >> -boost::spirit::qi::char_(')') >> ';'; 

но это будет достигнуто даже в таких случаях, как

return (foo; 

и

return foo); 

Как я могу решить эту проблему?

+0

Как насчет 'statement = (" return ">> identifier >> ';') | («return» >> '(' >> identifier >> ')' >> ';') '? –

+0

@faranwath Да, я уже думал об этом, но это выглядит ужасно, особенно в случае, когда у меня есть много правил с аналогичной структурой. – FrozenHeart

+0

Ужасно? Я думаю, мы отличаемся тем, что делает правильное производственное правило приятным, но это ваша работа, настолько справедливая. –

ответ

4

Ваш пример выглядит только патологическим, потому что вы используете слишком конкретный пример.

На практике у вас нет "return" >> identifier;. Обычно возвращаемая вещь - это просто выражение. Таким образом, вы бы сказать

expr = literal | variable | function_call; 

теперь общий способ удовлетворения для выражения в скобках в на махом просто:

expr = literal | variable | function_call 
    | ('(' >> expr >> ')') 
    ; 

Bam. Готово. Он управляет балансировкой. Он обрабатывает вложенные круглые скобки. Он также обрабатывает (((foo))). В тот день был дан не свисток.

Я не думаю, что есть/что-то/неправильное вообще. В ответах на этом сайте я разместил, вероятно, более 20 рекурсивных разных грамматик выражений. Они должны приводить мотивирующие примеры (демонстрируя приоритет оператора и перекрывая их этими круглыми скобками).

+0

Можете ли вы дать мне понять, почему следующий код сбой с ошибкой «переполнение стека»? http://pastie.org/8732392 Входные данные - http://pastie.org/8732447 Я предполагаю, что это результат добавления рекурсии в мои правила. Я прав? Как я могу это исправить? – FrozenHeart

+0

Левая рекурсия и грамматики ПЭГ :) они не смешиваются – sehe

+0

Можете ли вы перефразировать, пожалуйста? Что мне делать в случае повышения духа? – FrozenHeart