C指针原理(11)

转自:http://blog.csdn.net/myhaspl/article/details/14445431

二、flexbison联合工作

我们开始构造一个计算器程序。

创建flex代码

/*计算器*/

%{

enum yytokentype{

     NUMBER=258,

 ADD=259,

 SUB=260,

 MUL=261,

 DIV=262,

 ABS=263,

 EOL=264

};

int yylval;

%}

 

%%

"+"   {return ADD;}

"-"   {return SUB;}

"*"   {return MUL;}

"/"   {return DIV;}

"|"   {return ABS;}

[0-9]+ {yylval=atoi(yytext);return NUMBER;}

\n  {return EOL;}

[ \t] {/*空白忽略*/}

. {printf("非法字符 %c\n",*yytext);}

%%

main(int argc,char**argv)

{

   int tok;

   while(tok=yylex()){

      printf("%d",tok);

  if (tok==NUMBER) printf("=%d\n",yylval);

  else printf("\n");

   }

}

2、编译

Administrator@2012-20121224HD /home/flexlinux

$ flex test2.l

 

Administrator@2012-20121224HD /home/flexlinux

$ gcc lex.yy.c -lfl

3、运行

Administrator@2012-20121224HD /home/flexlinux

$ ./a

- 12 66

260

258=12

258=66

264

 

Administrator@2012-20121224HD /home/flexlinux

$ ./a

/ 56 2 + |32

262

258=56

258=2

259

263

258=32

264

 

Administrator@2012-20121224HD /home/flexlinux

$

(2)计算器的BISON程序

  1. %{  
  2. #include <stdio.h>  
  3. %}  
  4.   
  5. %token NUMBER  
  6. %token ADD SUB MUL DIV ABS  
  7. %token EOL  
  8.   
  9. %%  
  10.   
  11. calclist:/**/  
  12.   |calclist exp EOL{printf ("=%d\n",$2);}  
  13.   ;  
  14.     
  15. exp:factor {$$ = $1;}  
  16.   |exp ADD factor{$$=$1+$3;}  
  17.   |exp SUB factor{$$=$1-$3;}  
  18.   ;  
  19.    
  20.    
  21. factor:term {$$=$1;}  
  22.   |factor MUL term{$$=$1*$3;}  
  23.   |factor DIV term{$$=$1/$3;}  
  24.   ;  
  25. term:NUMBER {$$=$1;}  
  26.   |ABS term {$$=$2>=0?$2:-$2;}  
  27.   ;  
  28. %%  
  29. main(int argc,char **argv){  
  30. yyparse();  
  31. }  
  32. yyerror(char *s)  
  33. {  
  34.  fprintf(stderr,"error:%s\n",s);  
  35. }  


liuxing@liuxing-HP-Pavilion-dv2700-Notebook-PC:~/test$ bison -d test2.y
liuxing@liuxing-HP-Pavilion-dv2700-Notebook-PC:~/test$ ls

test2.tab.c  test2.tab.h  test2.y  test2.y~


然后,修改刚才的flex文件,将其命名为test21.l

test2.tab.h中包含了记号编号的定义和yylval的定义,因此,将其第一部分的相关定义删除,并改为:

/*计算器*/

%{

  #include "test2.tab.h"

%}

然后删除,其第三部分的main函数。

最后,进行编译。

bison -d test2.y

flex test21.l

gcc test2.tab.c lex.yy.c -lfl


 

可以测试一下

root@myhaspl:~# ./a.out

12 + 36 * 2

=84

12 / 6 + 2 * 3

=8

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值