00001 package plp.functional1; 00002 00003 import java.util.ArrayList; 00004 import java.util.List; 00005 00006 import plp.expressions2.expression.ExpSoma; 00007 import plp.expressions2.expression.Expressao; 00008 import plp.expressions2.expression.Id; 00009 import plp.expressions2.expression.ValorInteiro; 00010 import plp.expressions2.expression.ValorString; 00011 import plp.functional1.declaration.DecFuncao; 00012 import plp.functional1.declaration.DecVariavel; 00013 import plp.functional1.expression.Aplicacao; 00014 import plp.functional1.expression.ExpDeclaracao; 00015 import plp.functional1.util.ValorFuncao; 00016 00017 public class Exemplos { 00018 00019 public static void main(String [] args){ 00020 Id idX = new Id("x"); 00021 Id idY = new Id("y"); 00022 Id idZ = new Id("z"); 00023 Id idMult = new Id("mult"); 00024 Id idFat = new Id("fat"); 00025 Id idF = new Id("f"); 00026 Id idN = new Id("n"); 00027 00028 // mult x y = if (x == 0) then (0) else (y + mult (x - 1, y)) 00029 /* 00030 Expressao expMult2 = new ExpSoma( idY, 00031 new Aplicacao( idMult, 00032 new ListaExpressao( new Expressao[] { 00033 new ExpSub(idX, ValorInteiro.UM), idY } ) 00034 ) 00035 ); 00036 Expressao expMult1 = new IfThenElse( 00037 new ExpEquals(idX, ValorInteiro.ZERO), 00038 ValorInteiro.ZERO, 00039 expMult2 00040 ); 00041 DecFuncao funMult = new DecFuncao(idMult, 00042 new ValorFuncao(new ListaId(new Id[] {idX, idY}), expMult1) 00043 ); 00044 00045 00046 Expressao expFat2 = new Aplicacao( idMult, 00047 new ListaExpressao( new Expressao[] { 00048 idN, 00049 new Aplicacao( idFat, 00050 new ListaExpressao( 00051 new ExpSub(idN, 00052 ValorInteiro.UM 00053 ) 00054 ) 00055 )} 00056 ) 00057 ); 00058 Expressao expFat1 = new IfThenElse( 00059 new ExpEquals(idN, ValorInteiro.ZERO), 00060 ValorInteiro.UM, 00061 expFat2 00062 ); 00063 DecFuncao funFat = new DecFuncao(idFat, 00064 new ValorFuncao(new ListaId(idN), expFat1) 00065 ); 00066 ListaExpressao lexp = new ListaExpressao(new ValorInteiro(5)); 00067 ExpDeclaracao exp1 = new ExpDeclaracao(new SeqDec(funFat), new Aplicacao(idFat, lexp)); 00068 ExpDeclaracao exp = new ExpDeclaracao(new SeqDec(funMult), exp1); 00069 */ 00070 00071 00072 // let fun fat n = 00073 // let fun mult x y = if (x == 0) then (0) else (y + (mult (x - 1) y)) 00074 // in if (n == 0) then (1) else (mult n (fat (n - 1))) 00075 // in fat 5 00076 00077 /* 00078 Expressao expMult2 = new ExpSoma( idY, 00079 new Aplicacao( idMult, 00080 new ListaExpressao( new Expressao[] { 00081 new ExpSub(idX, ValorInteiro.UM), idY } ) 00082 ) 00083 ); 00084 Expressao expMult1 = new IfThenElse( 00085 new ExpEquals(idX, ValorInteiro.ZERO), 00086 ValorInteiro.ZERO, 00087 expMult2 00088 ); 00089 DecFuncao funMult = new DecFuncao(idMult, 00090 new ValorFuncao(new ListaId(new Id[] {idX, idY}), expMult1) 00091 ); 00092 00093 00094 Expressao expFat2 = new Aplicacao( idMult, 00095 new ListaExpressao( new Expressao[] { 00096 idN, 00097 new Aplicacao( idFat, 00098 new ListaExpressao( 00099 new ExpSub(idN, 00100 ValorInteiro.UM 00101 ) 00102 ) 00103 )} 00104 ) 00105 ); 00106 Expressao expFat1 = new IfThenElse( 00107 new ExpEquals(idN, ValorInteiro.ZERO), 00108 ValorInteiro.UM, 00109 expFat2 00110 ); 00111 Expressao expFat0 = new ExpDeclaracao(new SeqDec(funMult), expFat1); 00112 DecFuncao funFat = new DecFuncao(idFat, 00113 new ValorFuncao(new ListaId(idN), expFat0) 00114 ); 00115 00116 ListaExpressao lexp = new ListaExpressao(new ValorInteiro(5)); 00117 ExpDeclaracao exp = new ExpDeclaracao(new SeqDec(funFat), new Aplicacao(idFat, lexp)); 00118 System.out.println("Expressao original:"); 00119 System.out.println(exp); 00120 Programa prog = new Programa(exp); 00121 00122 */ 00123 00124 /* 00125 // let var x = 3 in 00126 // let fun n y = y + x in 00127 // let var x = 5 in 00128 // n 1 00129 DecVariavel decX1 = new DecVariavel(idX, new ValorInteiro(3)); 00130 DecVariavel decX2 = new DecVariavel(idX, new ValorInteiro(5)); 00131 Expressao exp = new Aplicacao(idN, new ListaExpressao(ValorInteiro.UM)); 00132 Expressao exp2 = new ExpDeclaracao(new SeqDec(decX2), exp); 00133 DecFuncao decN = new DecFuncao(idN, new ValorFuncao(new ListaId(idY), new ExpSoma(idX, idY))); 00134 Expressao exp3 = new ExpDeclaracao(new SeqDec(decN), exp2); 00135 Expressao exp4 = new ExpDeclaracao(new SeqDec(decX1), exp3); 00136 Programa prog = new Programa(exp4); 00137 */ 00138 00139 /* 00140 // let fun f x = x + 1 in f 2 00141 DecFuncao decF = new DecFuncao(idF, new ValorFuncao(new ListaId(idX), new ExpSoma(idX, ValorInteiro.UM))); 00142 Expressao exp = new ExpDeclaracao(new SeqDec(decF), new Aplicacao(idF, new ListaExpressao(new ValorInteiro(2)))); 00143 Programa prog = new Programa(exp); 00144 */ 00145 00146 // let x=3,f(x,y)=x+y in f(2,x) 00147 /* Id idX = new Id("x"); 00148 Id idY = new Id("y"); 00149 Id idF = new Id("f"); 00150 DecVariavel decVar = new DecVariavel( idX , new ValorBooleano(true) ); 00151 DecFuncao decFun = new DecFuncao(idF, new ValorFuncao( new ListaId(idX,new ListaId(idY)),new ExpSoma(idX ,idY) ) ); 00152 ExpDeclaracao expDeclara = new ExpDeclaracao(new SeqDec(decVar,new SeqDec(decFun)),new Aplicacao(idF,new ListaExpressao(new ValorInteiro(2),new ListaExpressao(idX)) ) ); 00153 Programa prog = new Programa( expDeclara ); 00154 */ 00155 // let var y = 3 in 00156 // let fun f x = x + y in 00157 // let var z = "abc" in 00158 // f 3 00159 List valor3 = new ArrayList(); 00160 valor3.add(new ValorInteiro(3)); 00161 Expressao exp = new Aplicacao(idF, valor3); 00162 00163 Expressao exp2; 00164 { 00165 List declaracoes = new ArrayList(); 00166 declaracoes.add(new DecVariavel(idZ, new ValorString("abc"))); 00167 exp2 = new ExpDeclaracao(declaracoes, 00168 exp); 00169 } 00170 00171 List idXList = new ArrayList(); 00172 idXList.add(idX); 00173 DecFuncao decF = new DecFuncao(idF, new ValorFuncao(idXList, 00174 new ExpSoma(idX, idY))); 00175 00176 Expressao exp3; 00177 { 00178 List declaracoes = new ArrayList(); 00179 declaracoes.add(decF); 00180 exp3 = new ExpDeclaracao(declaracoes, exp2); 00181 } 00182 00183 Expressao exp4; 00184 { 00185 List declaracoes = new ArrayList() ; 00186 declaracoes.add(new DecVariavel(idY, new ValorInteiro(3))); 00187 exp4 = new ExpDeclaracao(declaracoes, 00188 exp3); 00189 } 00190 Programa prog = new Programa( exp4 ); 00191 00192 System.out.println("Expressao:"); 00193 System.out.println(prog.getExpressao().toString()); 00194 try { 00195 if (!prog.checaTipo()) { 00196 System.out.println("Erro de tipo"); 00197 } else { 00198 System.out.println(prog.executar()); 00199 } 00200 } catch (Exception e) { 00201 System.out.println("Erro: " + e); 00202 e.printStackTrace(); 00203 } 00204 00205 } 00206 00207 } 00208