I realize I noticed the question late, but let me add this anyway. I wrote a sample of an INI file parser in another answer:
This uses a 'simple' semantic action with line_pos_iterator
.
Here is the fruit of my labour: https://gist.github.com/1425972
- When
POSITIONINFO == 0
- input is streaming
- output is raw strings (well,
map<string, map<string, string> >
for the sections)
When POSITIONINFO == 1
- input is buffered
output is textnode_t
:
struct textnode_t {
int sline, eline, scol, ecol;
string_t text;
};
This means that the resulting map<textnode_t, map<textnode_t, textnode_t> >
is able to report exactly what (line,col) start and end points mark the individual text nodes.
Here is a reduced demo. For full description and extensive test cases see the original anser or the code at github
Demo Input
[Cat1]
name1=100 #skipped
name2=200 \#not \\skipped
name3= dhfj dhjgfd
Demo Output (POSITIONINFO == 0)
Parse success!
[Cat1]
name1 = 100
name2 = 200 \#not \\skipped
name3 = dhfj dhjgfd
Demo Output (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]