package labss.frames.refimpl;

import labss.generator.*;

/**
 * Esempio di uso della libreria PatternGenerator per generare le classi
 * che implementano le operazioni unarie e binarie nell'esempio Exp
 * visto a lezione.
 * @author Riccardo Solmi
 */
public class MainEsempio {
    public static void main(String[] args) throws java.io.IOException {
        IFrameRegistry fr = null; // inizializzate con la vostra implementazione

        fr.put("OpExpression", fr.create(
            "public class <!opName!>Expression implements Expression {<!cr!>"+
            "<? <!isBinary!>private Expression expr1;<!cr!>?>"+
            "   private Expression expr2;<!cr!><!cr!>"+

            "   public <!opName!>Expression(<?<!isBinary!>Expression expr1, ?>Expression expr2) {<!cr!>"+
            "<?     <!isBinary!>this.expr1 = expr1;<!cr!>?>"+
            "       this.expr2 = expr2;<!cr!>"+
            "   }<!cr!><!cr!>"+

            "   public int evaluate(Context c) {<!cr!>"+
            "       return <?<!isBinary!>expr1.evaluate(c) ?><!opCode!> expr2.evaluate(c);<!cr!>"+
            "   }<!cr!><!cr!>"+

            "   public String toString() {<!cr!>"+
            "       return <?<!isBinary!>expr1.toString() + ?>\" <!opCode!> \" + expr2.toString();<!cr!>"+
            "   }<!cr!>"+
            "}<!cr!>")
            .setSlot("cr", "\n")
        );

        fr.create("<!rootFrames!>")
            .addSlot("rootFrames", fr.get("OpExpression")
                .setSlot("opName", "Add")
                .setSlot("opCode", "+")
                .setSlot("isBinary", "")
            )
            .addSlot("rootFrames", fr.get("OpExpression")
                .setSlot("opName", "Mul")
                .setSlot("opCode", "*")
                .setSlot("isBinary", "")
            )
            .addSlot("rootFrames", fr.get("OpExpression")
                .setSlot("opName", "Neg")
                .setSlot("opCode", "-")
            )
            .export();
    }
}

