#c #parsing #warnings #boost-spirit #boost-spirit-qi
#c #синтаксический анализ #предупреждения #boost-spirit #boost-spirit-qi
Вопрос:
Как сообщать о предупреждениях синтаксического анализатора? Аналогично сообщению об ошибке, но анализатор не должен останавливаться. Предупреждение было вызвано только предупреждающим сообщением журнала и подвыражением.
Пример ввода:
select * from table where row>='' amp;amp; row<>'hello'
Ожидаемый результат:
Warning: expression is always true: row>=''
Warning: amp;amp; is deprecated, use AND: row>='' amp;amp; row<>'hello'
Warning: <> is deprecated, use !=: row<>'hello'
Ответ №1:
Если вы хотите продолжить синтаксический анализ, вы можете зарегистрировать обработчик ошибок, как и раньше, за исключением того, что вы должны указать accept
в качестве политики обработчиков:
rule<Iterator> r = ... > !eps;
on_error<accept>(r, handler);
Добавленное > !eps
вызывает ошибку в любом случае и вызывает handler
как обычно, но оно примет совпадение после ‘error’, продолжая, как будто ничего не произошло.
Комментарии:
1. Спасибо! есть ли какой-либо способ запустить текущий итератор в семантическом действии, не присваивая _pass=false, вызывая on_error и затем продолжая синтаксический анализ? кажется, проще просто печатать предупреждения из кода семантического действия, но я нашел способ, как получить там входной итератор (или, лучше, диапазон итераторов текущего анализируемого выражения), чтобы включить выдержку из входного текста в предупреждающее сообщение.
2. Вы видели это: boost-spirit.com/home/articles/qi-example / … ?