Flex/Bison';yylex';:函数不接受3个参数

Flex/Bison';yylex';:函数不接受3个参数,bison,flex-lexer,Bison,Flex Lexer,我有以下Lexer.l和Parser.y文件 莱克瑟 %{ #include "Parser.h" %} %option yylineno %option outfile="Lexer.cpp" header-file="Lexer.h" %option warn nodefault %option reentrant noyywrap never-interactive nounistd %option bison-bridge

我有以下Lexer.l和Parser.y文件

莱克瑟

%{
#include "Parser.h"
%}

%option yylineno
%option outfile="Lexer.cpp" header-file="Lexer.h"
%option warn nodefault
%option reentrant noyywrap never-interactive nounistd
%option bison-bridge
语法分析器

%{
#include "Parser.h"
#include "Lexer.h"

extern int yyerror(yyscan_t scanner, const char *msg) 
{printf("\r\nError: %s", msg); return 1;}

%}
 
%code requires {     
#ifndef YY_TYPEDEF_YY_SCANNER_T
#define YY_TYPEDEF_YY_SCANNER_T
typedef void* yyscan_t;
#endif
}
 
%output  "Parser.cpp"
%defines "Parser.h"     
%define api.pure
%pure-parser
%lex-param   { yyscan_t scanner }
%parse-param {yyscan_t scanner }
 
一切正常

现在,我正在尝试获取令牌的列和行;当我使用@1.第一行时,我得到以下错误:

“yylex”:函数不接受3个参数

“yyerror”:函数不接受3个参数

对于这个错误,我查看了编译器对它的要求,并实现了它

但是,对于yylex,我不知道该回报什么。 我试着用2个参数的yylex实现来做一些类似的事情,但它似乎根本就不是yylex的实现


有什么想法吗?

如果您使用
选项bison bridge
并且您的解析器有
@
引用,您需要添加

%option bison-locations
到您的flex文件。(你可以用它代替野牛桥,但我认为两者都有会更整洁。)来自:

  • --野牛位置,%option野牛位置
    • 指示flex使用GNU bison
      %位置。这
      表示将向
      yylex
      传递一个附加参数
      yylloc
      。 此选项意味着
      %选项野牛桥

我这样做了,效果很好。但所有属性都是1。我试图修改行/列,如已解释的,但得到“yyg”:未声明variable@dragos:这个问题太复杂了,无法在评论中回答。此外,你链接到的问题有六个答案,这六个答案有细微的不同;您需要显示一个代码示例(尽可能小,但仍然是自包含的)。请用这些信息提出一个新问题。谢谢。事实上我都试过了——最后还是同样的错误。但是我发现了:我在他们的例子中用yyget_lloc函数修改了yyloc,它成功了。谢谢你的回答。