【发布时间】:2013-12-07 19:50:09
【问题描述】:
我正在尝试为带有 boost::spirit 的类 C 语言编写一个解析器,它使用继承的属性来传输有关变量范围的信息。例如,“namespace a { var b }”会将“a”作为属性传递给“var b”的解析器。
我在获取使用继承属性编译此代码的基本解析器时遇到了问题:
#ifndef CPARSER_DEF_HPP
#define CPARSER_DEF_HPP
#include <string>
#include <boost/spirit/include/qi.hpp>
namespace encoding = boost::spirit::ascii;
using boost::spirit::unused_type;
using boost::spirit::qi::rule;
template <typename Iterator>
struct cparser : boost::spirit::qi::grammar<
Iterator,
std::string(std::string),
encoding::space_type
>
{
rule<Iterator, std::string(std::string), encoding::space_type> start;
rule<Iterator, std::string(std::string), encoding::space_type> sym_list;
cparser() :
cparser::base_type(start)
{
sym_list = encoding::string(boost::spirit::qi::_r1);
start = sym_list(boost::spirit::qi::_r1);
}
};
#endif
这个解析器在 main() 中用cparser<std::string::const_iterator> parser 实例化。
我相信这个解析器应该接受一个 std::string 作为它的继承属性,解析匹配这个字符串的输入,然后把这个字符串作为一个综合属性返回。此示例代码无法编译,我无法弄清楚原因。我一直在使用启用 C++11 的 GCC 和 Clang 进行编译。任何一个编译器的输出都是巨大的(大约 1000 行),我无法理解它。 boost::spirit::qi::_r1的使用有问题吗?规则声明中的std::string(std::string) 有问题?
提前感谢您的帮助。
【问题讨论】:
-
我没有尝试过你的代码,但是当你说 GCC 时,你的意思是
gcc --std=c++11或g++ --std=c++11?您应该使用第二个。 -
对不起,问题没有更具体,我正在使用这个命令:
g++ -std=c++11 src/simple_cparser.cpp -c -o objs/simple_cparser.o,并且用 clang++ 替换 g++ 的相同命令。
标签: c++ boost boost-spirit