2013-03-26 93 views
2

我想從flex和bison製作一個計算器,但是在編譯期間我發現了一個錯誤。yyerror的野牛衝突類型

以下是錯誤:

C:\GnuWin32\src>gcc lex.yy.c y.tab.c -o tugas 
tugas.y:51: error: conflicting types for 'yyerror' 
y.tab.c:1433: error: previous implicit declaration of 'yyerror' was here 

這裏是我的.L代碼:

%{ 
#include <stdio.h> 
#include "y.tab.h" 
YYSTYPE yylval; 
%} 
plus [+] 
semi [;] 
minus [-] 
var [a-z] 
digit [0-1]+ 
equal [:=] 
%% 
{var} {yylval = *yytext - 'a'; return VAR;} 
{digit} {yylval = atoi(yytext); return DIGIT;} 
{plus} {return PLUS;} 
{minus} {return MINUS;} 
{equal} {return EQUAL;} 
{semi} {return SEMI;} 
. { return *yytext; } 
%% 
int main(void) 
{ 
yyparse(); 
return 0; 
} 

int yywrap(void) 
{ 
return 0; 
} 

int yyerror(void) 
{ 
    printf("Error\n"); 
    exit(1); 
} 

這裏是我.Y代碼:

%{ 
int sym[26]; 
%} 

%token DIGIT VAR 
%token MINUS PLUS EQUAL 
%token SEMI 

%% 

program: dlist SEMI slist 
; 

dlist: /* nothing */ 
| decl SEMI dlist 
; 

decl: 'VAR' VAR {printf("deklarasi variable accepted");} 
; 

slist: stmt 
| slist SEMI stmt 
; 

stmt: VAR EQUAL expr {sym[$1] = $3;} 
| 'PRINT' VAR {printf("%d",sym[$2]);} 
; 

expr: term {$$ = $1;} 
| expr PLUS term { $$ = $1 + $3;} 
| expr MINUS term { $$ = $1 - $3; } 
; 

term: int {$$ = $1;} 
| VAR {$$ = sym[$1]; } 
; 

int: DIGIT {$$ = $1;} 
| int DIGIT 
; 

爲什麼我得到這個錯誤?任何建議來解決這個問題。
在此先感謝

回答

7

yyerror應該有這樣的簽名:

int yyerror(char *); 

由於預期接受字符串中的錯誤信息被使用(很可能是用const char *更好,但你可能會得到更多的(忽略)警告與...

+0

很好,它解決了這個問題。謝謝:) – 2013-03-26 16:02:05

+0

我是否必須在.y文件的開頭添加原型?或者有沒有flex.h我可以#include? – wannik 2014-11-01 23:44:52

2

您需要更改

int yyerror(void) 

int yyerror(char*) 

換句話說,yyerror()必須採取哪些描述了發生該錯誤的單個c字符串參數。