Я пытаюсь написать компилятор и использую flex / bison для сканирования и анализа.Мой вопрос о том, как эти 2 могут общаться, чтобы lex передавал тип токена и (если необходимо) семантическое значение.
Проблема в том, что я нахожу разные (противоречивые?) Документы.
Например, здесь они упоминают об использовании подполей yylval для семантического значения и возвращают тип токена (возможно, и целое число).
[0-9]+ {
yylval->build<int> () = text_to_int (yytext);
return yy::parser::token::INTEGER;
}
[a-z]+ {
yylval->build<std::string> () = yytext;
return yy::parser::token::IDENTIFIER;
}
Но тогда я вижу (такжев официальных документах) this :
"-" return yy::calcxx_parser::make_MINUS (loc);
"+" return yy::calcxx_parser::make_PLUS (loc);
"*" return yy::calcxx_parser::make_STAR (loc);
"/" return yy::calcxx_parser::make_SLASH (loc);
"(" return yy::calcxx_parser::make_LPAREN (loc);
")" return yy::calcxx_parser::make_RPAREN (loc);
":=" return yy::calcxx_parser::make_ASSIGN (loc);
{int} {
errno = 0;
long n = strtol (yytext, NULL, 10);
if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE))
driver.error (loc, "integer is out of range");
return yy::calcxx_parser::make_NUMBER (n, loc);
}
{id} return yy::calcxx_parser::make_IDENTIFIER (yytext, loc);
. driver.error (loc, "invalid character");
<<EOF>> return yy::calcxx_parser::make_END (loc);
Здесь yylval вообще не упоминается, и мы возвращаем что-то странное make _ ???функции, которые я не понимаю, где они определены, какие параметры они принимают и что возвращают.
Может кто-нибудь объяснить мне, в чем разница между этими двумя подходами, и, если мне следует использовать второй,краткое объяснение этих таинственных марок _ ???методы?
Заранее спасибо!