我将运行一个用Flex a Bison构建的简单程序。
这是我的密码。
Flex文件(calc.l)
%{
#include <stdio.h>
#include <stdlib.h>
#include "tt.tab.h"
%}
/* %option noyywrap */
%%
[0-9]+(\.[0-9]+)?([eE][0-9]+)? {yylval.f = atof(yytext); return NUM;}
[-+()*/] {return yytext[0];}
[\t\f\v\n] {;}
%%
int yywrap() {return -1}
野牛文件(tt.y)
%{
#include <stdio.h>
#include <stdlib.h>
extern int yylex();
void yyerror(char *msg);
%}
%{
#include <stdio.h>
#include <stdlib.h>
extern int yylex();
%}
%union {
float f;
}
%token <f> NUM
%type <f> E T F
%%
S : E {printf("f\n", $1);}
;
E : E '+' T {$$ = $1 + $3}
| T {$$ = $1;}
;
T : T '*' F {$$ = $1 * $3}
| F {$$ = $1;}
;
F : '(' E ')' {$$ = $2;}
| '-' F {$$ = -$2;}
| NUM {$$ = $1;}
%%
void yyerror(char *msg) {
fprintf(stderr, "%s\n", msg);
exit(1);
}
要进行编译,请遵循cmd中的命令。
野牛-d tt.y
Flex calc.l
gcc lex.yy.c tt.tab.c -o calc
当我运行上一个gcc comman时,出现了这样的错误。
c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../../mingw32/bin/ld.exe: c:/mingw/bin/../lib/gcc/mingw32/8.2.0/../../../libmingw32.a(main.o):(.text.startup+0xb0): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
我的代码或任何其他代码有什么问题。感谢您的考虑:)
答案 0 :(得分:1)
您没有定义 main 函数,flex和bison生成的代码没有定义 main 函数,您必须自己定义它,否则程序会做没有入口点。
您的定义有问题:
{printf("f\n", $1);}
中的格式与参数不兼容,必须为“ {printf(“%f \ n”,$ 1);}`?int yywrap() {return -1}
中的int yywrap() {return -1;}
最小的 main 定义是:
int main()
{
yyparse();
return 0;
}
您可以在tt.y
中将其定义为 yyerror