我们接着完善这个计算器程序, 让算式能显示出来, 修改 calculator.l
通过加入 printf 语句, 打印词法分析器解析到的字符. 比如 :
- ..................
- [0-9]+?{
- yylval=atoi(yytext);printf("%d",yylval);return?NUMBER;
- }
- \n??{
- return?EOL;
- }
- [?\t]?/blank/
- .?/invalid?char/
- %%
然后编译执行.
- root@myhaspl:~/test/4#?make
- bison?-d?calculator.y
- flex?calculator.l
- gcc?calculator.tab.c??lex.yy.c?-lfl
- root@myhaspl:~/test/4#?./a.out
- 12+66
- 12+66=78
- ^C
- root@myhaspl:~/test/4#?./a.out?mycpt1.cpt?mycpt2.cpt???
- 12*66/(10-5)=158
- 77/(10+1)-15=-8
接下来加上读取的行号, 将结果的显示更加人性化
flex 文件要改:
\n ?{printf("<line:M>",yylineno);yylineno++;return EOL;}
然后, bison 文件也改:
- calclist:/**/
- ? |calclist exp EOL{
- printf ("the result is:%d\n",$2);
- }
- ? ;
最后 , 编译运行测试一下.
- root@myhaspl:~/test/4# make
- bison -d calculator.y
- flex calculator.l
- gcc calculator.tab.c ?lex.yy.c -lfl
- root@myhaspl:~/test/4# ./a.out mycpt1.cpt mycpt2.cpt
- 1266/(10-5)<line: ? 1>the result is:158
- 12/22-8<line: ? 2>the result is:-8
- 77(6-2)<line: ? 3>the result is:308
- 77/(10+1)-15<line: ? 4>the result is:-8
- root@myhaspl:~/test/4#?
来源: http://www.bubuko.com/infodetail-2867825.html