c++ - boost spirit 气 - 高效报价语法

标签 c++ boost boost-spirit boost-spirit-qi

我正在尝试在我的 boost spirit qi 语法中实现一个规则,该规则在类 Lisp 语言中的行为类似于 QUOTE。

类似于:QUOTE(a b c)

想法是 QUOTE 的左括号和右括号之间的任何内容都将被捕获到字符串文字中,而不是被进一步解析。

由于 '(' 或 ')' 字符可能出现在引号内, 我不能使用: '\"' >> *~char_('\"') >> '\"' 而是需要跟踪括号以确定引号结束。

例如:QUOTE(a ( b c ) d) 在这里,我想将内容“a ( b c ) d”解析为字符串文字。

我可以想到几种方法来做到这一点,一般的想法是保留一个局部变量来增加/减少括号深度等。

由于语义操作效率低下,我希望有人可以评论解决此问题的有效方法。

谢谢!

最佳答案

为此有 qi::raw[]

它公开了源迭代器范围,因此您可以决定从中复制或构造,例如 boost::string_ref。没有比这更有效的了。

例如:

qi::rule<It, std::string()> demo =
      qi::raw [
          qi::int_ >> '{' >> (qi::double_ % ',') >> '}'
      ];

关于c++ - boost spirit 气 - 高效报价语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24707486/

相关文章:

c++ - 在免费商店上创建对象有什么用?

c++ - 使用带有 CMake 和 Conan 的外部库的 undefined reference

c++ - 多线程事件检查器不打印任何东西

c# - 如何使 C# 控制台实用程序附加到 C++ exe?

c++ - frameSize.height*frameSize.width*nmixtures*(2 + 2*nchannels) 中的 * 是指指针还是乘法?

c++ - 我如何用精神正确解析这个?

c++ - boost::spirit 指针属性是否用 nullptr 初始化?

c++ - Boost.Spirit.Qi : dynamically create "difference" parser at parse time

c++ - boost 检查类型是否属于给定类型的列表

c++ - 如何获得指向 shared_ptr 的指针?