2013-08-15 5 views
3

Я пытаюсь узнать boost :: spirit, чтобы разобрать грамматику, но мне трудно понять, как использовать библиотеку.boost :: spirit semantic action: emit result

В принципе, если анализатор попадает в «Тест» во входном потоке, я бы хотел испустить 5 в качестве возвращаемого значения. (Позже, я на самом деле хотел бы испускать пару, со струнным членом «Test» и член значение 5.

Вот то, что я до сих пор:

template <typename Iterator> 
struct testgrammar 
    : public grammar<Iterator, unsigned int()> 
{ 
public: 

    testgrammar() : testgrammar::base_type(start) 
    { 
     start = std::wstring(L"Test") [ _val = 5 ] ; 
    } 

    virtual ~testgrammar(){}; 

    rule<Iterator, unsigned int()> start; 

}; 

В основной():

std::wstring strIn = L"Test"; 
std::wstring::const_iterator itBegin = strIn.begin(); 
std::wstring::const_iterator itEnd = strIn.end(); 
unsigned int nData = 0; 
bool bRes = parse(itBegin, itEnd, avxgrammar<std::wstring::const_iterator>(), nData); 

Однако, я делаю это неправильно, потому что компилятор выдает следующую ошибку:

error C2678: binary '=' : no operator found which takes a left-hand operand of type 'const boost::spirit::_val_type' (or there is no acceptable conversion) 

мой вопрос, почему не может Я назначаю _val? Как я могу испускать такую ​​структуру из семантического действия?

Редактировать Возможно, я должен уточнить конечную цель. Я хочу проанализировать текстовый файл на пары значений Token/Literal.

Заранее благодарю вас за помощь!

ответ

3

Возложить qi::_val вы, вероятно, просто нужно

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

или минимально phoenix_operator.hpp.


Что касается цели тренировки я думаю, что вы хотите прочитать о

  • qi::symbols<char, unsigned int> см http://www.boost.org/doc/libs/1_54_0/libs/spirit/doc/html/spirit/qi/reference/string/symbols.html

  • это выглядит, как вы могли бы на самом деле искать токенизации, который покрытый Spirit Lex

    • см. lex::tokenize или, например, lex::tokenize_and_parse
    • Обратите внимание, что по умолчанию большинство основных моделей токенов хранят идентификатор маркера и соответствующую пару итератора источника.
+0

Благодарим за ответ. Я попытался включить phoenix, но это изменило ошибку компилятора: error C2679: binary '[': оператор не найден, который принимает правый операнд типа boost :: phoenix :: actor ' – namezero

+2

Darn, я забыл очевидное ранее: 'std :: wstring' не является шаблоном выражения парсера, поэтому он не будет воспринимать семантическое действие точно. Используйте 'qi :: string' или, возможно, один из' boost :: spirit :: standard_wide' за отличную работу! _ (цитирование деталей из памяти обязательно для крайне ограниченного доступа в Интернет) _ – sehe

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

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