gpt4 book ai didi

c++ - 为什么 Bison 仍然使用 `int yylex(void)`而找不到 `int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param)`?

转载 作者:行者123 更新时间:2023-12-02 10:05:27 27 4
gpt4 key购买 nike

我正在尝试将位置信息添加到flex和bison中。但是我的野牛仍然使用int yylex(void),但是找不到int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param)

这是我的lex文件Token.l:

%option noyywrap nodefault yylineno 8bit
%option bison-locations bison-bridge

%{
#include ...
#include "Parser.tab.hpp"

#define T_SAVE_TOKEN yylval->literal = strndup(yytext, yyleng)
#define T_SAVE_TOKEN_X(p, q) yylval->literal = strndup(yytext+(p), yyleng-(p)-(q))
#define T_SAVE_NO_TOKEN yylval->literal = nullptr
#define T_TOKEN(t) (yylval->token = t)

#define YY_USER_ACTION \
yylloc->first_line = yylloc->last_line; \
yylloc->first_column = yylloc->last_column; \
if (yylloc->last_line == yylineno) { \
yylloc->last_column += yyleng; \
} else { \
yylloc->last_line = yylineno; \
yylloc->last_column = yytext + yyleng - strrchr(yytext, '\n'); \
}

%}

%%
...
%%

...

这是我的野牛文件 Parser.y:
%locations

%code top {
#include ...
}

%code {
extern int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param);
}

/* different ways to access data */
%union {
char *literal;
int token;
}


这是我的用于生成C++代码的shell命令:
flex -o Token.yy.cpp Token.l
bison -d -o Parser.tab.cpp --defines=Parser.tab.hpp Parser.y

这是我的错误信息:
Parser.tab.cpp:1674:16: error: no matching function for call to 'yylex'
yychar = yylex ();
^~~~~
/Users/rolin/workspace/github/coli/src/./Token.h:16:12: note: candidate function not viable: requires 2 arguments, but 0 were provided
extern int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param);
^

请帮我。

最佳答案

您似乎需要一个可重入的解析器。

要让野牛对此提供支持,您必须使用标志

%pure-parser

在野牛宣言中的某个地方。然后,使用两个参数 yylex()lval调用 lloc函数。

关于c++ - 为什么 Bison 仍然使用 `int yylex(void)`而找不到 `int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param)`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60410304/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com