我计划使用Boost.Spirit 2进行脚本转换实用程序(用于扩展诊断信息)。
虽然支持行信息等解析错误,但是如何用Qi存储成功解析表达式的行号?
答案 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
Parse success!
[Cat1]
name1 = 100
name2 = 200 \#not \\skipped
name3 = dhfj dhjgfd
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