Intento implementar un Lexer para un pequeño lenguaje de programación con Boost Spirit.No puedo obtener el valor de cadena de un token
tengo para obtener el valor de una ficha y me da una excepción bad_get:
por terminado llama después de lanzar una instancia de 'boost :: bad_get'
lo que(): impulso :: bad_get: valor no consigue utilizando impulso :: get Aborted
obtengo esta excepción cuando se hace:
std::string contents = "void";
base_iterator_type first = contents.begin();
base_iterator_type last = contents.end();
SimpleLexer<lexer_type> lexer;
iter = lexer.begin(first, last);
end = lexer.end();
std::cout << "Value = " << boost::get<std::string>(iter->value()) << std::endl;
Mi l exer se define así:
typedef std::string::iterator base_iterator_type;
typedef boost::spirit::lex::lexertl::token<base_iterator_type, boost::mpl::vector<unsigned int, std::string>> Tok;
typedef lex::lexertl::actor_lexer<Tok> lexer_type;
template<typename L>
class SimpleLexer : public lex::lexer<L> {
private:
public:
SimpleLexer() {
keyword_for = "for";
keyword_while = "while";
keyword_if = "if";
keyword_else = "else";
keyword_false = "false";
keyword_true = "true";
keyword_from = "from";
keyword_to = "to";
keyword_foreach = "foreach";
word = "[a-zA-Z]+";
integer = "[0-9]+";
litteral = "...";
left_parenth = '(';
right_parenth = ')';
left_brace = '{';
right_brace = '}';
stop = ';';
comma = ',';
swap = "<>";
assign = '=';
addition = '+';
subtraction = '-';
multiplication = '*';
division = '/';
modulo = '%';
equals = "==";
not_equals = "!=";
greater = '>';
less = '<';
greater_equals = ">=";
less_equals = "<=";
whitespaces = "[ \\t\\n]+";
comments = "\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\/";
//Add keywords
this->self += keyword_for | keyword_while | keyword_true | keyword_false | keyword_if | keyword_else | keyword_from | keyword_to | keyword_foreach;
this->self += integer | litteral | word;
this->self += equals | not_equals | greater_equals | less_equals | greater | less ;
this->self += left_parenth | right_parenth | left_brace | right_brace;
this->self += comma | stop;
this->self += assign | swap | addition | subtraction | multiplication | division | modulo;
//Ignore whitespaces and comments
this->self += whitespaces [lex::_pass = lex::pass_flags::pass_ignore];
this->self += comments [lex::_pass = lex::pass_flags::pass_ignore];
}
lex::token_def<std::string> word, litteral, integer;
lex::token_def<lex::omit> left_parenth, right_parenth, left_brace, right_brace;
lex::token_def<lex::omit> stop, comma;
lex::token_def<lex::omit> assign, swap, addition, subtraction, multiplication, division, modulo;
lex::token_def<lex::omit> equals, not_equals, greater, less, greater_equals, less_equals;
//Keywords
lex::token_def<lex::omit> keyword_if, keyword_else, keyword_for, keyword_while, keyword_from, keyword_to, keyword_foreach;
lex::token_def<lex::omit> keyword_true, keyword_false;
//Ignored tokens
lex::token_def<lex::omit> whitespaces;
lex::token_def<lex::omit> comments;
};
¿Hay alguna otra manera de obtener el valor de un Token?
en la lectura de nuevo, noto que se especifica 'lex :: omit' como el tipo de atributo token. Estos tokens no expondrán ningún valor de datos (ni siquiera pares de iteradores). Este podría ser tu problema. De lo contrario, recomiendo analizar el uso de Qi en la parte superior de los iteradores de tokens: obtener lo mejor de ambos mundos. – sehe
He verificado y lamentablemente este no es el problema. Solo uso boost :: get en un token del tipo bueno y eso debería tener el valor. –