Подтвердить что ты не робот

Сохранение номеров строк выражений с boost.spirit 2

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Я понимаю, что я заметил этот вопрос поздно, но позвольте мне добавить это в любом случае. Я написал образец синтаксического анализатора 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> > способен точно сообщить, что (начальная и конечная точки линии, 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]

Ответ 3

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

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

Exception: parse error at file STDIN line 1 column 10
'123,42.0,a,1.4'
          ^- here