10

我计划使用 Boost.Spirit 2 做一个脚本转换实用程序(用于扩展诊断信息)。

虽然支持解析错误的行信息等,但我如何存储行号以使用 Qi 成功解析表达式?

4

3 回答 3

4

根据邮件列表,Spirit.Classic 位置迭代器也可以与Spirit 2一起使用。Spirit
-blog 上还有一篇关于iter_pos-parser的文章。

当我有时间测试时,我会更新。

于 2010-02-01T09:50:10.873 回答
2

我意识到我注意到这个问题很晚,但无论如何让我添加这个。我在另一个答案中写了一个 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> >能够准确报告什么(行,列)起点和终点标记了各个文本节点。

这是一个简化的演示。有关完整描述和广泛的测试用例,请参阅原始分析器或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]
于 2012-05-19T08:58:12.353 回答
0

是另一篇有用的文章,解释了如何使用phrase_parse函数抛出的异常。

这篇文章描述了如何获取这样的错误消息:

Exception: parse error at file STDIN line 1 column 10
'123,42.0,a,1.4'
          ^- here
于 2012-05-19T02:35:37.243 回答