接下来是这一节的习题 :
在这个题目中,你将实现一个简单的台式计算器。这个台式计算器的功能像在最后一个讲义中演示的例子一样:即用户可以在控制台上交互输入算术表达式,你的程序判断该表达式是否合法,不合法的话报错并退出运行。
你的程序涉及表达式的部分要支持如下的表达式:
E -> n
| E + E
| E - E
| E * E
| E / E
| (E)
其中n是任意的非负整数(注意:在我们演示的例子中,n只是单个字符的整数,所以这个地方你需要做些扩展,这些扩展同时需要涉及修改词法分析yylex函数)。
以下是代码实现 :
1 %{ 2 #include <stdio.h> 3 #include <stdlib.h> 4 int yylex(); 5 void yyerror(char* err); 6 %} 7 /* 8 "%left '+' '-' '*' '/' 9 */ 10 11 %% 12 13 lines: line 14 | line lines; 15 16 line: exp '\n'; 17 18 exp: exp '+' term 19 | exp '-' term 20 | term; 21 22 term: term '*' n 23 | term '/' n 24 | n; 25 26 n: '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '0' | '(' exp ')'; 27 28 %% 29 30 int yylex(){ 31 return getchar(); 32 } 33 34 void yyerror(char* err){ 35 printf("%s\n", err); 36 } 37 38 int main (int argc, char* argv[]){ 39 yyparse(); 40 return 0; 41 }
结果实例:
1 [zhangzhimin@ ~] $ bison test.y 2 [zhangzhimin@ ~] $ gcc test.tab.c 3 [zhangzhimin@ ~] $ ./a.out 4 1+2+3/(3*4-5)+6-7/8 5 1+ 6 syntax error 7 [zhangzhimin@ ~] $
感觉这样写难免有点不符合规定投机取巧, 但是说实话不会用yacc, 也不知道yylex分析出来之后的token要怎么表示... 如果以后有时间在深究吧...