Boost.Spirit.Qi: Как сообщить о предупреждениях парсера?

Как сообщить о предупреждениях парсера? Аналогично отчету об ошибке, но синтаксический анализатор не должен останавливаться. Записывать в журнал только предупреждающее сообщение и подвыражение, вызвавшее предупреждение.

Пример ввода:

 select * from table where row>='' && row<>'hello'

Ожидаемый результат:

 Warning: expression is always true: row>=''
 Warning: && is deprecated, use AND: row>='' && row<>'hello'
 Warning: <> is deprecated, use !=: row<>'hello'

person user222202    schedule 26.05.2011    source источник


Ответы (1)


Если вы хотите продолжить синтаксический анализ, вы можете зарегистрировать обработчик ошибок, как и раньше, за исключением того, что вы должны указать accept в качестве политики обработчиков:

rule<Iterator> r = ... > !eps;
on_error<accept>(r, handler);

Добавленный > !eps в любом случае вызывает ошибку и вызывает handler как обычно, но он примет совпадение после «ошибки», продолжая, как будто ничего не произошло.

person hkaiser    schedule 26.05.2011
comment
Благодарность! есть ли способ получить текущий итератор в семантическом действии, не назначая _pass=false, повышая on_error и затем продолжая синтаксический анализ? кажется проще просто выводить предупреждения из кода семантического действия, но я нашел способ получить там входной итератор (или, лучше, диапазон итератора текущего разбираемого выражения), чтобы включить выдержку из входного текста в предупреждение. - person user222202; 30.05.2011
comment
Вы видели это: boost-spirit.com/home/articles/qi-example/ ? - person hkaiser; 30.05.2011