【发布时间】:2021-05-10 20:12:03
【问题描述】:
我正在解析一个由名称-值对组成的简单配置文件格式:
an_int_option 42;
a_string_option "foo";
an_identifier_option somevalue;
我有一个解析每个项目的基本规则:
typedef boost::variant<int, double, std::string> config_value;
struct config_item {
std::string name;
config_value value;
};
qi::rule<Iterator, config_value(), ascii::space_type> value;
qi::rule<Iterator, config_item(), ascii::space_type> item;
value =
identifier
| qstring
| my_double
| qi::int_
;
item =
identifier[at_c<0>(_val) = _1]
>> value[at_c<1>(_val) = _1]
>> ';'
;
这很好用,并为我提供了每个项目的 config_value。
现在我想将找到每个值的位置存储在输入文件中,这样如果用户配置了无效选项,我可以报告发生错误的文件行号和列号。
到目前为止,我发现的最佳选择是 raw[],它可以让我执行以下操作:
item =
raw[ identifier ] [do_something_with_iterators(_1)]
>> raw[ value ] [do_something_with_iterators(_1)]
>> ';'
;
...但是由于raw[] 丢弃了该属性,我的do_something_with_iterators 现在必须像在旧式Spirit 中那样手动解析值 - 当我已经有了解析值时,这似乎是很多不必要的工作。 .
【问题讨论】:
标签: c++ boost boost-spirit