我用lex+yacc做计算器,gcc说yylex()找不到,编译错误?
本帖最后由 cdsfiui 于 2016-09-22 18:15 编辑我在网上找到了一个计算器的实现:
首先,有my.l文件如下:
%{
#include <stdio.h>
#include <stdlib.h>
#include "my.tab.h"
extern intyylval;
%}
number+
%%
{number} {yylval=atoi(yytext);printf("%s",yytext);return NUMBER;}
"+" {printf("%s",yytext);return PLUS;}
"-" {printf("%s",yytext);return SUB;}
"*" {printf("%s",yytext);return CHEN;}
"/" {printf("%s",yytext);return DIV;}
"(" {printf("%s",yytext);returnLKUO;}
")" {printf("%s",yytext);returnYKUO;}
%%
然后有my.y文件
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define YYSTYPE int
%}
%token NUMBER
%token PLUS
%token SUB
%token CHEN
%token DIV
%token LKUO
%token YKUO
%leftPLUS SUB
%leftCHEN DIV
%%
com: exp{printf("=%d/n",$1);};
exp:expPLUS fac {$=$1+$3;}
|expSUB fac {$=$1-$3;}
|fac{$=$1;};
fac:facCHEN term {$=$1*$3;}
|facDIV term {$=$1/$3;}
|term{$=$1;};
term:LKUO exp YKUO{$=$1;}
| NUMBER {$=$1;};
%%
extern int yylex();
int yyparse();
main()
{
return yyparse();
}
yyerror()
{printf("sytax error");}
然后联合编译
$ yacc my.y
$ lex my.l
$ gcc lex.yy.c my.tab.c -ll
my.tab.c: In function ‘yyparse’:
my.tab.c:1124:16: warning: implicit declaration of function ‘yylex’ [-Wimplicit-function-declaration]
yychar = yylex ();
^
my.tab.c:1307:7: warning: implicit declaration of function ‘yyerror’ [-Wimplicit-function-declaration]
yyerror (YY_("syntax error"));
^
my.y: At top level:
my.y:30:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
main()
^
my.y:34:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
yyerror()
^
yylex是lex的标准函数,为什么gcc说找不到这个定义?
回复 1# cdsfiui
首先,yacc程序里面是$$而不是$
再者
你的lex和yacc是?
flex和bison?
cjaizss 发表于 2016-10-09 13:51
回复 1# cdsfiui
对,我在ubuntu16.04上,只有flex和bison,没有lex和yacc
难道语法还不太一样,我需要使用某些开关选项吗?
cdsfiui 发表于 2016-10-09 17:52
对,我在ubuntu16.04上,只有flex和bison,没有lex和yacc
难道语法还不太一样,我需要使用某些开关选项 ...
linux-s3hu:/tmp/jt/B # ls
my.lmy.y
linux-s3hu:/tmp/jt/B # lex -l my.l
linux-s3hu:/tmp/jt/B # yacc -bmy -d my.y
linux-s3hu:/tmp/jt/B # gcc *.c -lfl
linux-s3hu:/tmp/jt/B # ./a.out
里面写的是不是有点问题吧
没细看
运行了一下,不太对
linux-s3hu:/tmp/jt/B # ./a.out
1+3*4+5*(7-6)
1+3*4+5*(7-6)
=38
显然不对,写的极其粗糙啊
页:
[1]