import java.lang.*; import java.io.*; // Released under the GNU General Public License Version 2, June 1991. public abstract class Expression // Defines expression parse-trees { public abstract void appendSB(StringBuffer sb); // printing - efficiency! public static class Ident extends Expression // Ident { public final String id; // e.g. x public Ident(String id) { this.id = id; } public void appendSB(StringBuffer sb) { sb.append(id); } } public static class IntCon extends Expression // IntCon { public final int n; // e.g. 3 public IntCon(int n) { this.n = n; } public void appendSB(StringBuffer sb) { sb.append(String.valueOf(n)); } } public static class Unary extends Expression // Unary { public final int opr; public final Expression e; // e.g. -7 public Unary(int opr, Expression e) { this.e = e; this.opr = opr; } public void appendSB(StringBuffer sb) { sb.append( "(" + Lexical.Symbol[opr] + " " ); e.appendSB(sb); sb.append( ")" ); } }//Unary public static class Binary extends Expression // Binary { public final int opr; public final Expression lft, rgt; // e.g. x+3 public Binary(int opr, Expression lft, Expression rgt) { this.opr = opr; this.lft = lft; this.rgt = rgt; } public void appendSB(StringBuffer sb) { sb.append( "(" ); lft.appendSB(sb); sb.append( " " + Lexical.Symbol[opr] + " " ); rgt.appendSB(sb); sb.append( ")" ); } }//Binary /* Using a StringBuffer gives linear rather than quadratic complexity. */ public String toString() { StringBuffer sb = new StringBuffer(); // efficiency! appendSB(sb); return sb.toString(); }//toString public static void error(String msg) { System.out.println("\nError: " + msg); System.exit(1); }//error }//Expression class L. Allison, September 2001, // School of Computer Science and Software Engineering, // Monash University, Australia 3800