2014-01-06 2 views
2

Я хочу проанализировать ввод как «start abc end», чтобы извлечь «abc».Как получить boost :: spirit, чтобы остановить синтаксический анализ по ключевому слову?

Вот мой тестовый код:

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

namespace qi = boost::spirit::qi; 

int main(int argc, char* argv[]) 
{ 
    typedef std::string::const_iterator iterator; 

    qi::rule<iterator, std::string(), qi::space_type> rule = 
     "start" >> 
     qi::lexeme[+qi::char_] >> 
     "end"; 

    std::string input("start abc end"); 
    auto iter = input.begin(); 
    std::string result; 
    qi::phrase_parse(iter, input.end(), rule, qi::space, result); 

    std::cout << "Result: " << result << std::endl; 
} 

Выхода "Результат: а конца".

+0

Обратите внимание, что если вы хотите проверить результат 'qi :: фраза_parse', вы увидите, что синтаксический анализ не удался. –

+0

Я заметил это и предположил, что «конец» был израсходован раньше, парсер не смог завершить матч. –

+0

Я не смог скомпилировать ваш код, какую версию boost вы используете? – HeyYO

ответ

3

Проблема в том, что вы ожидаете, что ваш синтаксический анализатор остановится в пробеле или ключевое слово «конец». Но ваш синтаксический анализатор в принципе принимает любого персонажа после ключевого слова «начать».

+char_ 

Над парсером означает: любая последовательность символов длиннее 1 (включая пробелы).

Как-то вам нужно сказать вашему парсеру, чтобы он остановился на слове «пробел» или «конец». Для примера ниже синтаксический анализатор не будет принимать символы до «конца» ключевое слово

+(char_ - lit("end")) 

Я предлагаю вам взглянуть на список парсеров в духе документации. http://www.boost.org/doc/libs/1_55_0/libs/spirit/doc/html/spirit/qi/quick_reference/qi_parsers.html

+0

Спасибо за ответ, но это не помогло. Изменение правила для \t й :: правил <итератора, станд :: строка(), й :: space_type> Правило = \t \t "Пуск" >> \t \t й :: лексема [+ й :: char_] - qi :: lit ("end") >> \t \t "end"; дал тот же результат. –

+0

Я считаю, что это должно быть так: «start» >> qi :: lexeme [+ qi :: char_ - qi :: lit ("end")] >> "end" ' – HeyYO

+0

Это перестановка, которую я не пробовал но это не помогло. Получил больше? –

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

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