5

VMware Workstation で fedora を実行しています。私はlexとyaccプログラムを持っています。プログラムのコンパイルは正常に機能していますが、プログラムを実行するgcc y.tab.c lex.yy.c -llfatal error: y.tab.h: No such file or directory.

Red Hat では同じプログラムが正常に動作しますが、VMware で実行されている fedora では動作しません。

いくつかの提案をしてください。

このプログラムは、post fix プログラムへの infix です。

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と呼ばれるプログラムです) は、2 つのファイルを生成します。パーサー ( 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 に答える