【发布时间】:2020-03-25 09:12:32
【问题描述】:
我的解析器快要工作了 :) (仍然对 Spirit 功能集(和编译时间)以及堆栈溢出时非常受欢迎的社区感到惊讶)
在线试用小样: http://coliru.stacked-crooked.com/a/1c1bf88909dce7e3
所以我学会了使用更多的词位规则并尝试防止 no_skip - 结果我的规则更小更好读,但现在我坚持 结合 lexeme-rules 和 skipping-rules 似乎不可能的事情(编译时错误,警告不能转换为 Skipper)
我的问题是订阅中的逗号分隔列表 它不会跳过表达式周围的空格
解析:
"a.b[a,b]"
失败:
"a.b[ a , b ]"
这是我的规则:
qi::rule<std::string::const_iterator, std::string()> identifier_chain;
qi::rule<std::string::const_iterator, std::string()>
expression_list = identifier_chain >> *(qi::char_(',') >> identifier_chain);
qi::rule < std::string::const_iterator, std::string() >
subscription = qi::char_('[') >> expression_list >> qi::char_(']');
qi::rule<std::string::const_iterator, std::string()>
identifier = qi::ascii::alpha >> *(qi::ascii::alnum | '_');
identifier_chain = identifier >> *(('.' >> identifier) | subscription);
您可以看到所有规则都是“词素”,我认为订阅规则应该是 ascii::space_type 跳过器,但它不会编译
我应该在 expression_list 中 identifier_chains 的前后添加空间吞噬者吗?
感觉就像在写一个正则表达式:(
expression_list = *qi::blank >> identifier_chain >> *(*qi::blank >> qi::char_(',') >> *qi::blank >> identifier_chain >> *qi::blank);
它有效,但我读到这最终会让我得到一个更大的解析器(自己处理所有跳过的空间)
感谢任何建议
顺便说一句:如果用qi::char_('.')包围indentifier_chain中的'.',知道为什么我无法编译
identifier_chain = identifier >> *(('.' >> identifier) | subscription);
更新:
我已经按照 sehe 的建议更新了我的表情列表
qi::rule<std::string::const_iterator, spirit::ascii::blank_type, std::string()>
expression_list = identifier_chain >> *(qi::char_(',') >> identifier_chain);
qi::rule < std::string::const_iterator, std::string() >
subscription = qi::char_('[') >> qi::skip(qi::blank)[expression_list] >> qi::char_(']');
但由于不可转换的船长仍然会出现编译错误:http://coliru.stacked-crooked.com/a/adcf665742b055dd
我也尝试将 identifer_chain 更改为
identifier_chain = identifier >> *(('.' >> identifier) | qi::skip(qi::blank)[subscription]);
但我仍然无法编译示例
【问题讨论】:
-
使用
char_()将字符公开为合成属性序列中的元素,破坏属性传播,因为它需要字符串,而不是字符串和字符的元组/序列。lit()根本不公开属性,只是匹配所需的输入。
标签: c++ boost-spirit boost-spirit-qi