/* RPN.java: use parser to convert to RPN
* grammar:
* P ---> E '#'
* E ---> T {('+'|'-') T}
* T ---> S {('*'|'/') S}
* S ---> F '^' S | F
* F ---> char | '(' E ')'
*/
class RPN {
private int level = 0;
private GetChar getChar = new GetChar();
private char next;
private void P() {
scan();
E();
if (next != '#') error(1);
else System.out.println();
}
private void E() {
T();
while (next == '+' || next == '-') {
char save = next;
scan();
T();
gen(save);
}
}
private void T() {
S();
while (next == '*' || next == '/') {
char save = next;
scan();
S();
gen(save);
}
}
private void S() {
F();
if (next == '^') {
scan();
S();
gen('^');
}
}
private void F() {
if (Character.isLetter(next)) {
gen(next);
scan();
}
else if (next == '(') {
scan();
E();
if (next == ')') scan();
else error(2);
}
else {
error(3);
}
}
private void scan() {
while (Character.isWhitespace(next = getChar.getNextChar()))
;
}
private void error(int n) {
System.out.println("\n*** ERROR: " + n);
System.exit(1);
}
private void gen(char ch) {
System.out.print(ch);
}
public static void main(String[] args) {
RPN rpn = new RPN();
rpn.P();
}
}