3

我是 Boost.Spirit 和 Boost.Test 的新手,我想知道您如何验证语法的正确性。下面是我目前如何做的简化版本,我很确定有更好的方法:

每个测试用例都有一对包含要解析的文本和用分号分隔的预期结果的两个字符串。

解析函数执行实际解析并返回一个应该等于预期结果的字符串。

 std::string parse(std::string const & line) {
  std::string name;
  int hours;

  rule<> top_rule = ... ; // rule assignes values to 'name' and 'hours'

  parse_info<> info = parse(line.c_str(), top_rule);

  if(info.full) {
    std::stringstream sstr;
    sstr << name << ";" << hours;

    return sstr.str();
  }

  return "parser failed.";
}

BOOST_AUTO_TEST_SUITE( TestSuite )

BOOST_AUTO_TEST_CASE( TestCase ) {
  BOOST_CHECK_EQUAL(parse("Tom worked for 10 hours."), "Tom;10");
}

BOOST_AUTO_TEST_SUITE_END()
4

2 回答 2

1

一般来说,你的方法对我来说似乎很好。我可能会将测试类分组为具有描述性名称的函数,例如 TestInvalidGrammar、TestErrorHandling、TestNestedGrammar 等,并从主函数调用这些函数。

我相信您已经阅读了文档,但如果有帮助,请查看示例。

于 2009-02-05T16:25:12.333 回答
1

在这里你可以看到他们(boost spirit作者)如何测试他们自己的解析器:http ://svn.boost.org/svn/boost/trunk/libs/spirit/test/qi/grammar.cpp 。对于 qi 的每个部分,您可以在此处找到 C++ 文件:http: //svn.boost.org/svn/boost/trunk/libs/spirit/test/qi/

于 2013-12-09T14:02:27.150 回答