Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 提升精神气-高效引用语法_C++_Boost_Boost Spirit_Boost Spirit Qi - Fatal编程技术网

C++ 提升精神气-高效引用语法

C++ 提升精神气-高效引用语法,c++,boost,boost-spirit,boost-spirit-qi,C++,Boost,Boost Spirit,Boost Spirit Qi,我正在尝试在我的语法中实现一个规则,它的行为类似于Lisp语言中的引号 类似于:QUOTE(abc) 其思想是引号的开始括号和结束括号之间的任何内容都将被捕获为字符串文字,而不是进一步解析 由于“(”或“)”字符可能出现在引号内, 我不能使用:'\'>>*~char('\'')>'\'' 相反,我们需要跟踪括号来确定引号的结尾 例如:报价(a(b)c)d) 这里,我想将内容“a(bc)d”解析为字符串文本 我可以想出一些方法来做到这一点,一般的想法是保留一个局部变量来增加/减少括号深度,等等 由

我正在尝试在我的语法中实现一个规则,它的行为类似于Lisp语言中的引号

类似于:QUOTE(abc)

其思想是引号的开始括号和结束括号之间的任何内容都将被捕获为字符串文字,而不是进一步解析

由于“(”或“)”字符可能出现在引号内, 我不能使用:'\'>>*~char('\'')>'\'' 相反,我们需要跟踪括号来确定引号的结尾

例如:报价(a(b)c)d) 这里,我想将内容“a(bc)d”解析为字符串文本

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

由于语义操作的低效性,我希望有人能评论一种解决这个问题的有效方法


谢谢!

这有
qi::raw[]

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

例如:

qi::rule<It, std::string()> demo =
      qi::raw [
          qi::int_ >> '{' >> (qi::double_ % ',') >> '}'
      ];
qi::规则演示=
齐:生的[
qi::int_>>'{'>>(qi::double_>%',')>'}
];

语义操作的效率如何?它们在编译时可能会很麻烦,速度也很慢。但它们通常也非常高效(如果不是,通常是语法)。然而,对于语义操作的一些缺点,这非常直接地解决了我的问题。