diff --git a/ws2011/Compiler I/Uebungen/2. Uebung/c1-ex02/ConstantFolding.java b/ws2011/Compiler I/Uebungen/2. Uebung/c1-ex02/ConstantFolding.java new file mode 100644 index 00000000..597359a2 --- /dev/null +++ b/ws2011/Compiler I/Uebungen/2. Uebung/c1-ex02/ConstantFolding.java @@ -0,0 +1,511 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package solution; +import Triangle.AbstractSyntaxTrees.AnyTypeDenoter; +import Triangle.AbstractSyntaxTrees.ArrayExpression; +import Triangle.AbstractSyntaxTrees.ArrayTypeDenoter; +import Triangle.AbstractSyntaxTrees.AssignCommand; +import Triangle.AbstractSyntaxTrees.BinaryExpression; +import Triangle.AbstractSyntaxTrees.BinaryOperatorDeclaration; +import Triangle.AbstractSyntaxTrees.BoolTypeDenoter; +import Triangle.AbstractSyntaxTrees.CallCommand; +import Triangle.AbstractSyntaxTrees.CallExpression; +import Triangle.AbstractSyntaxTrees.CharTypeDenoter; +import Triangle.AbstractSyntaxTrees.CharacterExpression; +import Triangle.AbstractSyntaxTrees.CharacterLiteral; +import Triangle.AbstractSyntaxTrees.ConstActualParameter; +import Triangle.AbstractSyntaxTrees.ConstDeclaration; +import Triangle.AbstractSyntaxTrees.ConstFormalParameter; +import Triangle.AbstractSyntaxTrees.DotVname; +import Triangle.AbstractSyntaxTrees.EmptyActualParameterSequence; +import Triangle.AbstractSyntaxTrees.EmptyCommand; +import Triangle.AbstractSyntaxTrees.EmptyExpression; +import Triangle.AbstractSyntaxTrees.EmptyFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.ErrorTypeDenoter; +import Triangle.AbstractSyntaxTrees.Expression; +import Triangle.AbstractSyntaxTrees.FuncActualParameter; +import Triangle.AbstractSyntaxTrees.FuncDeclaration; +import Triangle.AbstractSyntaxTrees.FuncFormalParameter; +import Triangle.AbstractSyntaxTrees.Identifier; +import Triangle.AbstractSyntaxTrees.IfCommand; +import Triangle.AbstractSyntaxTrees.IfExpression; +import Triangle.AbstractSyntaxTrees.IntTypeDenoter; +import Triangle.AbstractSyntaxTrees.IntegerExpression; +import Triangle.AbstractSyntaxTrees.IntegerLiteral; +import Triangle.AbstractSyntaxTrees.LetCommand; +import Triangle.AbstractSyntaxTrees.LetExpression; +import Triangle.AbstractSyntaxTrees.MultipleActualParameterSequence; +import Triangle.AbstractSyntaxTrees.MultipleArrayAggregate; +import Triangle.AbstractSyntaxTrees.MultipleFieldTypeDenoter; +import Triangle.AbstractSyntaxTrees.MultipleFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.MultipleRecordAggregate; +import Triangle.AbstractSyntaxTrees.Operator; +import Triangle.AbstractSyntaxTrees.ProcActualParameter; +import Triangle.AbstractSyntaxTrees.ProcDeclaration; +import Triangle.AbstractSyntaxTrees.ProcFormalParameter; +import Triangle.AbstractSyntaxTrees.Program; +import Triangle.AbstractSyntaxTrees.RecordExpression; +import Triangle.AbstractSyntaxTrees.RecordTypeDenoter; +import Triangle.AbstractSyntaxTrees.SequentialCommand; +import Triangle.AbstractSyntaxTrees.SequentialDeclaration; +import Triangle.AbstractSyntaxTrees.SimpleTypeDenoter; +import Triangle.AbstractSyntaxTrees.SimpleVname; +import Triangle.AbstractSyntaxTrees.SingleActualParameterSequence; +import Triangle.AbstractSyntaxTrees.SingleArrayAggregate; +import Triangle.AbstractSyntaxTrees.SingleFieldTypeDenoter; +import Triangle.AbstractSyntaxTrees.SingleFormalParameterSequence; +import Triangle.AbstractSyntaxTrees.SingleRecordAggregate; +import Triangle.AbstractSyntaxTrees.SubscriptVname; +import Triangle.AbstractSyntaxTrees.TypeDeclaration; +import Triangle.AbstractSyntaxTrees.UnaryExpression; +import Triangle.AbstractSyntaxTrees.UnaryOperatorDeclaration; +import Triangle.AbstractSyntaxTrees.VarActualParameter; +import Triangle.AbstractSyntaxTrees.VarDeclaration; +import Triangle.AbstractSyntaxTrees.VarFormalParameter; +import Triangle.AbstractSyntaxTrees.Visitor; +import Triangle.AbstractSyntaxTrees.VnameExpression; +import Triangle.AbstractSyntaxTrees.WhileCommand; +import Triangle.StdEnvironment; +import Triangle.SyntacticAnalyzer.SourcePosition; + +/** + * + * @author Michael + */ +public class ConstantFolding implements Visitor{ + + + + /** + * Returns true if the given expression represents constant value. + * This value can be a boolean or integer. + * @param e the expression to test + * @return true if the given expression represents constant value + */ + private boolean isConstant(Expression e) { + if(e instanceof IntegerExpression) + return true; + if(e instanceof VnameExpression) { + VnameExpression vname = (VnameExpression)e; + if(vname.V instanceof SimpleVname) + if(((SimpleVname)vname.V).I.spelling.equals(StdEnvironment.trueDecl.I.spelling) + || ((SimpleVname)vname.V).I.spelling.equals(StdEnvironment.falseDecl.I.spelling)) + return true; + } + return false; + } + + /** + * Returns the boolean value of the given expression that represents a boolean value. + * @param e a boolean value + * @return the boolean value of the given expression that represents a boolean value + */ + private boolean parseBoolean(Expression e) { + if(e instanceof VnameExpression) { + VnameExpression vname = (VnameExpression)e; + if(vname.V instanceof SimpleVname) + if(((SimpleVname)vname.V).I.spelling.equals(StdEnvironment.trueDecl.I.spelling)) + return true; + if(((SimpleVname)vname.V).I.spelling.equals(StdEnvironment.falseDecl.I.spelling)) + return false; + } + throw new RuntimeException(); + } + + /** + * Returns an expression representing the given boolean value. + * @param val the boolean value that will be represented by the returned expression + * @return an expression representing the given boolean value + */ + private Expression createBoolean(boolean val) { + Identifier iAST = new Identifier(val ? "true" : "false", new SourcePosition()); + iAST.decl = val ? StdEnvironment.trueDecl : StdEnvironment.falseDecl; + SimpleVname vAST = new SimpleVname(iAST, new SourcePosition()); + vAST.type = StdEnvironment.booleanType; + VnameExpression boolExpression = new VnameExpression(vAST, new SourcePosition()); + return boolExpression; + } + + + + @Override + public Object visitBinaryExpression(BinaryExpression ast, Object o) { + + boolean e1 = false; + boolean e2 = false; + if(isConstant(ast.E1)){ + //optimize E + try{ + boolean b = parseBoolean(ast.E1); + ast.E1.value = createBoolean(b); + ast.E1.type = boolean; + + + } catch (RuntimeException e) + { + ast.E1.type = integer; + + } + e1 = true; + } + + if(isConstant(ast.E2)){ + //optimize E + try{ + boolean b = parseBoolean(ast.E2); + ast.E2.value = createBoolean(b); + ast.E2.type = boolean; + + + } catch (RuntimeException e) + { + ast.E2.type = integer; + + } + e2 = true; + } + + if(e1 & e2) { + return new ConstExpression(ast.O(ast.E1, ast.E2)); + } + + return ast; + + } + + @Override + public Object visitUnaryExpression(UnaryExpression ast, Object o) { + if(isConstant(ast.E)){ + //optimize E + try{ + boolean b = parseBoolean(ast.E); + ast.E.value = createBoolean(b); + ast.E.type = boolean; + //optimize operator + ast.E.value = ast.O(b); + + + + } catch (RuntimeException e) + { + ast.E.type = integer; + //optimize operator + ast.E.value = ast.O((Integer) ast.E.value); + } + + + return ast; + } + } + + + + + + + @Overridev + public Object visitBinaryOperatorDeclaration(BinaryOperatorDeclaration ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast, Object o) { + return null; // not of interest + } + + + + + @Override + public Object visitAssignCommand(AssignCommand ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitCallCommand(CallCommand ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitEmptyCommand(EmptyCommand ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitIfCommand(IfCommand ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitLetCommand(LetCommand ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitSequentialCommand(SequentialCommand ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitWhileCommand(WhileCommand ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitArrayExpression(ArrayExpression ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitCallExpression(CallExpression ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitCharacterExpression(CharacterExpression ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitEmptyExpression(EmptyExpression ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitIfExpression(IfExpression ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitIntegerExpression(IntegerExpression ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitLetExpression(LetExpression ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitRecordExpression(RecordExpression ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitVnameExpression(VnameExpression ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitConstDeclaration(ConstDeclaration ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitFuncDeclaration(FuncDeclaration ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitProcDeclaration(ProcDeclaration ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitSequentialDeclaration(SequentialDeclaration ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitTypeDeclaration(TypeDeclaration ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitVarDeclaration(VarDeclaration ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitMultipleArrayAggregate(MultipleArrayAggregate ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitSingleArrayAggregate(SingleArrayAggregate ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitMultipleRecordAggregate(MultipleRecordAggregate ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitSingleRecordAggregate(SingleRecordAggregate ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitConstFormalParameter(ConstFormalParameter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitFuncFormalParameter(FuncFormalParameter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitProcFormalParameter(ProcFormalParameter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitVarFormalParameter(VarFormalParameter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitEmptyFormalParameterSequence(EmptyFormalParameterSequence ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitMultipleFormalParameterSequence(MultipleFormalParameterSequence ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitSingleFormalParameterSequence(SingleFormalParameterSequence ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitConstActualParameter(ConstActualParameter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitFuncActualParameter(FuncActualParameter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitProcActualParameter(ProcActualParameter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitVarActualParameter(VarActualParameter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitEmptyActualParameterSequence(EmptyActualParameterSequence ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitMultipleActualParameterSequence(MultipleActualParameterSequence ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitSingleActualParameterSequence(SingleActualParameterSequence ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitAnyTypeDenoter(AnyTypeDenoter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitArrayTypeDenoter(ArrayTypeDenoter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitBoolTypeDenoter(BoolTypeDenoter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitCharTypeDenoter(CharTypeDenoter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitErrorTypeDenoter(ErrorTypeDenoter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitSimpleTypeDenoter(SimpleTypeDenoter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitIntTypeDenoter(IntTypeDenoter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitRecordTypeDenoter(RecordTypeDenoter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitCharacterLiteral(CharacterLiteral ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitIdentifier(Identifier ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitIntegerLiteral(IntegerLiteral ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitOperator(Operator ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitDotVname(DotVname ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitSimpleVname(SimpleVname ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitSubscriptVname(SubscriptVname ast, Object o) { + return null; // not of interest + } + + @Override + public Object visitProgram(Program ast, Object o) { + return null; // not of interest + } + +} diff --git a/ws2011/Compiler I/Uebungen/2. Uebung/c1-ex02/constant_folding_helper_functions.java b/ws2011/Compiler I/Uebungen/2. Uebung/c1-ex02/constant_folding_helper_functions.java deleted file mode 100644 index 5db56e5e..00000000 --- a/ws2011/Compiler I/Uebungen/2. Uebung/c1-ex02/constant_folding_helper_functions.java +++ /dev/null @@ -1,49 +0,0 @@ - /** - * Returns true if the given expression represents constant value. - * This value can be a boolean or integer. - * @param e the expression to test - * @return true if the given expression represents constant value - */ - private boolean isConstant(Expression e) { - if(e instanceof IntegerExpression) - return true; - if(e instanceof VnameExpression) { - VnameExpression vname = (VnameExpression)e; - if(vname.V instanceof SimpleVname) - if(((SimpleVname)vname.V).I.spelling.equals(StdEnvironment.trueDecl.I.spelling) - || ((SimpleVname)vname.V).I.spelling.equals(StdEnvironment.falseDecl.I.spelling)) - return true; - } - return false; - } - - /** - * Returns the boolean value of the given expression that represents a boolean value. - * @param e a boolean value - * @return the boolean value of the given expression that represents a boolean value - */ - private boolean parseBoolean(Expression e) { - if(e instanceof VnameExpression) { - VnameExpression vname = (VnameExpression)e; - if(vname.V instanceof SimpleVname) - if(((SimpleVname)vname.V).I.spelling.equals(StdEnvironment.trueDecl.I.spelling)) - return true; - if(((SimpleVname)vname.V).I.spelling.equals(StdEnvironment.falseDecl.I.spelling)) - return false; - } - throw new RuntimeException(); - } - - /** - * Returns an expression representing the given boolean value. - * @param val the boolean value that will be represented by the returned expression - * @return an expression representing the given boolean value - */ - private Expression createBoolean(boolean val) { - Identifier iAST = new Identifier(val ? "true" : "false", new SourcePosition()); - iAST.decl = val ? StdEnvironment.trueDecl : StdEnvironment.falseDecl; - SimpleVname vAST = new SimpleVname(iAST, new SourcePosition()); - vAST.type = StdEnvironment.booleanType; - VnameExpression boolExpression = new VnameExpression(vAST, new SourcePosition()); - return boolExpression; - }