- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的解析器快要工作了:)
(仍然对Spirit功能集(和编译时)以及非常欢迎的社区感到惊讶)
在线尝试的小样本:
http://coliru.stacked-crooked.com/a/1c1bf88909dce7e3
所以我学会了使用更多的lexeme-rules并尝试防止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);
expression_list = *qi::blank >> identifier_chain >> *(*qi::blank >> qi::char_(',') >> *qi::blank >> identifier_chain >> *qi::blank);
'.'
包围indentifier_chain中的
qi::char_('.')
,为什么我不能编译
identifier_chain = identifier >> *(('.' >> identifier) | subscription);
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_(']');
identifier_chain = identifier >> *(('.' >> identifier) | qi::skip(qi::blank)[subscription]);
最佳答案
我先前链接的答案描述了所有组合(如果我没有记错的话):Boost spirit skipper issues
简而言之:
rule<It, Skipper[, Attr()]>
或rule<It, Attr(), Skipper>
)都必须使用兼容的船长(可以分配给Skipper
类型的表达式)调用。 rule<It[, Attr()]>
)将隐式表现为lexeme,这意味着不会跳过任何输入字符。 rule<It, blank_type> a;
rule<It> b; // b is implicitly lexeme
b
调用
a
:
a = "test" >> b;
a
调用
b
时,您会发现必须提供船长:
b = "oops" >> a; // DOES NOT COMPILE
b = "okay" >> qi::skip(qi::blank) [ a ];
should i add space eaters in the front and back of identifier_chains in the expression_list?
phrase_parse
:
" a.b " OK: ( "a" "b" )
----
"a . b" Failed
Remaining unparsed: "a . b"
----
rule<std::string::const_iterator> main_rule =
qi::skip(qi::blank) [ identifier_chain ];
parse
。
关于c++ - 如何结合跳过和不跳过(lexeme)规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60845800/
我的解析器快要工作了:) (仍然对Spirit功能集(和编译时)以及非常欢迎的社区感到惊讶) 在线尝试的小样本: http://coliru.stacked-crooked.com/a/1c1bf88
我正在尝试解析包含连字符的逗号分隔标记。但是 lexeme 会忽略所有的连字符。部分程序如下。 #include #include namespace qi = boost::spirit::qi
我一直在使用 Boost 库中的 Spirit Qi 用 C++ 编写语法。作为该语言的新手,很难习惯该库的语法和怪癖,但现在我有点了解它的工作原理。 我在使用 qi::lexeme 时遇到错误。我的
考虑: struct s { AttrType f(const std::string &); }; ...和一个带有属性 AttrType 的规则 r: template using rule
我正在使用 texticle (https://github.com/tenderlove/texticle) 库进行全文 postgresql 搜索。 库生成的 sql 如下所示: to_tsvec
我是一名优秀的程序员,十分优秀!