我有一个从 flex 生成的扫描仪,它的输出不被 yacc 或野牛消耗。 yylex() 需要返回一个指向类似 token 的结构内存的指针,而不是一个指示 token 类型的 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 从指针生成整数而不进行强制转换。
我在 flex 手册页中读到
YY_DECL
控制如何声明扫描例程:当我尝试重新定义
YY_DECL
时,生成的 C 文件无法编译。#undef YY_DECL
#define YY_DECL (token *)yylex()
完成我想要做的事情的正确方法是什么?
最佳答案
正常的语法是:
#define YY_DECL token *yylex(void)
这个最小的 Flex 源文件展示了如何:
%{
typedef struct token { int tok; } token;
#define YY_DECL token *yylex(void)
token t;
%}
%%
. { t.tok = 1; return &t; }
%%
它为我编译。
关于c - 从 yylex 返回 "non-ints",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3796598/