Я пытаюсь использовать Boost Дух, чтобы разобрать следующую грамматику: фраза: существительного глагола предложения конъюнкции предложениенеобработанного исключения при помощи Boost Духа для анализа грамматики
конъюнкция: «и»
существительное: "птицы" "кошки"
глагол: "летать" "мяу"
Разбор происходит успешно, когда грамматика содержит только существительное >> правило глагола. , когда грамматика изменена, чтобы включить предложение >> соединение >> правило предложения, и я поставлю недопустимый ввод, такой как «bird fly» вместо «birdfly». Я получаю необработанное исключение, когда программа запускается.
вот код, который модифицирован из примеров, найденных на повышающем доке
#define BOOST_VARIANT_MINIMIZE_SIZE
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/lex_lexertl.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_statement.hpp>
#include <boost/spirit/include/phoenix_container.hpp>
#include <iostream>
#include <string>
using namespace boost::spirit;
using namespace boost::spirit::ascii;
template <typename Lexer>
struct token_list : lex::lexer<Lexer>
{
token_list()
{
noun = "birds|cats";
verb = "fly|meow";
conjunction = "and";
this->self.add
(noun)
(verb)
(conjunction)
;
}
lex::token_def<std::string> noun, verb, conjunction;
};
template <typename Iterator>
struct Grammar : qi::grammar<Iterator>
{
template <typename TokenDef>
Grammar(TokenDef const& tok)
: Grammar::base_type(sentence)
{
sentence = (tok.noun>>tok.verb)
|
(sentence>>tok.conjunction>>sentence)>>eoi
;
}
qi::rule<Iterator> sentence;
};
int main()
{
typedef lex::lexertl::token<char const*, boost::mpl::vector<std::string>> token_type;
typedef lex::lexertl::lexer<token_type> lexer_type;
typedef token_list<lexer_type>::iterator_type iterator_type;
token_list<lexer_type> word_count;
Grammar<iterator_type> g (word_count);
std::string str = "birdsfly";
//std::string str = "birds fly"; this input caused unhandled exception
char const* first = str.c_str();
char const* last = &first[str.size()];
bool r = lex::tokenize_and_parse(first, last, word_count, g);
if (r) {
std::cout << "Parsing passed"<< "\n";
}
else {
std::string rest(first, last);
std::cerr << "Parsing failed\n" << "stopped at: \""
<< rest << "\"\n";
}
system("PAUSE");
return 0;
}
sehe, гуру SO.com Дух в этом снова :) – rubenvb
@cv_and_he я считал, он» вернемся к этому, когда будете готовы. Давайте не будем нажимать OP - он просто пропустит детали и не поймет, если мы заполним детали для него. ** Редактировать ** Спасибо в любом случае за то, что выкопали ** [соответствующую ссылку] (http://stackoverflow.com/questions/13361519/troubles-with-boostspiritlex-whitespace/13367439#13367439) ** в случае, если он хочет возглавить над. Извините, если я предположил, что ваш комментарий был нежелательным. Приветствую. – sehe
Пожалуйста, прекратите стирание истории. – rubenvb