2016-01-31 151 views
0

產生我跑在Windows命令提示符下面的命令:y.tab.c的和y.tab.h文件沒有Win64上

yacc -d calci.y

成功執行後會生成2個文件:calci.tab.ccalci.tab.h。但它應該產生了y.tab.cy.tab.h

我很新lexyacc,所以我不知道這個錯誤。

而且,它給了我下面的錯誤,當我嘗試運行命令:

cc lex.yy.c calci.tab.c -o out.exe:

error: calci.l:3:23: fatal error: y.tab.h: No such file or directory compilation terminated.

請給一些建議。

YACC程序:--- >>

%{ 
    #include <stdio.h> 
    int yylex(void); 
    void yyerror(char *); 
%} 

%token INTEGER 

%% 

program: 
     program expr '\n'   { printf("%d\n", $2); } 
     | 
     ; 

expr: 
     INTEGER 
     | expr '+' expr   { $$ = $1 + $3; } 
     | expr '-' expr   { $$ = $1 - $3; } 
     ; 

%% 

void yyerror(char *s) { 
    fprintf(stderr, "%s\n", s); 
} 

int main(void) { 
    yyparse(); 
    return 0; 
} 

lex程序: - >>>>

%{ 
    #include "y.tab.h" 
    #include <stdlib.h> 
    void yyerror(char *); 
%} 

%% 

[0-9]+  { 
       yylval = atoi(yytext); 
       return INTEGER; 
      } 

[-+\n]  { return *yytext; } 

[ \t]  ;  /* skip whitespace */ 

.   yyerror("Unknown character"); 

%% 

int yywrap(void) { 
    return 1; 
} 

回答

0

只是接受野牛將其命名爲基於它的輸出文件其輸入文件的名稱。

創建名爲y.tab.cy.tab.h的文件是原始yacc工具的傳統行爲;與當前的bison版本一樣,您可以通過將-y命令行選項提供給bison來實現兼容的行爲。但我不建議爲新代碼做這件事。它也會改變解析器行爲的一些細節以便與傳統兼容,並且如果你沒有遺留代碼,那麼這些行爲可能是不可取的。

根據輸入文件中野牛生成文件的名稱,可以在同一個目錄中有多個野牛源文件。如果您不想使用源文件的名稱,則可以使用-o選項指定明確的輸出文件名(如果要使頭文件的名稱具有與源文件不同的前綴,則可以使用--defines選項)。

所有這一切意味着你需要更改文件的名稱被納入詞法分析器,所以該線路將成爲

#include "calci.tab.h" 

(假設你不使用-o/--defines選項。)

+1

或者使用'-y'選項。 –