2013-10-22 233 views
4

我在VMware Workstation上運行我的fedora。我有一個lex和yacc程序。編譯程序工作正常,但是當我通過gcc y.tab.c lex.yy.c -ll運行程序時,它給出fatal error: y.tab.h: No such file or directory致命錯誤:y.tab.h:Fedora上沒有這樣的文件或目錄

相同的程序工作正常紅色帽子但不在fedora它運行在VMware

請給出一些建議。

此程序是後綴修復程序的中綴。

lex程序:---->

%{ 
#include<string.h> 
#include"y.tab.h" 
FILE *fp,*yyin; 
%} 

%% 
"*"|"/"|"+"|"-"|"("|")" {return yytext[0];} 
[0-9]+ {yylval.name=(char*)malloc(yyleng+1); 
    strcpy(yylval.name,yytext); 
    return num;} 
\n {return(0);} 
[a-zA-Z][a-zA-Z]* {yylval.name=(char*)malloc(yyleng+1); 
     strcpy(yylval.name,yytext); 
     return ID;} 
. {} 
%% 

int yywrap() 
{ 
return 1; 
} 

yacc的程序:------->

%{ 
#include<stdio.h> 
#include<string.h> 

%} 
%union 
{ 
    char *name; 
} 
%token<name>num ID 
%type<name>E 
%left'+''-' 
%left'*''/' 
%nonassoc UMINUS 
%% 
S:E{printf("\n%s",$1);} 
; 
E:E'*'E {strcpy($$,strcat(strcat($1,$3),"*"));} 
|E'/'E {strcpy($$,strcat(strcat($1,$3),"/"));} 
|E'+'E {strcpy($$,strcat(strcat($1,$3),"+"));} 
|E'-'E {strcpy($$,strcat(strcat($1,$3),"-"));} 
|ID 
|num 
|'-'E%prec UMINUS {strcpy($$,strcat($2,"UMINUS"));} 
|'('E')'{strcpy($$,$2);} 
; 
%% 

main() 
{ 
yyparse(); 
} 
int yyerror(char *s) {fprintf(stderr,"%s\n",s);} 

回答

7

這很可能是一個問題,到底是哪你用來調用Yacc,Lex和GCC的命令,而不是你在這裏包含的輸入文件。

Yacc的(這大概真的是一種叫做野牛即使您使用命令YACC程序)生成兩個文件:一個解析器(y.tab.c的)和另一個文件(y.tab。 h)以及掃描儀所需的定義。這裏的問題是,GCC無法找到該文件,y.tab.h

檢查這些東西:

該文件實際上是生成的。您可能必須將國旗-d交給Bison/Yacc。

該文件被稱爲y.tab.h。根據程序版本,名稱可能有所不同,如果您使用命令bison或命令yacc啓動Bison。

該文件位於GCC可以找到它的目錄中。

+0

我使用'yacc prog.y'編譯程序,它不會創建'y.tab.h'。 –

+3

你需要寫** yacc -d prog.y **。 –

+0

瞭解。它的工作 –

相關問題