Spirit qi no_case指令应用于语法
spirit qi no_case directive applied to grammar
我有一个正常工作的语法,现在我想用它来解析一个不区分大小写的字符串。
我在Ubuntu 12.04 Linux上运行Boost 1.46。
我尝试了以下代码:
bool parseSuccess = qi::phrase_parse(begin, end,
qi::no_case[grammar], ascii::space, result);
但是no_case指令不起作用。
我做错了什么,或者指令不能与非终结符一起使用?
两件事:
-
no_case[]
要求包含以小写 指定的解析器表达式 - 它似乎没有在任何地方记录,但是
no_case
指令不在非终端解析器中传播。
在这个意义上,
no_case
类似于例如locals<>
,或Skipper,因为它们是解析器上下文的一部分;只有在这种情况下,大小写敏感才不受规则模板参数的控制。
我似乎记得Spirit X3将在这里获得一个更通用的设施,可能会消除这些限制。
显示实际限制的示例程序:
Live On Coliru
#define BOOST_SPIRIT_DEBUG
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
template <typename It, typename Skipper>
struct Parser : qi::grammar<It, std::string(), Skipper> {
Parser() : Parser::base_type(start) {
using namespace qi;
a_symbol += "aap", "noot", "mies";
start = raw [ no_case [ a_symbol >> "literal" >> char_("qwerty") >> -subrule_lexeme ] ];
subrule_lexeme = "also works";
BOOST_SPIRIT_DEBUG_NODES((start)(subrule_lexeme))
}
private:
qi::symbols<char, qi::unused_type> a_symbol;
qi::rule<It, std::string(), Skipper> start;
qi::rule<It, std::string()> subrule_lexeme;
};
// test
using It = std::string::const_iterator;
template <typename S = qi::space_type> void test(S const& s = S()) {
Parser<It, S> g;
for (std::string const& input : {
"aapt literal r",
"aApt liTeral R",
// hitting subrule_lexeme:
"aapt literal rtalso works",
"aApt liTeral RtALSO WoRkS",
})
{
It f = input.begin(), l = input.end();
std::string parsed;
bool ok = qi::phrase_parse(f, l, g, s, parsed);
if (ok)
std::cout << "Parsed successfully: '" << parsed << "'n";
else
std::cout << "Not matched ('" << input << "')n";
if (f!=l)
std::cout << " -- remaining unparsed input: '" << std::string(f,l) << "'n";
}
}
int main()
{
test(qi::space);
}
打印:
Parsed successfully: 'aap literal r'
Parsed successfully: 'aAp liTeral R'
Parsed successfully: 'aap literal r also works'
Parsed successfully: 'aAp liTeral R '
-- remaining unparsed input: 'ALSO WoRkS'
和完整的调试跟踪:
<start>
<try>aapt literal r</try>
<subrule_lexeme>
<try></try>
<fail/>
</subrule_lexeme>
<success></success>
<attributes>[[a, a, p, , , l, i, t, e, r, a, l, , r]]</attributes>
</start>
Parsed successfully: 'aap literal r'
<start>
<try>aApt liTeral R</try>
<subrule_lexeme>
<try></try>
<fail/>
</subrule_lexeme>
<success></success>
<attributes>[[a, A, p, , , l, i, T, e, r, a, l, , R]]</attributes>
</start>
Parsed successfully: 'aAp liTeral R'
<start>
<try>aapt literal rtalso </try>
<subrule_lexeme>
<try>also works</try>
<success></success>
<attributes>[[a, l, s, o, , w, o, r, k, s]]</attributes>
</subrule_lexeme>
<success></success>
<attributes>[[a, a, p, , , l, i, t, e, r, a, l, , r, , a, l, s, o, , w, o, r, k, s]]</attributes>
</start>
Parsed successfully: 'aap literal r also works'
<start>
<try>aApt liTeral RtALSO </try>
<subrule_lexeme>
<try>ALSO WoRkS</try>
<fail/>
</subrule_lexeme>
<success>ALSO WoRkS</success>
<attributes>[[a, A, p, , , l, i, T, e, r, a, l, , R, ]]</attributes>
</start>
Parsed successfully: 'aAp liTeral R '
-- remaining unparsed input: 'ALSO WoRkS'
相关文章:
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 使用 std::应用于 std::bind
- 如何将Affine3d应用于Vector3d
- 运算符 += 应用于 std::valarray<int*>
- 函数可以应用于 std::optional,并返回一个可选值吗?
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 当正斜杠运算符应用于C++中的字符串类型时,它会做什么
- 将MFPKEY_ASFMEDIASINK_AUTOADJUST_BITRATE应用于IMFSinkWriter
- (C++)(Visual Studio) 将高斯模糊滤镜应用于 RGB 中的灰度图像
- 在运行时将更改的环境变量应用于 QApplication
- Strcmp 类行为应用于C++中的对象列表
- 如何将 ItemDelegate 设置为仅应用于 QTreeView 中的父列
- 什么是应用于C 和CMAKE的定义
- 将对象方法从向量应用于C 的第二个向量中的对象
- STL:将功能应用于Adchacent_difference的结果,而无需额外的容器
- WXWIDGETS应用于WXStaticBitMap时,屏幕截图将大部分图像留为空白
- 如何将垂直纹理应用于QT Surface3D
- 如何将[[nodiscard]]属性应用于lambda
- 奇怪的语法构造 - 应用于 typedef 的运算符 () 使用 VS2015 成功编译
- 将 QPropertyAnimation 应用于 QRect