Почему bison все еще использует `int yylex (void)` и не может найти `int yylex (YYSTYPE * yylval_param, YYLTYPE * yylloc_param)`? - PullRequest
1 голос
/ 26 февраля 2020

Я пытаюсь добавить информацию о местоположении в 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 ++:

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);
           ^

Пожалуйста, помогите мне.

1 Ответ

2 голосов
/ 26 февраля 2020

Похоже, вам нужен анализатор для повторного входа.

Чтобы иметь поддержку бизонов, вы должны использовать флаг

%pure-parser

где-то в объявлениях бизонов. Затем вызывается функция yylex() с двумя аргументами lval и lloc.

...