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

问题描述 投票:0回答:3

我正在 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);}
    
fedora yacc lex
3个回答
13
投票
这可能是您使用哪些命令来调用 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 可以找到它的目录中。


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

    在 lex 文件的第一行添加以下行:
%选项 noyywrap

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

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


0
投票
在 Windows 10/11 中编译 lex 和 Yacc :

在终端中转到程序的文件夹: 然后:

flex lex.l bison -dy yac.y gcc y.tab.c lex.yy.c -w ./a.exe
    
© www.soinside.com 2019 - 2024. All rights reserved.