Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9528
  • 博文数量: 1
  • 博客积分: 45
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-10 21:16
文章分类
文章存档

2013年(1)

我的朋友
最近访客

分类: LINUX

2013-01-12 12:53:30

前言:  
  前几天在看GNU make,在第一章提到了flex,当时感觉flex很强大,想学习一下。比较巧的是,以前亚马逊打折,刚好买了《Flex and bison》这本书,于是拿出来看了一下。
正题:
  今天把dc(Desktop Calculator)搞清楚了,可能是因为该书中所用的Flex和Bison版本比较老的原因吧,源程序中有些地方无法在现在的bison上处理(我的bison版本是2.5),在此指出。
  在fb1-5.y的规则中:
  ***:*** default $$=$1
  bison提示有错误。
  修改成:
  ***:*** {$$=$1;}
  即可。
  测试时,我发现这个计算器并不能处理绝对值负数(例如:|-12),我又将程序稍微修改了一下,可以识别例子中的模式。
  源代码如下:
  dc.l

点击(此处)折叠或打开

  1. %{
  2. #include "dc.tab.h"
  3. %}
  4. %%
  5. [0-9]+    {yylval=atoi(yytext);return NUMBER;}
  6. "+"    {return ADD;}
  7. "-"    {return SUB;}
  8. "*"    {return MUL;}
  9. "/"    {return DIV;}
  10. "|"    {return ABS;}
  11. \n    {return EOL;}
  12. \t    {}
  13. .    {printf("Mystery character\n");}
  14. %%
  dc.y

点击(此处)折叠或打开

  1. %{
  2. #include <stdio.h>
  3. %}

  4. %token NUMBER
  5. %token ADD SUB MUL DIV ABS
  6. %token EOL

  7. %%
  8. calclist:
  9.  |calclist exp EOL{printf("=%d\n",$2);}
  10.  ;
  11. exp: factor {$$=$1;}
  12.  |exp ADD factor{$$=$1+$3;}
  13.  |exp SUB factor{$$=$1-$3;}
  14.  ;
  15. factor: term {$$=$1;}
  16.  |factor MUL term{$$=$1*$3;}
  17.  |factor DIV term{$$=$1/$3;}
  18.  ;
  19. term: NUMBER {$$=$1;}
  20.  |ABS term{$$=$2;}
  21.  |ABS SUB term{$$=$3;}
  22.  ;
  23. %%

  24. main(int argc,char** argv)
  25. {
  26.     yyparse();
  27. }
  28. yyerror(char *s)
  29. {
  30.     fprintf(stderr,"error:%s\n",s);
  31. }
初学者,代码如果有误,敬请指出。
您没有插入代码!

阅读(1367) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~