用boost.spirit 2存储表达式的行号

时间:2010-01-25 03:52:50

标签: c++ boost boost-spirit

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

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

3 个答案:

答案 0 :(得分:4)

根据邮件列表, Spirit.Classic positional iterators也可以与 Spirit 2 一起使用。
关于精神 -blog的iter_pos-parser上还有一篇文章。

我有时间测试时会更新。

答案 1 :(得分: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> >能够准确报告哪些(line,col)起点和终点标记各个文本节点。

这是一个简化演示。有关完整说明和大量测试用例,请参阅the original 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]

答案 2 :(得分:0)

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

本文介绍了如何获取如下错误消息:

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