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 ***