开发者

storing line numbers of expressions with boost.spirit 2

I am planning on doing a script transformation utility (for extended diagnostic 开发者_如何学Cinformation) 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?


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.


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]


Here is another useful article that explains how to use the exception that the phrase_parse function throws.

The article describes how to get error messages like this:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜