5

我在 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;
}

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);}
4

2 回答 2

12

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

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

检查这些事情:

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

该文件称为y.tab.h。名称可能因程序版本而异,如果您使用命令bison或命令yacc启动 Bison 。

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

于 2013-10-23T07:12:41.637 回答
0

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

  1. 在第一行的 lex 文件中添加以下行:

%option noyywrap

  1. 编译 lex 文件
  2. 编译yacc文件
  3. 然后编译并构建 yacc 文件
  4. 选择“使用cmd打开”选项
  5. 输入command:

文件名.exe

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

于 2021-04-28T05:31:05.720 回答