У меня есть сгенерированный сканер из flex, выход которого не используется yacc или bison.yylex () должен возвращать указатель на структуру памяти типа токена, а не int, указывающий тип токена.
// example definition from foo.l
[A-Za-z_][A-Za-z0-9_]* { return scanner_token(T_IDENTIFIER); }
// example implementation of scanner_token
token *scanner_token(name) {
token *t = (token *)calloc(1, sizeof(token));
t->name = name;
t->lexeme = (char *)calloc(yyleng + 1, 1);
if (t->lexeme == NULL) {
perror_exit("calloc");
}
memmove(t->lexeme, yytext, yyleng);
return t;
}
// example invocation of yylex
token *t;
t = (token *)yylex();
Конечно, компиляция предупреждает меня return возвращает целое число из указателя безприведение.
Я прочитал на страницах руководства по гибкому оборудованию, что YY_DECL
контролирует, как объявляется процедура сканирования:
YY_DECL
контролирует, как объявляется процедура сканирования,По умолчанию это «int yylex()
» или, если используются прототипы, «int
yylex(void)
».Это определение можно изменить, переопределив макрос "YY_DECL
".
Когда я пытаюсь переопределить YY_DECL
, результирующий файл C не удается скомпилировать.
#undef YY_DECL
#define YY_DECL (token *)yylex()
Как правильно выполнить то, что я пытаюсь сделать?