我在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);}
答案 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)并遇到此错误,请填写给定的步骤:
%option noyywrap
文件名.exe
请注意 lex 文件名和 yacc 文件名应该相同,只是它们的扩展名不同