diff --git a/src/main/antlr/VSLParser.g b/src/main/antlr/VSLParser.g index 28f9632..d384ac1 100644 --- a/src/main/antlr/VSLParser.g +++ b/src/main/antlr/VSLParser.g @@ -114,13 +114,13 @@ instruction returns [Instruction out]: })* {$out = new ReadImp(read);} | //IF THEN ELSE FIN - IF ex1=expression THEN ins1=instruction + IF ex1=expression THEN ins1=list_instr (FIN {$out= new IfThenImp($ex1.out, $ins1.out);} - | ELSE ins2=instruction FIN + | ELSE ins2=list_instr FIN {$out= new IfThenElseImp($ex1.out, $ins1.out,$ins2.out); } ) - | WHILE exp1=expression DO ins3=instruction DONE + | WHILE exp1=expression DO ins3=list_instr DONE {$out = new WhileImp($exp1.out,$ins3.out);} ; diff --git a/src/main/java/TP2/asd/Interface.java b/src/main/java/TP2/asd/Interface.java index a008a23..9b3f042 100644 --- a/src/main/java/TP2/asd/Interface.java +++ b/src/main/java/TP2/asd/Interface.java @@ -15,7 +15,6 @@ public interface Interface{ public S visitProgram(ProgramImp prog, H h); } - //////////Function public interface Function { public S accept(FunctionVisitor v, H h); @@ -42,10 +41,7 @@ public interface Interface{ public S visitWhile(WhileImp instr, H h); } - //////////Expression - //We put prettyprinter here beause each expr will have to implement it like accept visitor - //but each implement will be different for prettyprinter public interface Expression { public S accept(ExprVisitor v, H h); } diff --git a/src/main/java/TP2/asd/PrettyprinterVisitor.java b/src/main/java/TP2/asd/PrettyprinterVisitor.java index 99e93af..a59a3d2 100644 --- a/src/main/java/TP2/asd/PrettyprinterVisitor.java +++ b/src/main/java/TP2/asd/PrettyprinterVisitor.java @@ -78,7 +78,10 @@ public class PrettyprinterVisitor implements ProgramVisitor, public String visitIfThen(IfThenImp instr, String indent) { String str = indent + "IF "; str +=(instr.e().accept(this, "")); - str +=" THEN " + (instr.i1().accept(this, "")); + str +=" THEN "; + for(int i=0; i, public String visitIfThenElse(IfThenElseImp instr, String indent) { String str = indent + "IF "; str +=(instr.e().accept(this, "")); - str +=" THEN " + (instr.i1().accept(this, "")); - str +=" ELSE "+ (instr.i2().accept(this, "")); + str +=" THEN "; + for(int i=0; i, public String visitWhile(WhileImp instr, String indent) { String str = indent+"WHILE "; str += (instr.e().accept(this, "")); - str+= " DO "+ (instr.i1().accept(this, "")); + str+= " DO "; + for(int i=0; i i1) implements Instruction { @Override public S accept(InstrVisitor v, H h) { return v.visitIfThen(this, h); } } - public static record IfThenElseImp(Expression e, Instruction i1, Instruction i2) implements Instruction { + public static record IfThenElseImp(Expression e, ArrayList i1, ArrayList i2) implements Instruction { @Override public S accept(InstrVisitor v, H h) { return v.visitIfThenElse(this, h); } } - public static record WhileImp(Expression e, Instruction i1) implements Instruction { + public static record WhileImp(Expression e, ArrayList i1) implements Instruction { @Override public S accept(InstrVisitor v, H h) { return v.visitWhile(this, h); diff --git a/src/main/java/TP2/asd/toLLVM_Visitor.java b/src/main/java/TP2/asd/toLLVM_Visitor.java index 29f5bd7..3feae62 100644 --- a/src/main/java/TP2/asd/toLLVM_Visitor.java +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -85,10 +85,7 @@ public class toLLVM_Visitor implements ProgramVisitor ArrayList list = new ArrayList<>(); for(int i = 0; i throw new UnsupportedOperationException("Unimplemented method 'visitIfThenElse'"); } - @Override public ArrayList visitWhile(WhileImp instr, SymTable h) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'visitWhile'"); + ArrayList l = new ArrayList<>(); + return l; } //EXPRESSION @@ -137,7 +133,7 @@ public class toLLVM_Visitor implements ProgramVisitor @Override public InstrAndVal visitVar(VarImp e, SymTable h) { - ValLLVM val = new VarLLVMImpl(new IntLLVMImpl(), h.getVar(e.name())); + ValLLVM val = new VarLLVMImpl(new IntLLVMImpl(), e.name()); return new InstrAndVal(new ArrayList<>(), val); } diff --git a/src/main/java/TP2/llvm/Interface.java b/src/main/java/TP2/llvm/Interface.java index 2f24fcb..2238fdc 100644 --- a/src/main/java/TP2/llvm/Interface.java +++ b/src/main/java/TP2/llvm/Interface.java @@ -1,4 +1,5 @@ package TP2.llvm; +import TP2.asd.Program.IfThenElseImp; import TP2.llvm.ProgramLLVM.*; public interface Interface { @@ -31,6 +32,9 @@ public interface Interface { public S visitStoreLLVM(StoreLLVMImpl instr, H h); public S visitPrintLLVM(PrintLLVMImpl instr, H h); public S visitReadLLVM(ReadLLVMImpl instr, H h); + public S visitIfThenElseLLVM(IfThenElseImp instr, H h); + public S visitIfThenLLVM(IfThenImp instr, H h); + public S visitWhileLLVM(WhileImp instr, H h); } //////////ExpressionLLVM (expression) diff --git a/src/main/java/TP2/llvm/ProgramLLVM.java b/src/main/java/TP2/llvm/ProgramLLVM.java index efad482..947e14b 100644 --- a/src/main/java/TP2/llvm/ProgramLLVM.java +++ b/src/main/java/TP2/llvm/ProgramLLVM.java @@ -74,9 +74,35 @@ public class ProgramLLVM { public S accept(InstructionLLVMVisitor v, H h) { return v.visitReadLLVM(this, h); } - } + public static record IfThenLLVMImp() implements InstructionLLVM{ + @Override + public S accept(InstructionLLVMVisitor v, H h) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'accept'"); + } + + } + + public static record IfThenElseLLVMImp() implements InstructionLLVM{ + + @Override + public S accept(InstructionLLVMVisitor v, H h) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'accept'"); + } + } + + public static record WhileLLVMImp() implements InstructionLLVM{ + + @Override + public S accept(InstructionLLVMVisitor v, H h) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'accept'"); + } + } + //Expression : public static record BinOpLLVMImpl(TypeLLVM type,Op op, ValLLVM val1,ValLLVM val2) implements ExpressionLLVM{ @Override diff --git a/tests/aLaMain.vsl b/tests/aLaMain.vsl index 2d883f3..8f67134 100644 --- a/tests/aLaMain.vsl +++ b/tests/aLaMain.vsl @@ -3,5 +3,9 @@ FUNC INT main() { b:=3 c:=1 PRINT "coucou, tu peux réparer le visitPrint dans LLVM stp","il manque virgule au milieu", c*5+b - READ a, b, n, t, m + IF 1 THEN a:=a+1 FI + IF 2 THEN b:=c+1 ELSE + b:=c+1 + READ n, t,m + FI RETURN 4 + 6 * 5 + 2 } \ No newline at end of file