Выделение общих частей правил Духа

У меня есть много правил, которые имеют общий префикс и суффикс:

rule = begin_stuff >> some >> other >> stuff >> end_stuff.

(где begin_stuff а также end_stuff составлены из литералов)

Я хотел быть в состоянии сказать

 rule = wrapped(some >> other >> stuff);

Я попробовал что-то вроде

  template<typename Rule> Rule wrapped(Rule inside)
{
Rule result;
result = begin_stuff >> inside >> end_stuff;
return result;
}

но все, что я получаю, это много утверждений Ци во время компиляции.

Как я могу изменить правила Духа таким образом?

2

Решение

Я думаю, что вам нужно использовать Qi Confix Parser Derective от Духовное хранилище. Это именно то, что вам нужно.

1

Другие решения

Я думаю, что вы ищете «subrules» (который раньше имел Spirit V1 / classic). Они устарели сейчас.

Посмотри на

Вот подтверждение концепции, которая передает общий подправил различным «составным» правилам для включения в (), [] или же {}:

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>

namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;

typedef std::string::const_iterator It;

template <typename R>
void test(const std::string& input, R const& rule)
{
It f(input.begin()), l(input.end());
bool ok = qi::phrase_parse(f,l,rule,qi::space);
std::cout << "'" << input << "'\tparse " << (ok?"success":"failure") << "\n";
}

int main()
{
typedef qi::rule<It,                    qi::space_type> common_rule;
typedef qi::rule<It, void(common_rule), qi::space_type> compound_rule;

common_rule common = qi::int_;

compound_rule
in_parens   = qi::lit('(') >> qi::_r1 >> ')',
in_brackets = qi::lit('[') >> qi::_r1 >> ']',
in_braces   = qi::lit('{') >> qi::_r1 >> '}';

test("{ 231 }"  , in_braces  (phx::ref(common )) );
test("{ hello }", in_braces  (phx::val("hello")) );

test("( 231 )"  , in_parens  (phx::ref(common )) );
test("( hello )", in_parens  (phx::val("hello")) );

test("[ 231 ]"  , in_brackets(phx::ref(common )) );
test("[ hello ]", in_brackets(phx::val("hello")) );
}

Выход:

'{ 231 }'   parse success
'{ hello }' parse success
'( 231 )'   parse success
'( hello )' parse success
'[ 231 ]'   parse success
'[ hello ]' parse success

PS. Обратите внимание, что выше не типичная духовная грамматика. Этот способ не очень хорошо работает, когда «общее» правило выставляет разные атрибуты.

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector