Генерация выражения с использованием C ++ boost :: spirit PEG грамматики - PullRequest
3 голосов
/ 14 марта 2011

Я очень плохо знаком с C ++ & boost :: spirit.Попытка изучить оба, построив простое дерево выражений только с ||и && с помощью ПЭГ.Я собрал много частей кода из учебника mini-xml в документации.

Вот код , он работает для простых строк, таких как "1 || 0", "1 && 0", "1 || 1 && 0" ... но не работает для"(1 || 1)".Я не совсем понимаю, почему он не печатает, хотя он говорит, что разбор успешен.

Также, пожалуйста, объясните мне, как я могу сделать этот код более интуитивно понятным и обслуживаемым в долгосрочной перспективе.

Ответы [ 2 ]

4 голосов
/ 14 марта 2011

Включение поддержки отладки Spirit поможет:

a) добавить определение

#define BOOST_SPIRIT_QI_DEBUG

и b) добавить в конструктор вашей грамматики a

BOOST_SPIRIT_DEBUG_NODE(r);

для всех правил (здесь r).В результате синтаксические анализаторы напечатают дерево выполнения во время выполнения, показывая вам, какие правила выполняются с какими входными данными и какие значения атрибутов были заполнены (см. здесь для получения более подробной информации).

Какобщее примечание (и это может не относиться к вам, поскольку вы, похоже, пытаетесь построить AST), парсеры Spirit полностью приписаны.Это означает, что часто вам не нужны какие-либо семантические действия для обработки атрибутов (см. здесь , здесь и здесь для краткого введения).

0 голосов
/ 14 марта 2011

Я не знаю, почему ваш конкретный код Spirit не работает, но, учитывая, что вы «очень плохо знакомы с C ++» и спрашиваете, как сделать ваш код более понятным в долгосрочной перспективе, мой ответ таков:

Не используйте Boost Spirit. Используйте понятный генератор синтаксических анализаторов, такой как ANTLR (v2 может генерировать код C ++; v3 нет, поэтому используйте v2), или lex & yacc или аналогичный.

Boost Spirit - отличный инструмент для демонстрации того, как далеко можно продвинуться в определенных функциях C ++. Это не особенно поможет вам, если ваша цель - интуитивно понятный и обслуживаемый код, особенно если вы еще не разбираетесь в C ++ (это совсем не стучит в вас).

...