2014-11-14 1 views
3

Я использую Boost, дух, чтобы разобрать, что, по существу, математическое выражение (часть текста проводится в m_formula, который является std::string)Рише возврата сообщения об ошибке для повышения :: дух :: й разбор

Я установил

double value; 
auto first = m_formula.begin(); 
auto last = m_formula.end(); 

то для грамматики grammar, я анализирую m_formula:

boost::spirit::qi::phrase_parse(first, last, grammar, ascii::space, value); 

в настоящее время у меня есть

if (first != last){ 
    /*ToDo - display "invalid formula " + m_formula*/ 
} 

Есть ли способ улучшить обработку ошибок, например, сообщить мне, какой бит формулы заставлял парсер терпеть неудачу?

ответ

3

Вы можете использовать точки ожидания, которые будут поднять qi::expectation_failure<It> исключений.

В них содержится информация о том, какое правило не удалось (и исходные итераторы, указывающие на начало сопоставления для выражения парсера, а также точки броска).

qi::on_error представляет собой механизм для обработки этих неудач ожидания внутри вашей грамматики (в случае, если вы не хотите, чтобы поймать их снаружи.

Теперь, если ваш вход многострочный, вы могли бы хотеть, чтобы следить за вход line/column information. line_pos_iterator делает это. Если вы это сделаете, посмотрите на директиву repository::qi::iter_pos, чтобы получить информацию о строке/столбце, представленную в качестве атрибутов в ваших правилах.

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