/* * 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 visitAssignCommand(AssignCommand ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitCallCommand(CallCommand ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitEmptyCommand(EmptyCommand ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitIfCommand(IfCommand ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitLetCommand(LetCommand ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitSequentialCommand(SequentialCommand ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitWhileCommand(WhileCommand ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitArrayExpression(ArrayExpression ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitBinaryExpression(BinaryExpression ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitCallExpression(CallExpression ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitCharacterExpression(CharacterExpression ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitEmptyExpression(EmptyExpression ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitIfExpression(IfExpression ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitIntegerExpression(IntegerExpression ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitLetExpression(LetExpression ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitRecordExpression(RecordExpression ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitUnaryExpression(UnaryExpression ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitVnameExpression(VnameExpression ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitBinaryOperatorDeclaration(BinaryOperatorDeclaration ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitConstDeclaration(ConstDeclaration ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitFuncDeclaration(FuncDeclaration ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitProcDeclaration(ProcDeclaration ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitSequentialDeclaration(SequentialDeclaration ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitTypeDeclaration(TypeDeclaration ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitUnaryOperatorDeclaration(UnaryOperatorDeclaration ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitVarDeclaration(VarDeclaration ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitMultipleArrayAggregate(MultipleArrayAggregate ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitSingleArrayAggregate(SingleArrayAggregate ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitMultipleRecordAggregate(MultipleRecordAggregate ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitSingleRecordAggregate(SingleRecordAggregate ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitConstFormalParameter(ConstFormalParameter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitFuncFormalParameter(FuncFormalParameter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitProcFormalParameter(ProcFormalParameter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitVarFormalParameter(VarFormalParameter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitEmptyFormalParameterSequence(EmptyFormalParameterSequence ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitMultipleFormalParameterSequence(MultipleFormalParameterSequence ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitSingleFormalParameterSequence(SingleFormalParameterSequence ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitConstActualParameter(ConstActualParameter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitFuncActualParameter(FuncActualParameter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitProcActualParameter(ProcActualParameter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitVarActualParameter(VarActualParameter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitEmptyActualParameterSequence(EmptyActualParameterSequence ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitMultipleActualParameterSequence(MultipleActualParameterSequence ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitSingleActualParameterSequence(SingleActualParameterSequence ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitAnyTypeDenoter(AnyTypeDenoter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitArrayTypeDenoter(ArrayTypeDenoter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitBoolTypeDenoter(BoolTypeDenoter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitCharTypeDenoter(CharTypeDenoter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitErrorTypeDenoter(ErrorTypeDenoter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitSimpleTypeDenoter(SimpleTypeDenoter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitIntTypeDenoter(IntTypeDenoter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitRecordTypeDenoter(RecordTypeDenoter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitMultipleFieldTypeDenoter(MultipleFieldTypeDenoter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitSingleFieldTypeDenoter(SingleFieldTypeDenoter ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitCharacterLiteral(CharacterLiteral ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitIdentifier(Identifier ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitIntegerLiteral(IntegerLiteral ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitOperator(Operator ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitDotVname(DotVname ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitSimpleVname(SimpleVname ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitSubscriptVname(SubscriptVname ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } @Override public Object visitProgram(Program ast, Object o) { throw new UnsupportedOperationException("Not supported yet."); } }