Я пытаюсь узнать 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.
Заранее благодарю вас за помощь!
Благодарим за ответ. Я попытался включить phoenix, но это изменило ошибку компилятора: error C2679: binary '[': оператор не найден, который принимает правый операнд типа boost :: phoenix :: actor ' –
namezero
Darn, я забыл очевидное ранее: 'std :: wstring' не является шаблоном выражения парсера, поэтому он не будет воспринимать семантическое действие точно. Используйте 'qi :: string' или, возможно, один из' boost :: spirit :: standard_wide' за отличную работу! _ (цитирование деталей из памяти обязательно для крайне ограниченного доступа в Интернет) _ – sehe