clean toLLVM
This commit is contained in:
@@ -66,8 +66,8 @@ public interface Interface{
|
|||||||
|
|
||||||
public interface ExprVisitor<H,S> {
|
public interface ExprVisitor<H,S> {
|
||||||
public S visitConst(ConstImp e,H h);
|
public S visitConst(ConstImp e,H h);
|
||||||
public S visitBinOp(BinopExpressionImp e, H h);
|
|
||||||
public S visitVar(VarImp e,H h);
|
public S visitVar(VarImp e,H h);
|
||||||
|
public S visitBinOp(BinopExpressionImp e, H h);
|
||||||
public S visitCall(CallImp instr, H h);
|
public S visitCall(CallImp instr, H h);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -195,11 +195,6 @@ public class PrettyprinterVisitor implements ProgramVisitor<String,String>,
|
|||||||
|
|
||||||
//EXPRESSION -----------------------------------
|
//EXPRESSION -----------------------------------
|
||||||
|
|
||||||
@Override
|
|
||||||
public String visitConst(ConstImp e, String indent) {
|
|
||||||
return e.c()+"";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String visitBinOp(BinopExpressionImp e, String indent) {
|
public String visitBinOp(BinopExpressionImp e, String indent) {
|
||||||
String opStr = "?";
|
String opStr = "?";
|
||||||
@@ -215,12 +210,17 @@ public class PrettyprinterVisitor implements ProgramVisitor<String,String>,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String visitConst(ConstImp e, String indent) {
|
||||||
|
return e.c()+"";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String visitVar(VarImp e, String h) {
|
public String visitVar(VarImp e, String h) {
|
||||||
return e.name();
|
return e.name();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String visitCall(CallImp instr,String indent){
|
public String visitCall(CallImp instr,String indent){
|
||||||
String str = indent + instr.fName() + "(";
|
String str = indent + instr.fName() + "(";
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//FUNCTION
|
//FUNCTION -----------------------------------
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DefineLLVMImp visitFunction(FunctionImp fun, SymTable h) {
|
public DefineLLVMImp visitFunction(FunctionImp fun, SymTable h) {
|
||||||
@@ -94,6 +94,7 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
return define;
|
return define;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DefineLLVMImp visitPrototype(PrototypeImp fun, SymTable h) {
|
public DefineLLVMImp visitPrototype(PrototypeImp fun, SymTable h) {
|
||||||
ArrayList<VarLLVMImp> params = new ArrayList<>();
|
ArrayList<VarLLVMImp> params = new ArrayList<>();
|
||||||
@@ -103,7 +104,7 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
return new DefineLLVMImp(fun.nom(), fun.type().accept(this, h), params,null);
|
return new DefineLLVMImp(fun.nom(), fun.type().accept(this, h), params,null);
|
||||||
}
|
}
|
||||||
|
|
||||||
//DECLARATION
|
//DECLARATION -----------------------------------
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InstrAndSymTable visitDeclaration(DeclarationImp instr, SymTable h) {
|
public InstrAndSymTable visitDeclaration(DeclarationImp instr, SymTable h) {
|
||||||
@@ -145,35 +146,7 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
return new InstrAndSymTable(list,h);
|
return new InstrAndSymTable(list,h);
|
||||||
}
|
}
|
||||||
|
|
||||||
//INSTRUCTION
|
//INSTRUCTION -----------------------------------
|
||||||
|
|
||||||
@Override
|
|
||||||
public ArrayList<InstructionLLVM> visitBloc(BlocImp instr, SymTable h) {
|
|
||||||
h= h.newBlock();
|
|
||||||
ArrayList<InstructionLLVM> instrLLVM = new ArrayList<>();
|
|
||||||
for(int i = 0; i<instr.instrs().size(); i++){
|
|
||||||
instrLLVM.addAll(instr.instrs().get(i).accept(this, h));
|
|
||||||
}
|
|
||||||
|
|
||||||
h= h.outBlock();
|
|
||||||
return instrLLVM;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ArrayList<InstructionLLVM> visitBlocDec(BlocDecImp instr, SymTable h) {
|
|
||||||
|
|
||||||
ArrayList<InstructionLLVM> instrLLVM = new ArrayList<>();
|
|
||||||
for(int i = 0; i<instr.decls().size(); i++){
|
|
||||||
InstrAndSymTable temp = instr.decls().get(i).accept(this, h);
|
|
||||||
h = temp.symTable;
|
|
||||||
instrLLVM.addAll(temp.instrs);
|
|
||||||
}
|
|
||||||
for(int i = 0; i<instr.instrs().size(); i++){
|
|
||||||
instrLLVM.addAll(instr.instrs().get(i).accept(this, h));
|
|
||||||
}
|
|
||||||
|
|
||||||
return instrLLVM;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<InstructionLLVM> visitReturn(Return_instrImp instr, SymTable h) {
|
public ArrayList<InstructionLLVM> visitReturn(Return_instrImp instr, SymTable h) {
|
||||||
@@ -193,6 +166,36 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<InstructionLLVM> visitBloc(BlocImp instr, SymTable h) {
|
||||||
|
h= h.newBlock();
|
||||||
|
ArrayList<InstructionLLVM> instrLLVM = new ArrayList<>();
|
||||||
|
for(int i = 0; i<instr.instrs().size(); i++){
|
||||||
|
instrLLVM.addAll(instr.instrs().get(i).accept(this, h));
|
||||||
|
}
|
||||||
|
|
||||||
|
h= h.outBlock();
|
||||||
|
return instrLLVM;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<InstructionLLVM> visitBlocDec(BlocDecImp instr, SymTable h) {
|
||||||
|
|
||||||
|
ArrayList<InstructionLLVM> instrLLVM = new ArrayList<>();
|
||||||
|
for(int i = 0; i<instr.decls().size(); i++){
|
||||||
|
InstrAndSymTable temp = instr.decls().get(i).accept(this, h);
|
||||||
|
h = temp.symTable;
|
||||||
|
instrLLVM.addAll(temp.instrs);
|
||||||
|
}
|
||||||
|
for(int i = 0; i<instr.instrs().size(); i++){
|
||||||
|
instrLLVM.addAll(instr.instrs().get(i).accept(this, h));
|
||||||
|
}
|
||||||
|
|
||||||
|
return instrLLVM;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<InstructionLLVM> visitAssign(AssignImp instr, SymTable h) {
|
public ArrayList<InstructionLLVM> visitAssign(AssignImp instr, SymTable h) {
|
||||||
InstrAndVal res = instr.e().accept(this,h);
|
InstrAndVal res = instr.e().accept(this,h);
|
||||||
@@ -258,6 +261,7 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<InstructionLLVM> visitRead(ReadImp instr, SymTable h) {
|
public ArrayList<InstructionLLVM> visitRead(ReadImp instr, SymTable h) {
|
||||||
ArrayList<InstructionLLVM> l = new ArrayList<>();
|
ArrayList<InstructionLLVM> l = new ArrayList<>();
|
||||||
@@ -291,30 +295,6 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ArrayList<InstructionLLVM> visitVoidFunction(VoidFunctionImp instr, SymTable h) {
|
|
||||||
ArrayList<InstructionLLVM> l = new ArrayList<>();
|
|
||||||
ArrayList<ValLLVM> paramsLLVM = new ArrayList<>();
|
|
||||||
|
|
||||||
for(Expression param: instr.expr()){
|
|
||||||
InstrAndVal result = param.accept(this, h);
|
|
||||||
l.addAll(result.instrs);
|
|
||||||
paramsLLVM.add(result.val);
|
|
||||||
}
|
|
||||||
ValueFunMap fun= h.getFunction(instr.nom());
|
|
||||||
if(fun == null){
|
|
||||||
System.err.println("Function n'est pas trouvé");
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(fun.define.type() instanceof VoidLLVMImp)){
|
|
||||||
System.err.println("Fonction n'est pas un void");
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
|
|
||||||
l.add(new CallVoidLLVMImp(fun.define,paramsLLVM,""));
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<InstructionLLVM> visitIfThen(IfThenImp instr, SymTable h) {
|
public ArrayList<InstructionLLVM> visitIfThen(IfThenImp instr, SymTable h) {
|
||||||
@@ -345,6 +325,7 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<InstructionLLVM> visitIfThenElse(IfThenElseImp instr, SymTable h) {
|
public ArrayList<InstructionLLVM> visitIfThenElse(IfThenElseImp instr, SymTable h) {
|
||||||
ArrayList<InstructionLLVM> l = new ArrayList<>();
|
ArrayList<InstructionLLVM> l = new ArrayList<>();
|
||||||
@@ -379,6 +360,7 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ArrayList<InstructionLLVM> visitWhile(WhileImp instr, SymTable h) {
|
public ArrayList<InstructionLLVM> visitWhile(WhileImp instr, SymTable h) {
|
||||||
ArrayList<InstructionLLVM> l = new ArrayList<>();
|
ArrayList<InstructionLLVM> l = new ArrayList<>();
|
||||||
@@ -412,8 +394,34 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<InstructionLLVM> visitVoidFunction(VoidFunctionImp instr, SymTable h) {
|
||||||
|
ArrayList<InstructionLLVM> l = new ArrayList<>();
|
||||||
|
ArrayList<ValLLVM> paramsLLVM = new ArrayList<>();
|
||||||
|
|
||||||
//EXPRESSION
|
for(Expression param: instr.expr()){
|
||||||
|
InstrAndVal result = param.accept(this, h);
|
||||||
|
l.addAll(result.instrs);
|
||||||
|
paramsLLVM.add(result.val);
|
||||||
|
}
|
||||||
|
ValueFunMap fun= h.getFunction(instr.nom());
|
||||||
|
if(fun == null){
|
||||||
|
System.err.println("Function n'est pas trouvé");
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(fun.define.type() instanceof VoidLLVMImp)){
|
||||||
|
System.err.println("Fonction n'est pas un void");
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
l.add(new CallVoidLLVMImp(fun.define,paramsLLVM,""));
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//EXPRESSION -----------------------------------
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public InstrAndVal visitConst(ConstImp e, SymTable h) {
|
public InstrAndVal visitConst(ConstImp e, SymTable h) {
|
||||||
@@ -465,12 +473,8 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
l.addAll( result.instrs);
|
l.addAll( result.instrs);
|
||||||
paramsLLVM.add(result.val);
|
paramsLLVM.add(result.val);
|
||||||
}
|
}
|
||||||
ValueFunMap fLLVM = h.getFunction(instr.fName()); //on récupère la fonction LLVM dans la table des Symboles
|
ValueFunMap fLLVM = h.getFunction(instr.fName());
|
||||||
//if(fLLVM == null){
|
|
||||||
// System.err.println("[VSL compile error] : la fonction n'existe pas, veuillez vous assurer de l'avoir déclarée avant l'appel");
|
|
||||||
// return new InstrAndVal(l, null);
|
|
||||||
//}
|
|
||||||
|
|
||||||
//Pour c=func(x,y)
|
//Pour c=func(x,y)
|
||||||
if (fLLVM.define.type() instanceof VoidLLVMImp) {
|
if (fLLVM.define.type() instanceof VoidLLVMImp) {
|
||||||
l.add(new CallVoidLLVMImp(fLLVM.define, paramsLLVM, ""));
|
l.add(new CallVoidLLVMImp(fLLVM.define, paramsLLVM, ""));
|
||||||
@@ -485,6 +489,8 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TYPE -----------------------------------
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TypeLLVM visitInt(Type_intImp t, SymTable h) {
|
public TypeLLVM visitInt(Type_intImp t, SymTable h) {
|
||||||
return new IntLLVMImp();
|
return new IntLLVMImp();
|
||||||
|
|||||||
Reference in New Issue
Block a user