correction bug addLLVM avec des val

This commit is contained in:
Rochas
2025-04-05 10:48:27 +02:00
parent 7dfb07d59f
commit 56df584b9f
6 changed files with 48 additions and 21 deletions

5
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,5 @@
{
"files.watcherExclude": {
"**/target": true
}
}

View File

@@ -47,7 +47,7 @@ public class Main {
// Pretty-print the program (to debug parsing) // Pretty-print the program (to debug parsing)
System.err.println("todo " + ast); System.err.println("todo " + ast);
System.out.println("\n\n PRETTYPRINTER VSK : \n--------------\n" + ast.prettyprinter() + "\n--------------\nFIN PRETTYPRINTER"); System.out.println("\n\n PRETTYPRINTER VSL : \n--------------\n" + ast.prettyprinter() + "\n--------------\nFIN PRETTYPRINTER");
// Verify the program semantic // Verify the program semantic

View File

@@ -51,6 +51,10 @@ public interface Interface{
public ArrayList<AssignLVMImp> toLLVM(); public ArrayList<AssignLVMImp> toLLVM();
} }
public interface Val extends Expression{
public ValLLVM getValLLVM();
}
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 visitBinOp(BinopExpressionImp e, H h);

View File

@@ -67,7 +67,7 @@ public class Program{
} }
public static record ConstImp(int c) implements Expression{ public static record ConstImp(int c) implements Val{
public <H, S> S accept(ExprVisitor<H, S> v, H h) { public <H, S> S accept(ExprVisitor<H, S> v, H h) {
return v.visitConst(this, h); return v.visitConst(this, h);
} }
@@ -76,12 +76,17 @@ public class Program{
return c+""; return c+"";
} }
public ValLLVM getValLLVM(){
ValLLVM val = new ValLLVMImpl(new IntLLVMImpl(),c);
return val;
}
@Override @Override
public ArrayList<AssignLVMImp> toLLVM() { //TODO public ArrayList<AssignLVMImp> toLLVM() { //TODO
// TODO Auto-generated method stub // TODO Auto-generated method stub
ArrayList<AssignLVMImp> list = new ArrayList<>(); ArrayList<AssignLVMImp> list = new ArrayList<>();
ConstLLVMImp cLLVM = new ConstLLVMImp(new IntLLVMImpl(),c); ValLLVM cLLVM = new ValLLVMImpl(new IntLLVMImpl(),c);
list.add(new AssignLVMImp(new VarLLVMImpl("todo"), cLLVM)); list.add(new AssignLVMImp(new VarLLVMImpl(new IntLLVMImpl(),"todo"), cLLVM));
return list; return list;
} }
} }
@@ -108,13 +113,26 @@ public class Program{
@Override @Override
public ArrayList<AssignLVMImp> toLLVM() { //TODO si e1 ou e2 est une constante, elle doit pouvoir être mise directement dans l'expression public ArrayList<AssignLVMImp> toLLVM() { //TODO si e1 ou e2 est une constante, elle doit pouvoir être mise directement dans l'expression
ArrayList<AssignLVMImp> list = new ArrayList<>(); ArrayList<AssignLVMImp> list = new ArrayList<>();
ValLLVM val1 = null;
ValLLVM val2 = null;
if(e1 instanceof Val){
val1 = ((Val) e1).getValLLVM();
}
else {
ArrayList<AssignLVMImp> eLLVM1 = e1.toLLVM(); ArrayList<AssignLVMImp> eLLVM1 = e1.toLLVM();
ArrayList<AssignLVMImp> eLLVM2 = e2.toLLVM();
list.addAll(eLLVM1); list.addAll(eLLVM1);
val1 = eLLVM1.getLast().getVar();
}
if(e2 instanceof Val){
val2 = ((Val) e2).getValLLVM();
}
else {
ArrayList<AssignLVMImp> eLLVM2 = e2.toLLVM();
list.addAll(eLLVM2); list.addAll(eLLVM2);
VarLLVMImpl var1 = eLLVM1.getLast().getVar(); val2 = eLLVM2.getLast().getVar();
VarLLVMImpl var2 = eLLVM2.getLast().getVar(); }
list.add(new AssignLVMImp(new VarLLVMImpl("todo"), new BinOpLLVMImp(new IntLLVMImpl(),op,var1,var2)));
list.add(new AssignLVMImp(new VarLLVMImpl(new IntLLVMImpl()/*TODO*/,"todo"), new BinOpLLVMImp(new IntLLVMImpl()/*TODO*/,op,val1,val2)));
return list; return list;
} }
@@ -134,7 +152,7 @@ public class Program{
@Override @Override
public ArrayList<InstructionLLVM> toLLVM() { public ArrayList<InstructionLLVM> toLLVM() {
ArrayList<AssignLVMImp> list = e.toLLVM(); ArrayList<AssignLVMImp> list = e.toLLVM();
InstructionLLVM r = new ReturnLLVMImp(new IntLLVMImpl(),list.getLast().getVar()); InstructionLLVM r = new ReturnLLVMImp(new IntLLVMImpl()/*TODO*/,list.getLast().getVar());
ArrayList<InstructionLLVM> result = new ArrayList<>(); ArrayList<InstructionLLVM> result = new ArrayList<>();
result.addAll(list); result.addAll(list);
result.add(r); result.add(r);
@@ -158,7 +176,7 @@ public class Program{
@Override @Override
public ArrayList<InstructionLLVM> toLLVM() { public ArrayList<InstructionLLVM> toLLVM() {
ArrayList<AssignLVMImp> list = e.toLLVM(); ArrayList<AssignLVMImp> list = e.toLLVM();
InstructionLLVM r = new AssignLVMImp(new VarLLVMImpl(t),list.getLast().getVar()); InstructionLLVM r = new AssignLVMImp(new VarLLVMImpl(new IntLLVMImpl()/*TODO*/,t),list.getLast().getVar());
ArrayList<InstructionLLVM> result = new ArrayList<>(); ArrayList<InstructionLLVM> result = new ArrayList<>();
result.addAll(list); result.addAll(list);
result.add(r); result.add(r);

View File

@@ -43,11 +43,11 @@ public interface Interface {
} }
public interface ExpressionLLVMVisitor<H,S> { public interface ExpressionLLVMVisitor<H,S> {
public S visitConstLLVM(ConstLLVMImp e,H h); public S visitConstLLVM(ValLLVM e,H h);
public S visitBinOpLLVM(BinOpLLVMImp e, H h); public S visitBinOpLLVM(BinOpLLVMImp e, H h);
} }
public interface Val extends ExpressionLLVM{ public interface ValLLVM extends ExpressionLLVM{
public String prettyprinter(); public String prettyprinter();
} }

View File

@@ -115,7 +115,7 @@ public class ProgramLLVM {
} }
//Expression : //Expression :
public static record BinOpLLVMImp(TypeLLVM type,Op op, Val val1,Val val2) implements ExpressionLLVM{ public static record BinOpLLVMImp(TypeLLVM type,Op op, ValLLVM val1,ValLLVM val2) implements ExpressionLLVM{
public <H, S> S accept(ExpressionLLVMVisitor<H, S> v, H h) { public <H, S> S accept(ExpressionLLVMVisitor<H, S> v, H h) {
return v.visitBinOpLLVM(this, h); return v.visitBinOpLLVM(this, h);
} }
@@ -140,7 +140,7 @@ public class ProgramLLVM {
} }
public static record ConstLLVMImp(TypeLLVM type, int val) implements ExpressionLLVM{ /*public static record ConstLLVMImp(TypeLLVM type, int val) implements ExpressionLLVM{
public <H, S> S accept(ExpressionLLVMVisitor<H, S> v, H h) { public <H, S> S accept(ExpressionLLVMVisitor<H, S> v, H h) {
return v.visitConstLLVM(this, h); return v.visitConstLLVM(this, h);
} }
@@ -150,7 +150,7 @@ public class ProgramLLVM {
return val+""; return val+"";
} }
} }*/
public static record allocaLLVMImpl(TypeLLVM type, int nbBits) implements ExpressionLLVM{ public static record allocaLLVMImpl(TypeLLVM type, int nbBits) implements ExpressionLLVM{
@@ -160,7 +160,7 @@ public class ProgramLLVM {
} }
public static record loadLLVMImpl(TypeLLVM type, int nbBits,int nbBits2, Val val) implements ExpressionLLVM{ public static record loadLLVMImpl(TypeLLVM type, int nbBits,int nbBits2, ValLLVM val) implements ExpressionLLVM{
public String prettyprinter(){ public String prettyprinter(){
return "load" + " i" + nbBits + ", i"+ nbBits2 + "* %" + val.prettyprinter(); return "load" + " i" + nbBits + ", i"+ nbBits2 + "* %" + val.prettyprinter();
} }
@@ -169,14 +169,14 @@ public class ProgramLLVM {
//Val //Val
public static record ValLLVMImpl(int val) implements Val{ public static record ValLLVMImpl(TypeLLVM type, int val) implements ValLLVM{
public String prettyprinter(){ public String prettyprinter(){
return val + ""; return val + "";
} }
} }
public static record VarLLVMImpl(String nom) implements Val{ public static record VarLLVMImpl(TypeLLVM type, String nom) implements ValLLVM{
public String prettyprinter(){ public String prettyprinter(){
return "%"+nom; return "%"+nom;
} }