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