我正在 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 程序:---->
%{
#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;
}
%{
#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);}
Yacc(即使您使用命令
yacc,它可能确实是一个名为 Bison 的程序)生成两个文件:一个解析器 (y.tab.c) 和另一个文件 (y.tab.h)具有扫描仪所需的定义。这里的问题是 GCC 找不到该文件,y.tab.h。
检查这些事情:文件确实生成了。您可能需要将标记
-d 交给 Bison/Yacc。
该文件名为y.tab.h。根据程序版本的不同,名称可能会有所不同,如果您使用命令 bison 或命令 yacc 启动 Bison。
该文件位于 GCC 可以找到它的目录中。
%选项 noyywrap
文件名.exe请注意,lex 文件名和 yacc 文件名应该相同,只是扩展名不同
在终端中转到程序的文件夹: 然后:
flex lex.l
bison -dy yac.y
gcc y.tab.c lex.yy.c -w
./a.exe