хранение номеров строк выражений с boost.spirit 2 - PullRequest
10 голосов
/ 25 января 2010

Я планирую использовать утилиту преобразования сценариев (для расширенной диагностической информации) с использованием Boost.Spirit 2.

Хотя существует поддержка информации о строках и т. Д. Для анализа ошибок, как я могу хранить номера строк для успешно проанализированных выражений с помощью Qi?

Ответы [ 3 ]

4 голосов
/ 01 февраля 2010

Согласно списку рассылки, Spirit.Classic позиционные итераторы также могут использоваться с Spirit 2 .
Также есть статья о iter_pos-parser в блоге Spirit .

Я обновлю, когда у меня будет время для тестирования.

2 голосов
/ 19 мая 2012

Я понимаю, что заметил вопрос поздно, но позвольте мне добавить это в любом случае. Я написал пример анализатора файлов 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> > может точно сообщить, какие начальные и конечные точки (line, col) отмечают отдельные текстовые узлы.

Вот уменьшенная демонстрация. Полное описание и подробные примеры тестов см. В оригинальном anser или коде 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]
0 голосов
/ 19 мая 2012

Здесь - еще одна полезная статья, которая объясняет, как использовать исключение, которое выдает функция phrase_parse.

В статье описывается, как получать сообщения об ошибках, например:

Exception: parse error at file STDIN line 1 column 10
'123,42.0,a,1.4'
          ^- here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...