% 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...)