ten42% cat -n rpn.c 1 /* rpn: output Reverse Polish Form */ 2 #include 3 #include 4 #include 5 char next; 6 void E(void); 7 void T(void); 8 void S(void); 9 void F(void); 10 void gen(char); 11 void error(void); 12 void scan(void); 13 14 void main(void) 15 { 16 scan(); 17 E(); 18 if (next != '#') error(); 19 else printf("\n"); 20 } 21 void E(void) 22 { 23 char save; 24 T(); 25 while (next == '+' || next == '-') { 26 save = next; 27 scan(); 28 T(); 29 gen(save); 30 } 31 } 32 void T(void) 33 { 34 char save; 35 S(); 36 while (next == '*' || next == '/') { 37 save = next; 38 scan(); 39 S(); 40 gen(save); 41 } 42 } 43 void S(void) 44 { 45 F(); 46 if (next == '^') { 47 scan(); 48 S(); 49 gen('^'); 50 } 51 } 52 void F(void) 53 { 54 if (isalpha(next)) { 55 gen(next); 56 scan(); 57 } 58 else if (next == '(') { 59 scan(); 60 E(); 61 if (next == ')') scan(); 62 else error(); 63 } 64 else { 65 error(); 66 } 67 } 68 void scan(void) 69 { 70 while (isspace(next = getchar())) 71 ; 72 } 73 void error(void) 74 { 75 printf("\n*** ERROR ***\n"); 76 exit(1); 77 } 78 void gen(char ch) 79 { 80 putchar(ch); 81 } ten42% cc -o rpn rpn.c ten42% rpn a + b + c + d # ab+c+d+ ten42% rpn a^b^c^d# abcd^^^ ten42% rpn (a + b*c)^(d/e - f)*g# abc*+de/f-^g* ten42% rpn a + b c # ab+ *** ERROR *** ten42% rpn ( (a + b)*c # ab+c* *** ERROR *** ten42% rpn a + b ) # ab+ *** ERROR ***