ten42% cat -n rpn.c
1 /* rpn: output Reverse Polish Form */
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <ctype.h>
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 ***