/* Paren.java:
* grammar:
* P ---> E '$'
* E ---> T {('+'|'-') T}
* T ---> S {('*'|'/') S}
* S ---> F '^' S | F
* F ---> char | '(' E ')'
*/
public class Paren {
private GetNext getChar = new GetNext();
private char next;
public String P() {
String res;
scan();
res = E();
if (next != '$') return "ERROR";
else return res;
}
private String E() {
String res;
char save;
res = T();
while (next == '+' || next == '-') {
save = next;
scan();
res = "[" + res + save + T() + "]";
}
return res;
}
private String T() {
String res;
char save;
res = S();
while (next == '*' || next == '/') {
save = next;
scan();
res = "[" + res + save + S() + "]";
}
return res;
}
private String S() {
String res;
res = F();
if (next == '^') {
scan();
res = "[" + res + "^" + S() + "]";
}
return res;
}
| private String F() {
String res = "";
if (Character.isLetterOrDigit(next)) {
res = next + "";
scan();
}
else if (next == '(') {
scan();
res = E();
if (next == ')') {
scan();
}
else {
error(2);
res = "ERROR";
}
}
else {
error(3);
res = "ERROR";
}
return res;
}
private void scan() {
while (Character.isWhitespace(next =
getChar.getNextChar()))
;
}
private void error(int n) {
System.out.println("*** ERROR: " + n);
System.exit(1);
}
public static void main(String[] args) {
Paren paren = new Paren();
String res = paren.P();
System.out.println(res);
}
}
% javac GetNext.java
% javac Paren.java
% java Paren
1 + 2 * 3 $
[1+[2*3]]
% java Paren
(1 + (2 * 3) )$
[1+[2*3]]
% java Paren
1*(2+3)$
[1*[2+3]]
|