сохранение номеров строк выражений с помощью boost.spirit 2

StackOverflow https://stackoverflow.com/questions/2130099

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top