gpt4 book ai didi

c - 错误: conflicting types for ‘yylval’ extern YYSTYPE yylval

转载 作者:行者123 更新时间:2023-11-30 19:28:31 29 4
gpt4 key购买 nike

我正在尝试运行这个:

斯塔克.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;}

斯塔克.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;

它去年冬天有效,我不明白为什么它现在不起作用。我在 ubuntu 上使用 lex 和 yacc。

最佳答案

如果您要使用#define重新定义YYSTYPE ,那么您需要在您之前执行此操作 #include <y.tab.h> 。否则,y.tab.h将使YYSTYPE typedef 的类型别名 ( int ) 。由于两者 y.tab.hy.tab.c还声明yylval (如 extern YYSTYPE ),实际上不需要在任何地方声明它,但您仍然需要将 #define之前#include .

如果您使用 bison,有更好(也更方便)的方法来声明 YYSTYPE 。最好的就是放

%define api.value.type { char* }

进入您的.y文件,例如 %token 之前声明。然后你可以删除#define YYSTYPE来自这两个文件以及 extern YYSTYPE yylval;声明,因为 bison 会放置适当的 typedef到头文件中。

你真的应该用

编译你的项目
gcc -Wall lex.yy.c y.tab.c

然后 gcc 会警告你很多错误。如果您将以下内容放入 lex 文件中,bison 和 flex 都会生成无警告的代码:

%option noinput nounput

我通常建议使用%option noyywrap同样,因为这将允许您避免编写虚拟 yywrap实现。

关于c - 错误: conflicting types for ‘yylval’ extern YYSTYPE yylval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53818618/

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