我在Windows命令提示符下运行以下命令:
yacc -d calci.y
成功执行后,它会生成2个文件:calci.tab.c
和calci.tab.h
。但它应该已生成y.tab.c
和y.tab.h
。
我对lex
和yacc
不熟悉,所以我对错误一无所知。
此外,当我尝试运行命令时,它会给我以下错误:
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;
}
答案 0 :(得分:0)
接受野牛将根据其输入文件的名称命名其输出文件。
创建名为y.tab.c
和y.tab.h
的文件是原始yacc工具的遗留行为;使用当前bison
版本,您可以通过向-y
提供bison
命令行选项来实现兼容行为。但我不建议为新代码做这件事;它还会更改解析器行为的一些细节,以便与传统兼容,如果您没有遗留代码,则可能不需要这些行为。
根据输入文件上的bison生成文件的名称,可以在同一目录中拥有多个bison源文件。如果您不想使用源文件的名称,则可以使用-o
选项指定显式输出文件名(如果需要头文件,则可以指定--defines
选项&#39 ; s名称与源文件的前缀不同。)
这意味着您需要更改包含在词法分析器中的文件的名称,因此该行将成为
#include "calci.tab.h"
(假设您不使用-o
/ --defines
选项。)