ошибка: конфликтующие типы для 'yylval' extern YYSTYPE yylval - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь запустить это:

stark.lex

%{
#include <stdio.h>
#include "y.tab.h"
#ifndef YYSTYPE
#define YYSTYPE char*
#endif
#define INTEGER 288
extern YYSTYPE yylval;
%}

%%
[0-9]+ yylval=strdup(yytext);return NUMBER;
    ...

(\)){1} yylval=strdup(yytext);return EBRACKET;
\n
[ \t]+ ;
%%
int yywrap()
{return 1;}

stark.y

%{
#include <stdio.h>
#include <string.h>
#ifndef YYSTYPE
#define YYSTYPE char*
#endif
#define INTEGER 288

extern YYSTYPE yylval;
extern FILE* yyin;

void yyerror (const char *str);
int yylex(void);
%}

%token NUMBER IDENTIFIER KEY_VAR OPERATION SEMICOLON COMMA SIGN MINUS OBRACKET EBRACKET BG ND PLUS
%left PLUS MINUS
%left OPERATION


   %left UNARY
    %%
 ...

    int main()
{yyin = fopen("prog.txt","r");
yyparse();
fclose(yyin);
return 0; }

с командой:

yacc -d stark.y && lex stark.lex && gcc lex.yy.c y.tab.c

Но я получаю эту ошибку:

stark.lex:15:16: error: conflicting types for ‘yylval’
 extern YYSTYPE yylval;
                ^~~~~~
In file included from stark.lex:5:0:
y.tab.h:88:16: note: previous declaration of ‘yylval’ was here
 extern YYSTYPE yylval;

Это сработало прошлой зимойи я не могу понять, почему это не работает сейчас.Я использую lex и yacc в Ubuntu.

1 Ответ

0 голосов
/ 18 декабря 2018

Если вы собираетесь использовать #define для переопределения YYSTYPE, то вам нужно сделать это до вас #include <y.tab.h>.В противном случае y.tab.h сделает YYSTYPE псевдонимом типа (typedef) для int.Поскольку и y.tab.h, и y.tab.c также объявляют yylval (как extern YYSTYPE), вам фактически нет необходимости объявлять его где-либо, но вам все равно нужно поставить #define перед #include.

Если вы собираетесь использовать бизона, есть гораздо более удобные способы для повторной декларации YYSTYPE.Лучше всего поместить

%define api.value.type { char* }

в ваш файл .y, например, непосредственно перед объявлением %token.Затем вы можете удалить #define YYSTYPE из обоих файлов, а также объявления extern YYSTYPE yylval;, поскольку bison поместит соответствующий typedef в заголовочный файл.

Вы действительно должны скомпилировать свой проект с помощью

gcc -Wall lex.yy.c y.tab.c

Тогда gcc предупредит вас о многих ошибках.И bison, и flex будут генерировать код без предупреждений, при условии, что вы добавили в файл lex следующее:

%option noinput nounput

Я обычно также рекомендую использовать %option noyywrap, так как это позволит вам избежать необходимости писатьфиктивная yywrap реализация.

...