class Prec {
private GetNext getChar = new GetNext();
private char ch;
private char temp = 'A';
private String P() {
String res = "";
while ((ch =
getChar.getNextChar()) != '$') {
if (ch == '+') res += ")))+(((";
else if (ch == '-') res += ")))-(((";
else if (ch == '*') res += "))*((";
else if (ch == '/') res += "))/((";
else if (ch == '^') res += ")^(";
else res += ch;
}
return "(((" + res + ")))$";
}
private String Q(String res) {
String s = "";
for (int i = 0; i < res.length(); i++)
System.out.print(res.charAt(i));
System.out.print("\n");
int level = 0;
for (int i = 0; i < res.length(); i++) {
char c = res.charAt(i);
if (c == '(') {
level++;
s = s + '(' + level;
}
else if (c == ')') {
level--;
s = s + ')' + level;
}
else s = s + c;
}
return s;
}
int maxLevel(String s) {
int maxL = 0;
int loc = -1;
for(int i = s.length()-1; i >= 0;i--){
char c = s.charAt(i);
if (Character.isDigit(c)) {
if ( (c-'0') >= maxL) {
loc = i;
maxL = c-'0';
}
}
}
return loc;
}
|
char nextTemp() {
char ret = temp;
temp++;
return ret;
}
String reduce(String s) {
for (int i = 0; i < 20; i++) {
int loc = maxLevel(s);
if (s.charAt(loc+2) == ')') {
String s1 = s.substring(0, loc-1);
String s2 = s.substring(loc+1,loc+2);
String s3 = s.substring(loc+4);
s = s1 + s2 + s3;
System.out.println("step:" + i +
",s:" + s);
}
else if (s.charAt(loc+4) == ')') {
String s1 = s.substring(0, loc-1);
String s2 = s.substring(loc+1,loc+4);
String s3 = s.substring(loc+6);
char temp1 = nextTemp();
System.out.println("Inst: " + temp1 +
" = " + s2);
s = s1 + temp1 + s3;
System.out.println("step:" + i +
",s:" + s);
}
}
return s;
}
public static void main(String[] args) {
Prec prec = new Prec();
String res = prec.P();
System.out.println("res:" + res);
String s = prec.Q(res);
System.out.println("s:" + s);
res = prec.reduce(s);
System.out.println("res:" + res);
}
}
|