сохранение номеров строк выражений с помощью boost.spirit 2
-
22-09-2019 - |
Вопрос
Я планирую использовать утилиту преобразования сценариев (для расширенной диагностической информации) с помощью Boost.Spirit 2.
Пока есть поддержка информации о линиях и т.д.в случае ошибок синтаксического анализа, как я могу сохранить номера строк для успешно проанализированных выражений с помощью Qi?
Решение
Согласно списку рассылки, Дух.Классический позиционные итераторы также можно использовать с Дух 2.
Также есть статья о iter_pos-парсер на Дух-блог.
Я обновлю, когда у меня будет время протестировать.
Другие советы
Я понимаю, что поздно заметил вопрос, но позвольте мне все равно добавить.Я написал образец парсера INI-файла в другом ответе:
Здесь используется «простое» семантическое действие с line_pos_iterator
.
Вот плод моего труда: https://gist.github.com/1425972
- Когда
POSITIONINFO == 0
- ввод потоковый
- вывод представляет собой необработанные строки (ну,
map<string, map<string, string> >
по разделам)
Когда
POSITIONINFO == 1
- ввод буферизуется
вывод
textnode_t
:struct textnode_t { int sline, eline, scol, ecol; string_t text; };
Это означает, что полученный
map<textnode_t, map<textnode_t, textnode_t> >
может точно сообщить, какие (строка, столбец) начальные и конечные точки отмечают отдельные текстовые узлы.
Вот уменьшенная демо-версия.Полное описание и обширные тестовые примеры см. оригинальный ответ или код на github
Демонстрационный ввод
[Cat1]
name1=100 #skipped
name2=200 \#not \\skipped
name3= dhfj dhjgfd
Демонстрационный вывод (POSITIONINFO == 0)
Parse success!
[Cat1]
name1 = 100
name2 = 200 \#not \\skipped
name3 = dhfj dhjgfd
Демонстрационный вывод (POSITIONINFO == 1)
Parse success!
[[L:1,C2 .. L1,C6:Cat1]]
[L:2,C2 .. L2,C7:name1] = [L:2,C8 .. L2,C12:100 ]
[L:6,C2 .. L6,C7:name2] = [L:6,C8 .. L6,C27:200 \#not \\skipped]
[L:7,C2 .. L7,C7:name3] = [L:7,C11 .. L7,C22:dhfj dhjgfd]
Здесь — еще одна полезная статья, в которой объясняется, как использовать исключение, которое phrase_parse
функция выбрасывает.
В статье описывается, как получить такие сообщения об ошибках:
Exception: parse error at file STDIN line 1 column 10
'123,42.0,a,1.4'
^- here