Intensificador do Boost Spirit com atributos herdados - exemplo simples não compilará
Eu estou tentando escrever um analisador para uma linguagem semelhante ao C com boost :: spirit que usa atributos herdados para transferir informações sobre o escopo de variável. Por exemplo, "namespace a {var b}" passaria "a" como um atributo para o analisador de "var b".
Estou tendo problemas para obter um analisador básico usando atributos herdados para compilar este código:
#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
Este analisador é instanciado em main () comcparser<std::string::const_iterator> parser
.
Acredito que este analisador deva aceitar um std :: string como seu atributo herdado, parse input correspondendo a esta string, e então retorne a string como um atributo sintetizado. Este código de exemplo não compila e não consigo descobrir o porquê. Eu tenho compilado com o GCC e o Clang com o C ++ 11 ativado. A saída de qualquer um dos compiladores é enorme (aproximadamente 1.000 linhas), e não consigo fazer nenhum sentido. Existe algum problema com o uso deboost::spirit::qi::_r1
? Um problema comstd::string(std::string)
nas declarações de regra?
Agradeço antecipadamente por sua ajuda.