我有一个从 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/

10-09 20:47