前言:
前几天在看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
- %{
- #include "dc.tab.h"
- %}
- %%
- [0-9]+ {yylval=atoi(yytext);return NUMBER;}
- "+" {return ADD;}
- "-" {return SUB;}
- "*" {return MUL;}
- "/" {return DIV;}
- "|" {return ABS;}
- \n {return EOL;}
- \t {}
- . {printf("Mystery character\n");}
- %%
dc.y
- %{
- #include <stdio.h>
- %}
- %token NUMBER
- %token ADD SUB MUL DIV ABS
- %token EOL
- %%
- calclist:
- |calclist exp EOL{printf("=%d\n",$2);}
- ;
- exp: factor {$$=$1;}
- |exp ADD factor{$$=$1+$3;}
- |exp SUB factor{$$=$1-$3;}
- ;
- factor: term {$$=$1;}
- |factor MUL term{$$=$1*$3;}
- |factor DIV term{$$=$1/$3;}
- ;
- term: NUMBER {$$=$1;}
- |ABS term{$$=$2;}
- |ABS SUB term{$$=$3;}
- ;
- %%
- main(int argc,char** argv)
- {
- yyparse();
- }
- yyerror(char *s)
- {
- fprintf(stderr,"error:%s\n",s);
- }
初学者,代码如果有误,敬请指出。
阅读(1367) | 评论(0) | 转发(0) |