代码之家  ›  专栏  ›  技术社区  ›  Georg Fritzsche

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

  •  10
  • Georg Fritzsche  · 技术社区  · 14 年前

    我正在计划使用boost.spirit 2执行脚本转换实用程序(用于扩展诊断信息)。

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

    3 回复  |  直到 12 年前
        1
  •  4
  •   Georg Fritzsche    14 年前

    根据邮件列表, 精神。经典 positional iterators 也可用于 灵魂2 .
    还有一篇关于 iter_pos-parser 精神 -博客。

    我会在有时间测试时更新。

        2
  •  2
  •   Community rcollyer    7 年前

    我意识到我很晚才注意到这个问题,不过还是让我补充一下。我在另一个答案中编写了一个in i文件解析器示例:

    这将使用“简单”语义操作 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> > 能够准确地报告标记单个文本节点的起点和终点(行、列)。

    这里是一个简化的演示。有关完整描述和广泛的测试用例,请参见 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]
    
        3
  •  0
  •   Frank    12 年前

    Here 是另一篇解释如何使用 phrase_parse 函数引发。

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

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