致命错误:y.tab.h:fedora上没有这样的文件或目录

时间:2013-10-22 17:23:50

标签: fedora yacc lex

我在VMware Workstation上运行我的fedora 。我有一个lex和yacc程序。程序编译工作正常,但当我通过gcc y.tab.c lex.yy.c -ll运行程序时,它会fatal error: y.tab.h: No such file or directory

相同的程序可以正常使用 red hat ,但不适用于在VMware上运行的 fedora

请提出一些建议。

此程序是修补程序的中缀。

lex program:---->

  %{
#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程序:-------&gt;

%{
#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);}

2 个答案:

答案 0 :(得分:8)

这可能是您用来调用Yacc,Lex和GCC的命令的问题,而不是您在此处包含的输入文件。

Yacc(可能真的是一个名为 Bison 的程序,即使您使用命令 yacc )也会生成两个文件:解析器( y.tab.c )和另一个文件( y.tab.h ),其中包含扫描仪所需的定义。这里的问题是GCC无法找到该文件, y.tab.h

检查以下内容:

实际生成了文件。您可能必须将标志 -d 提供给Bison / Yacc。

该文件名为 y.tab.h 。根据程序版本,名称可能会有所不同,如果您使用命令 bison 或使用命令 yacc 启动Bison。

该文件位于GCC可以找到的目录中。

答案 1 :(得分:0)

如果您在 windows 上使用 flex windows(lex 和 yacc)并遇到此错误,请填写给定的步骤:

  1. 在 lex 文件的第一行添加这一行:
<块引用>

%option noyywrap

  1. 编译lex文件
  2. 编译yacc文件
  3. 然后编译并构建yacc文件
  4. 选择“用cmd打开”选项
  5. 输入共同点:
<块引用>

文件名.exe

请注意 lex 文件名和 yacc 文件名应该相同,只是它们的扩展名不同