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

#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 / … ?