diff --git a/src/main/java/TP2/LLVM.java b/src/main/java/TP2/LLVM.java new file mode 100644 index 0000000..70209e9 --- /dev/null +++ b/src/main/java/TP2/LLVM.java @@ -0,0 +1,286 @@ +package TP2; + +import java.util.ArrayList; +import java.util.List; + + + + +public class LLVM { + + static String INDENT = " "; + + sealed interface Prog{} + sealed interface Fonction{ + String toString(String string);} + sealed interface Instr permits Return,Bloc,Aff,Print,Read,IfThen,IfThenElse,While { + String toString(String string);} + sealed interface Type permits INT,VOID {} + sealed interface ListDecl{ + String toString(String string);} + sealed interface ListPar{} + sealed interface ListInstr{ + String toString(String string);} + sealed interface Par{} + sealed interface Expression{} + + + public static void main(String[] args) { + + Expression exp1 = new Add(new Add(new Val(0),new Val(1)),new Val(2)); + ListPar param = new ListParImpl(new ArrayList<>()); + ArrayList l = new ArrayList<>(); + l.add(new Return(exp1)); + Fonction f = new FonctionImpl(new VOID(),"main",param,l); + + Prog p1 = new ProgImpl(List.of(f)); + + System.out.println(p1.toString()); + + System.out.println("\n"); + + Var a = new Var("a"); + Var b = new Var("b"); + Prog p2 = new ProgImpl(List.of( + f, + new FonctionImpl(new INT(),"maFonction",new ListParImpl(List.of(new ParImpl(new INT(),a),new ParImpl(new INT(),b) )),List.of( + new IfThenElse(a,List.of( + new Print(List.of("a = ",a)) + ),List.of( + new Print(List.of("b = ",b)) + )), + new While(b, List.of( + new Aff(b, new Modulo(b,new Val(2))) + )), + new Return(new Add(a,b)) + )) + + + + )); + + System.out.println(p2.toString()); + } + + + record ProgImpl(List fonctions) implements Prog{ + public String toString(){ + String str =""; + for(int i = 0; i instrs) implements Fonction{ + public String toString(String indent){ + String str = indent+"FUNC " + type.toString()+ " " + nom +" ("+param.toString()+"){\n"; + for(int i = 0; i listDecls, ListInstr instrs) implements Instr{ + public String toString(String indent){ + String str = indent +"{\n"; + for(int i = 0; i items) implements Instr{ //TODO pas bon + public String toString(String indent){ + String str = indent + "READ"; + for(int i = 0; i instrs) implements Instr{ + public String toString(String indent){ + String str = indent + "IF " + cond.toString() + "\n" + indent + "THEN\n"; + for(int i = 0; i< instrs.size(); i++){ + str += instrs.get(i).toString(indent+INDENT) + "\n"; + if(i instrs1, List instrs2) implements Instr{ + public String toString(String indent){ + String str = indent + "IF " + cond.toString() + "\n" + indent + "THEN\n"; + for(int i = 0; i< instrs1.size(); i++){ + str += instrs1.get(i).toString(indent+INDENT) + "\n"; + } + str += indent + "ELSE\n"; + for(int i = 0; i< instrs2.size(); i++){ + str += instrs2.get(i).toString(indent+INDENT); + if(i instrs) implements Instr{ + public String toString(String indent){ + String str = indent + "WHILE " + cond.toString() +"\n" + indent +"DO{\n"; + for(int i = 0; i< instrs.size(); i++){ + str += instrs.get(i).toString(indent+INDENT) + "\n"; + } + str += indent + "}"; + return str; + } + } + + record INT() implements Type{ + public String toString(){ + return "INT"; + } + } + + record VOID() implements Type{ + public String toString(){ + return "VOID"; + } + } + + record ListDeclImpl(Type type, List vars) implements ListDecl{ + public String toString(String indent){ + String str = indent + type.toString() + " "; + for(int i = 0; i pars) implements ListPar{ + public String toString(){ + String str = ""; + for(int i = 0; i instrs) implements ListInstr{ + public String toString(String indent){ + String str = ""; + for(int i = 0; i