Ответ 1
В соответствии с рассылкой, Spirit Spirit.Classic позиционные итераторы также могут использоваться с Spirit 2.
В блоге Spirit также есть статья о iter_pos-parser.
Я обновлю, когда у меня будет время для тестирования.
Я планирую сделать утилиту преобразования script (для расширенной диагностической информации) с помощью Boost.Spirit 2.
Несмотря на то, что для анализа ошибок существует поддержка строки и т.д., как я могу хранить номера строк для успешно разобранных выражений с помощью Qi?
В соответствии с рассылкой, Spirit Spirit.Classic позиционные итераторы также могут использоваться с Spirit 2.
В блоге Spirit также есть статья о iter_pos-parser.
Я обновлю, когда у меня будет время для тестирования.
Я понимаю, что я заметил этот вопрос поздно, но позвольте мне добавить это в любом случае. Я написал образец синтаксического анализатора 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
Parse success!
[Cat1]
name1 = 100
name2 = 200 \#not \\skipped
name3 = dhfj dhjgfd
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