在win64上不生成y.tab.c和y.tab.h文件

时间:2016-01-31 16:34:56

标签: yacc lex

我在Windows命令提示符下运行以下命令:

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:

     

错误:calci.l:3:23:致命错误:y.tab.h:没有这样的文件或目录   编译终止。

请提出一些建议。

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程序: - &gt;&gt;&gt;&gt;

%{
    #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;
}

1 个答案:

答案 0 :(得分:0)

接受野牛将根据其输入文件的名称命名其输出文件。

创建名为y.tab.cy.tab.h的文件是原始yacc工具的遗留行为;使用当前bison版本,您可以通过向-y提供bison命令行选项来实现兼容行为。但我不建议为新代码做这件事;它还会更改解析器行为的一些细节,以便与传统兼容,如果您没有遗留代码,则可能不需要这些行为。

根据输入文件上的bison生成文件的名称,可以在同一目录中拥有多个bison源文件。如果您不想使用源文件的名称,则可以使用-o选项指定显式输出文件名(如果需要头文件,则可以指定--defines选项&#39 ; s名称与源文件的前缀不同。)

这意味着您需要更改包含在词法分析器中的文件的名称,因此该行将成为

#include "calci.tab.h"

(假设您不使用-o / --defines选项。)