我目前正在开发一个基于 Spirit 的表达式解析器,它应该允许最终(在遥远的未来)表达式,例如
"a*b*c"
"10+20*x.y.z"
"a.b.c[ a.b ][ e.c( d.e()*4 )].e.f( (a.b+23)*d, -23*b.e(a.b.c) ).x.y"
成员访问、数组订阅、函数调用和表达式的疯狂组合
[] -> subscription
() -> function call or expression bracket
. member chaining
目前我正在与成员链接上的空格跳跃作斗争
"a . b . c"
在我的世界中无效 - 但由于空格跳过功能而被解析
在线尝试我的减少样本:https://wandbox.org/permlink/o5kcYtUQEfKZqJgw
问题是第23行:
qi::rule<std::string::iterator, qi::blank_type, utree()> identifier_chain
= identifier >> *('.' >> identifier);
我不能在规则周围使用 qi::lexeme,我会得到一个 not Castable to Skipper 编译错误
但如果我将完整的标识符规则复制到identifier_chain规则中,它就会起作用
qi::rule<std::string::iterator, qi::blank_type, utree()> identifer_chain
= qi::lexeme[qi::ascii::alpha >> *(qi::ascii::alnum | '_')
>> *('.' >> qi::ascii::alpha >> *(qi::ascii::alnum | '_'))];
但这似乎非常多余,我认为当解析器不断增长时,复制会给我带来麻烦
知道如何使用词位或其他东西来保留我的“。”连接没有空格
使订阅端和成员链紧密相连
].a
a.b
这是我的解析器中唯一不需要空格的地方,其余的地方可以完美地减少解析器代码
感谢任何帮助/提示