// Osnovna hijerarhija klasa za predstavjanje sintaksickog stabla izraza. // Bazna klasa hijerarhije abstract class Expression { // stampanje izraza (samo za svrhe debagovanja) public void print() { print(0); } // stampanje izraza na datom nivou nazubljivanja protected void print(int level) { for (int i = 0; i < level; i++) System.out.print("\t"); printMe(level); } // stampanje detalja specificnih za vrstu izraza protected abstract void printMe(int level); } // Konstante su vrsta izraza class Constant extends Expression { // Svaku konstantu karakterise njena celobrojna vrednost int value; // Konstruktor na onsovu vrednosti konstante public Constant(int value) { this.value = value; } // stampanje protected void printMe(int level) { System.out.println("Con: " + value); } } // Promenljive su vrsta izraza class Variable extends Expression { // Ime promenljive String name; // Konstrukturo na osnovu imena promenljive public Variable(String name) { this.name = name; } // stampanje protected void printMe(int level) { System.out.println("Var: " + name); } } // Operatori (potencijalno n-arni) class Operator extends Expression { // vrsta operatora ('+', '-', '*', '/') char operator; // operandi Expression[] operands; // Konstruktor binarnog operatora public Operator(char operator, Expression op1, Expression op2) { this.operator = operator; this.operands = new Expression[2]; this.operands[0] = op1; this.operands[1] = op2; } // stampanje protected void printMe(int level) { System.out.println("Op: " + operator); for (int i = 0; i < operands.length; i++) // rekurzivno stampamo operande na narednom nivou nazubljivanja operands[i].print(level+1); } } class Program { public static void main(String[] args) throws java.io.IOException { // Kreiramo izraz: 3 + x Expression e = new Operator('+', new Constant(3), new Variable("x")); // Ispisujemo ga e.print(); } }