C指针原理(12)
来源:互联网 发布:linux日常维护脚本 编辑:程序博客网 时间:2024/05/16 15:40
转自:http://blog.csdn.net/myhaspl/article/details/14644629
(2)扩充计算器
加入对括号和注释的支持,
首先修改flex文件,在第二部分加入更多的词法规则(对于注释直接忽略):
"(" {return LEFTBRACKET;}
")" {return RIGHTBRACKET;}
"#".* /*忽略注释*/
然后,修改bison文件,在第二部分加入更多的语法规则:
term:NUMBER {$$=$1;}
|ABS term {$$=$2>=0?$2:-$2;}
|LEFTBRACKET exp RIGHTBRACKET {$$=$2;}
;
我们的注释以“#”表示
测试结果
myhaspl@myhaspl:~/flex_bison/2$ make
bison -d calculator.y
flex calculator.l
gcc calculator.tab.c lex.yy.c -lfl
myhaspl@myhaspl:~/flex_bison/2$ ls
a.out calculator.tab.c calculator.y makefile
calculator.l calculator.tab.h lex.yy.c
myhaspl@myhaspl:~/flex_bison/2$ ./a.out
12-36*10/(1+2+3)#compute
=-48
^C
myhaspl@myhaspl:~/flex_bison/2$
前面都是以键盘输入 的方式进行计算器运算,我们下面以文件方式提供给该解释器进行计算,首先,将flex文件改为(将其中中文去除,然后对于非法字符的出现进行忽略):
%{
#include "calculator.tab.h"
%}
%%
"+" {return ADD;}
"-" {return SUB;}
"*" {return MUL;}
"/" {return DIV;}
"|" {return ABS;}
"(" {return LEFTBRACKET;}
")" {return RIGHTBRACKET;}
"#".* /*comment*/
[0-9]+ {yylval=atoi(yytext);return NUMBER;}
\n {return EOL;}
[ \t] /*blank*/
. /*invalid char*/
%
接着,改bison文件,加入对文件的读写
%{
#include <stdio.h>
%}
%token NUMBER
%token ADD SUB MUL DIV ABS LEFTBRACKET RIGHTBRACKET
%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>=0?$2:-$2;}
|LEFTBRACKET exp RIGHTBRACKET {$$=$2;}
;
%%
main(int argc,char **argv){
int i;
if (argc<2){
yyparse();
}
else{
for(i=1;i<argc;i++)
{
FILE *f=fopen(argv[i],"r");
if (!f){
perror(argv[i]);
return (1);
}
yyrestart(f);
yyparse();
fclose(f);
}
}
}
yyerror(char *s)
{
fprintf(stderr,"error:%s\n",s);
}
最后 测试一下
root@myhaspl:~/test/3# make
bison -d calculator.y
flex calculator.l
gcc calculator.tab.c lex.yy.c -lfl
root@myhaspl:~/test/3# ./a.out mycpt1.cpt mycpt2.cpt
=158
=-8
root@myhaspl:~/test/3#
其中两个CPT文件内容类似 为:
12*66/(10-5)
- C指针原理(12)
- C指针原理(1)
- C指针原理(2)
- C指针原理(3)
- C指针原理(4)
- C指针原理(5)
- C指针原理(6)
- C指针原理(8)
- C指针原理(9)
- C指针原理(10)
- C指针原理(11)
- c二级指针原理
- C指针原理(12)-编译原理-小型计算器实现
- C指针原理(14)-C指针基础
- C指针原理(15)-C指针基础
- C指针原理(16)-C指针基础
- C指针原理(17)-C指针基础
- C指针原理(33)-C-文件指针
- C指针原理(11)
- 进程UID : 父进程(UID/setUID) / 加载文件的SUID
- libxml2主要函数说明
- Windows下使用标准Shell接口遍历文件和文件夹(1)
- 皮肤检测算法三种,示例与代码
- C指针原理(12)
- Android TextView分享
- Duplicate entry导致mysql主从复制中断的事故
- C语言程序设计教程(第三版)课后习题11.8 链表合并及操作
- java多线程,将oracle中数据导入到sql到文件(包括大字段转换成字符串)
- PROTO 之函数的使用
- Cmd模式下的入侵技术大全
- error
- 如何增加2.0、3.5的目标框架在VS2010里面