% cat -n eval1.c 1 /* arith.c: simple parser -- bold evaluates */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <ctype.h> 5 #include <math.h> /* for pow */ 6 char next; 7 double E(void); 8 double T(void); 9 double S(void); 10 double F(void); 11 void error(void); 12 void scan(void); 13 double evaluate(double arg1, char op, double arg2); 14 15 void main(void) 16 { 17 double res; 18 scan(); 19 res = E(); 20 if (next != '#') error(); 21 else 22 printf("Result is: %.5f\n", res); 23 } 24 25 double E(void) 26 { 27 char save; 28 double res, arg1, arg2; 29 res = T(); 30 while (next == '+' || next == '-') { 31 save = next; 32 arg1 = res; 33 scan(); 34 arg2 = T(); 35 res = evaluate(arg1, save, arg2); 36 } 37 return res; 38 } 39 40 double T(void) 41 { 42 char save; 43 double res, arg1, arg2; 44 res = S(); 45 while (next == '*' || next == '/') { 46 save = next; 47 arg1 = res; 48 scan(); 49 arg2 = S(); 50 res = evaluatearg1, save, arg2); 51 } 52 return res; 53 } 54 55 double S(void) 56 { 57 char save; 58 double res, arg1, arg2; 59 res = F(); 60 if (next == '^') { 61 save = next; 62 arg1 = res; 63 scan(); 64 arg2 = S(); 65 res = evaluate(arg1, save, arg2); 66 } 67 return res; 68 } 69 70 double F(void) 71 { 72 char save; 73 double res; 74 if (isdigit(next)) { 75 save = next; 76 scan(); 77 return (double)(save - '0'); 78 } 79 else if (next == '(') { 80 scan(); 81 res = E(); 82 if (next == ')') scan(); 83 else error(); 84 return res; 85 } 86 else { 87 error(); 88 return 0; 89 } 90 } 91 void scan(void) 92 { 93 while (isspace(next = getchar())) 94 ; 95 } 96 void error(void) 97 { 98 printf("\n*** ERROR ***\n"); 99 exit(1); 100 } 101 double evaluate(double arg1, char op, double arg2) 102 { 103 switch (op) { 104 case '+': return arg1 + arg2; 105 case '-': return arg1 - arg2; 106 case '*': return arg1 * arg2; 107 case '/': return arg1 / arg2; 108 case '^': return pow(arg1, arg2); 109 default: error(); return 0; 110 } 111 } % cc -o eval1 -lm eval1.c (Need -lm because of pow) % eval1 2+3*4# Result is: 14.00000 % eval1 3*4+5# Result is: 17.00000 % eval1 (2+3)*4# Result is: 20.00000 % eval1 (3*(2+4)/(5+1))-2# Result is: 1.00000 % eval1 (5+3)^(2+1)^2# Result is: 134217728.00000 % eval1 2+3*4^5*6+7# Result is: 18441.00000 % eval1 2 + (3*(4^5)*6) + 7# (same with parentheses) Result is: 18441.00000 % eval1 ((3^2-4*1*2)^(1/2)-3)/(2*1)# Result is: -1.00000 % eval1 ((2-3)^((4+1)*5)/6-(2-4)*7)-8# Result is: 5.83333 % eval1 3^4^2# Result is: 43046721.00000 % eval1 3^(4^2)# (same with parentheses) Result is: 43046721.00000 % eval1 (3^4)^2# Result is: 6561.00000 % eval1 9 - 5 - 3 # Result is: 1.00000 % eval1 8/3/5# Result is: 0.53333 % eval1 8/(3/5)# Result is: 13.33333 % eval1 1+1/(2+1/(2+1/(2+1/(2+1/(2+1/(2+1/(2+1/(2+1/(2+1/(2+1 /(2+1/(2+1/(2+1/(2+1/(2+1/(2+1/(2+1/(2+1/(2+1/(2 ))))))))))))))))))))# Result is: 1.4142135623730949 (Note:sqrt(2) = 1.414213562373095048801688724209...) % eval1 2+1/(1+1/(2+1/(1+1/(1+1/(4+1/(1+1/(1+1/(6+1/(1+1/(1+1 /(8+1/(1+1/(1+1/(2*5+1/(1+1/(1+1/(2*6+1/(1+1/(1+1/(2* 7+1 ))))))))))))))))))))# Result is: 2.7182818284590455 (Note:e = 2.718281828459045235260287471352...) % eval1 3+1/(7+1/(5*3+1/(1+1/((4*(9*8+1)) ))))# Result is: 3.1415926530119025 % eval1 3+1/(7+1/(5*3+1/(1+1/((4*(9*8+1))+1/(1+1/(1+1/(1+1/(2 +1/(1+1/(3+1/(1+1/(2*7+1/(2+1) ))))))))))))# Result is: 3.1415926535897931 (Note:pi = 3.141592653589793238462643383279...) % eval1 1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1 /(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1 /(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1/(1+1 )))))))))))))))))))))))))))))))))))# Result is: 1.6180339887498940 (Note: f = 1.618033988749894848204586834365 ... = (0.5)*(1 + sqrt(5)) ) = Golden Ratio % eval1 4/(1+1/( 3 +( 2 * 2)/ ( 5 +( 3 * 3)/ ( 7 +( 4 * 4)/ ( 9 +( 5 * 5)/ ((9+2) +( 6 * 6)/ ((9+4) +( 7 * 7)/ ((9+6) +( 8 * 8)/ ((9+8) +( 9 * 9) )))) )))))# Result is: 3.1415897324224455 % eval1 4/(1+1/( 3 +( 2 * 2)/ ( 5 +( 3 * 3)/ ( 7 +( 4 * 4)/ ( 9 +( 5 * 5)/ ((9+2) +( 6 * 6)/ ((9+4) +( 7 * 7)/ ((9+6) +( 8 * 8)/ ((9+8) +( 9 * 9)/ ((6*3+1)+((9+1)*(9+1))/ ((6*3+3)+((9+2)*(9+2))/ ((6*3+5)+((9+3)*(9+3))/ ((6*3+7)+((9+4)*(9+4))/ ((6*3+9)+((9+5)*(9+5))/ ((9*3+2)+((9+6)*(9+6))/ ((9*3+4)+((9+7)*(9+7))/ ((9*3+6)+((9+8)*(9+8))/ ((9*3+8)+((9+9)*(9+9))/ ((7*5+2)+((6*3+1)*(6*3+1))/ ((7*5+4)+((6*3+2)*(6*3+2))/ ((7*5+6)+((6*3+3)*(6*3+3))/ ((7*5+8)+((6*3+4)*(6*3+4)) ) ) ))))) ))))) ))))) )))))# Result is: 3.1415926535897936 (Note:pi = 3.141592653589793238462643383279...)