Pau*_*gor 6 c++ parsing boost boost-spirit boost-spirit-qi
我正在阅读Boost Spirit(和Boost Fusion)教程(版本1.48.0).我一直在玩玩具员工的例子.链接到源是这里:
http://www.boost.org/doc/libs/1_48_0/libs/spirit/example/qi/employee.cpp
这是示例的语法:
employee_parser() : employee_parser::base_type(start)
{
using qi::int_;
using qi::lit;
using qi::double_;
using qi::lexeme;
using ascii::char_;
quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
start %=
lit("employee")
>> '{'
>> int_ >> ','
>> quoted_string >> ','
>> quoted_string >> ','
>> double_
>> '}'
;
}
qi::rule<Iterator, std::string(), ascii::space_type> quoted_string;
qi::rule<Iterator, employee(), ascii::space_type> start;
Run Code Online (Sandbox Code Playgroud)
我的修改删除了引号的处理,只解析分隔符之间的任何字符,并将其分配给解析器映射到的结构.
//quoted_string %= lexeme['"' >> +(char_ - '"') >> '"'];
start %=
lit("employee")
>> '{'
>> int_ >> ','
>> +(char_) >> ','
>> +(char_) >> ','
>> double_
>> '}'
;
Run Code Online (Sandbox Code Playgroud)
我的假设是char_包括所有字符,直到达到逗号.但是,使用以下字符串进行编译和运行会导致无法解析.
./employee
employee{10,my,name,20.0}
-------------------------
Parsing failed
-------------------------
Run Code Online (Sandbox Code Playgroud)
我也试图编写一个类似的解析器来自动转换为我的struct类型的相应类型.我确定我错过了一些根本错误的东西,只要为上面的输入字符串定义正确的语法,所以任何帮助都非常感谢!
谢谢!
psu*_*sur 11
+(char_)消耗一个或多个char,因此它也会消耗逗号并且永远不会移动到>> ','.这很贪心.
您应该+(char_ - ',')使用差异运算符编写-:
//...
>> int_ >> ','
>> +(char_ - ',') >> ','
>> +(char_ - ',') >> ','
>> double_
//...
Run Code Online (Sandbox Code Playgroud)
解析器+(char_ - ',')将消耗每个字符,直到达到逗号.之后它将移动>> ',',消耗它然后继续下一行+(char_ - ',')直到逗号等等.
有关此运算符的更多信息,请访问:http://www.boost.org/doc/libs/1_48_0/libs/spirit/doc/html/spirit/qi/reference/operator/difference.html
要么
如果要解析只包含字母的名称,还可以考虑编写仅接受字母的解析器:
//...
>> int_ >> ','
>> +(char_("a-zA-Z")) >> ','
>> +(char_("a-zA-Z")) >> ','
>> double_
//...
Run Code Online (Sandbox Code Playgroud)