Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

storing line numbers of expressions with boost.spirit 2

I am planning on doing a script transformation utility (for extended diagnostic information) using Boost.Spirit 2.

While there is support for line information etc. for parsing errors, how i can store line numbers for successfully parsed expressions with Qi?

like image 295
Georg Fritzsche Avatar asked Jan 25 '10 03:01

Georg Fritzsche


2 Answers

As per the mailing list, Spirit.Classic positional iterators can also be used with Spirit 2.
There is also an article on an iter_pos-parser on the Spirit-blog.

I will update when i had time to test.

like image 72
Georg Fritzsche Avatar answered Nov 15 '22 20:11

Georg Fritzsche


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:

  • Cross-platform way to get line number of an INI file where given option was found

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]
like image 33
sehe Avatar answered Nov 15 '22 19:11

sehe