免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3632 | 回复: 4
打印 上一主题 下一主题

[算法] 我用lex+yacc做计算器,gcc说yylex()找不到,编译错误? [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-09-22 18:11 |只看该作者 |倒序浏览
10可用积分
本帖最后由 cdsfiui 于 2016-09-22 18:15 编辑

我在网上找到了一个计算器的实现:
首先,有my.l文件如下:
  1. %{  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "my.tab.h"
  5. extern int  yylval;
  6. %}
  7. number  [0-9]+
  8. %%
  9. {number}    {yylval=atoi(yytext);printf("%s",yytext);return NUMBER;}
  10. "+"            {printf("%s",yytext);return PLUS;}  
  11. "-"            {printf("%s",yytext);return SUB;}  
  12. "*"            {printf("%s",yytext);return CHEN;}  
  13. "/"            {printf("%s",yytext);return DIV;}
  14. "("        {printf("%s",yytext);return  LKUO;}
  15. ")"        {printf("%s",yytext);return  YKUO;}
  16. %%
复制代码

然后有my.y文件
  1. %{  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #define YYSTYPE int
  7.      %}
  8. %token NUMBER
  9. %token PLUS
  10. %token SUB
  11. %token CHEN
  12. %token DIV
  13. %token LKUO
  14. %token YKUO
  15. %left  PLUS SUB
  16. %left  CHEN   DIV
  17. %%
  18. com: exp  {printf("=%d/n",$1);};
  19. exp:  exp  PLUS fac {$=$1+$3;}
  20.           |exp  SUB fac {$=$1-$3;}
  21.           |fac{$=$1;};
  22. fac:fac  CHEN term {$=$1*$3;}
  23.        |fac  DIV term {$=$1/$3;}
  24.         |term  {$=$1;};
  25. term:LKUO exp YKUO  {$=$1;}
  26.           | NUMBER   {$=$1;};
  27. %%
  28. extern int yylex();
  29. int yyparse();
  30. main()
  31. {
  32. return yyparse();
  33. }  
  34. yyerror()
  35. {printf("sytax error");}
复制代码

然后联合编译
  1. $ yacc my.y
  2. $ lex my.l
  3. $ gcc lex.yy.c my.tab.c -ll
  4. my.tab.c: In function ‘yyparse’:
  5. my.tab.c:1124:16: warning: implicit declaration of function ‘yylex’ [-Wimplicit-function-declaration]
  6.         yychar = yylex ();
  7.                  ^
  8. my.tab.c:1307:7: warning: implicit declaration of function ‘yyerror’ [-Wimplicit-function-declaration]
  9.         yyerror (YY_("syntax error"));
  10.         ^
  11. my.y: At top level:
  12. my.y:30:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
  13.   main()
  14.   ^
  15. my.y:34:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
  16.   yyerror()
  17.   ^
复制代码

  
yylex是lex的标准函数,为什么gcc说找不到这个定义?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2016-10-09 13:51 |只看该作者
回复 1# cdsfiui


首先,yacc程序里面是$$而不是$
再者
你的lex和yacc是?
flex和bison?

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
3 [报告]
发表于 2016-10-09 17:52 |只看该作者

对,我在ubuntu16.04上,只有flex和bison,没有lex和yacc
难道语法还不太一样,我需要使用某些开关选项吗?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2016-10-10 10:41 |只看该作者
cdsfiui 发表于 2016-10-09 17:52
对,我在ubuntu16.04上,只有flex和bison,没有lex和yacc
难道语法还不太一样,我需要使用某些开关选项 ...

  1. linux-s3hu:/tmp/jt/B # ls
  2. my.l  my.y
  3. linux-s3hu:/tmp/jt/B # lex -l my.l
  4. linux-s3hu:/tmp/jt/B # yacc -bmy -d my.y
  5. linux-s3hu:/tmp/jt/B # gcc *.c -lfl
  6. linux-s3hu:/tmp/jt/B # ./a.out

复制代码

里面写的是不是有点问题吧
没细看
运行了一下,不太对

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2016-10-10 10:50 |只看该作者

  1. linux-s3hu:/tmp/jt/B # ./a.out
  2. 1+3*4+5*(7-6)
  3. 1+3*4+5*(7-6)
  4. =38
复制代码

显然不对,写的极其粗糙啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP