【发布时间】:2016-11-02 00:57:24
【问题描述】:
我有以下代码:
#include <gtest/gtest.h>
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/qi_eps.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_object.hpp>
#include <boost/spirit/include/phoenix_bind.hpp>
#include <boost/spirit/include/classic_core.hpp>
#include <boost/spirit/include/classic_confix.hpp>
#include <boost/spirit/include/classic_chset.hpp>
#include <boost/spirit/include/classic_utility.hpp>
#include <boost/fusion/include/cons.hpp>
#include <boost/fusion/include/at_c.hpp>
#include <boost/fusion/include/std_pair.hpp>
#include <boost/bind.hpp>
#include <boost/optional/optional_io.hpp>
#include <boost/variant.hpp>
namespace spi = boost::spirit;
namespace qi = boost::spirit::qi;
TEST(TestBoost, cpp_comment)
{
using qi::char_;
using qi::omit;
using qi::eoi;
typedef std::string::const_iterator iter;
const std::string example = "/* this should be ignored */";
auto b = std::begin(example);
auto e = std::end(example);
qi::rule<iter, std::string()> cpp_comment = char_('/') >> char_('/') >> *(char_ - '\n') >> (char_('\n') | omit[eoi]);
qi::rule<iter, std::string()> c_comment = char_('/') >> char_('*') >> *(char_ - "*/") >> char_('*') >> char_('/');
qi::rule<iter, std::string()> shell_comment = char_('#') >> *(char_ - '\n') >> (char_('\n') | omit[eoi]);
qi::rule<iter, std::string()> comment = cpp_comment
| c_comment
| shell_comment
;
std::string result;
EXPECT_TRUE(qi::parse(b, e, comment, result));
EXPECT_EQ(b, e);
EXPECT_EQ(result, example);
}
失败并出现以下错误:
[----------] 1 test from TestBoost
[ RUN ] TestBoost.cpp_comment
tests/spirit.cpp:56: Failure
Expected: result
Which is: "//* this should be ignored */"
To be equal to: example
Which is: "/* this should be ignored */"
[ FAILED ] TestBoost.cpp_comment (0 ms)
[----------] 1 test from TestBoost (0 ms total)
我不明白为什么。可能在 boost 文档中的某个地方提到了这种行为,但我找不到它。有人知道为什么会这样吗?
如果我这样写语义动作:
qi::rule<iter, std::string()> comment = cpp_comment[spi::_val = spi::_1]
| c_comment[spi::_val = spi::_1]
| shell_comment[spi::_val = spi::_1]
;
或者这个
qi::rule<iter, std::string()> comment = cpp_comment[spi::_val += spi::_1]
| c_comment[spi::_val += spi::_1]
| shell_comment[spi::_val += spi::_1]
;
它有效,但我真的很想知道为什么原始代码不起作用。
【问题讨论】:
-
请不要在你的最小代码中使用不必要的东西,比如谷歌测试或几十个包含。
标签: c++ boost-spirit boost-spirit-qi