Compiler construction 对于‘;yylval’;

Compiler construction 对于‘;yylval’;,compiler-construction,bison,yacc,flex-lexer,symbol-table,Compiler Construction,Bison,Yacc,Flex Lexer,Symbol Table,编译lex程序时,出现一个错误: “yylval”的冲突类型 外部YYSTYPE*yylval 你知道怎么纠正这个吗? 这是法律法规 %{ #include<stdio.h> #include"y.tab.h" extern char *yylval; %} %% "int"|"float"|"char"|"double" { yylval=strdup(yytext); return TYP;} [a-z A-Z][a-z A-Z 0-9]* { yylval=s

编译lex程序时,出现一个错误: “yylval”的冲突类型 外部YYSTYPE*yylval

你知道怎么纠正这个吗? 这是法律法规

%{
  #include<stdio.h>
  #include"y.tab.h"
  extern char *yylval;
%}

%%
 "int"|"float"|"char"|"double" { yylval=strdup(yytext); return TYP;}
 [a-z A-Z][a-z A-Z 0-9]* { yylval=strdup(yytext); return ID;}
 ";" return SEMI;
 "," return COMA;
 "{" return LB;
 "}" return RB;
 "\n" return NL;
 [\t]+;
 .;
 %%
%{
#包括
#包括“y.tab.h”
外部字符*yylval;
%}
%%
“int”|“float”|“char”|“double”{yylval=strdup(yytext);返回类型;}
[a-z a-z][a-z a-z 0-9]*{yylval=strdup(yytext);返回ID;}
“;”返回半;
返回昏迷;
“{”返回LB;
“}”返回RB;
“\n”返回NL;
[\t]+;
.;
%%

您定义了两次
yylval
,一次在.y文件中定义为
YYSTYPE
(导出到
y.tab.h
),第二次在lex代码中定义为
char*
。去掉
外部字符*yylval
和多个定义将消失,不过您还需要更改lex code中对
yylval
的使用,以便与您在
.y
文件中定义的内容兼容。

bison的文档中对此进行了详细介绍。更改YYLVAL的类型取决于您拥有的Bison版本。例如,见