diff --git a/src/main/antlr/VSLParser.g b/src/main/antlr/VSLParser.g index 28f9632..18384b6 100644 --- a/src/main/antlr/VSLParser.g +++ b/src/main/antlr/VSLParser.g @@ -39,11 +39,11 @@ functions returns [ArrayList out] function returns [Function out]: FUNCTION t=type i=ident ParO ParF - ( - BacO instrs=list_instr BacF + BacO + (instrs=list_instr { $out=new FunctionImp($t.return_type, $i.out, $instrs.out); - } + } BacF | instr= instruction { $out=new FunctionImp($t.return_type, $i.out, $instr.out); @@ -51,6 +51,18 @@ function returns [Function out]: ) ; +declaration returns [Declaration out]: + (t=type i=ident + { + ArrayList declare= new ArrayList(); + declare.add($i.out); + }(VIRGULE i2=ident + { + declare.add($i2.out); + })* + {$out = new DeclarationImp($t.return_type, declare);})+ + ; + list_instr returns [ArrayList out] @init{ $out = new ArrayList<>(); @@ -65,21 +77,21 @@ instruction returns [Instruction out]: RETURN e=expression { $out =new Return_instrImp($e.out);} + | //BLOC + BacO + (dec=declaration instr4=list_instr + { + $out=new BlocDec($dec.out,$insts4.out); + } + | instr3=list_instr + { $out= new Bloc($instr3.out); + } + ) BacF | //ASSIGN i=ident ASSIGN e=expression { $out = new AssignImp($i.out, $e.out); } - | //DECLARATION - t=type i=ident - { - ArrayList declare= new ArrayList(); - declare.add($i.out); - }(VIRGULE i2=ident - { - declare.add($i2.out); - })* - {$out = new DeclarationImp($t.return_type, declare);} | // PRINT PRINT {ArrayList printer= new ArrayList();} @@ -114,13 +126,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 35af4d0..56a2da8 100644 --- a/src/main/java/TP2/asd/Interface.java +++ b/src/main/java/TP2/asd/Interface.java @@ -44,6 +44,8 @@ public interface Interface{ public interface InstrVisitor{ public S visitReturn(Return_instrImp instr, H h); + public S visitBloc(BlocImp instr, H h); + public S visitBlocDec (BlocDecImp instr, H h); public S visitAssign(AssignImp instr, H h); public S visitPrint(PrintImp instr, H h); public S visitRead(ReadImp instr,H h); @@ -52,10 +54,8 @@ 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 d227de3..06ef556 100644 --- a/src/main/java/TP2/asd/PrettyprinterVisitor.java +++ b/src/main/java/TP2/asd/PrettyprinterVisitor.java @@ -29,12 +29,9 @@ public class PrettyprinterVisitor implements ProgramVisitor, @Override public String visitFunction(FunctionImp fun, String indent) { - String str = indent+"FUNC " + fun.type().accept(this,"")+ " " + fun.nom() +"(){\n"; - for(int i = 0; i, return indent+"RETURN " + instr.e().accept(this,""); } + @Override + public String visitBloc(BlocImp instr, String indent) { + String str = "{"; + for(int i = 0; i, 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 instructions)implements Function { - public FunctionImp(Type type, String name, Instruction instruction) { - this(type, name, new ArrayList<>() {{ add(instruction); }}); - } + public static record FunctionImp(Type type, String nom, Instruction instruction)implements Function { + //public FunctionImp(Type type, String name, Instruction instruction) { + // this(type, name, new ArrayList<>() {{ add(instruction); }}); C KOI ? + //} public S accept(FunctionVisitor v, H h) { return v.visitFunction(this, h); @@ -69,7 +69,19 @@ public class Program{ return v.visitReturn(this,h); } } - + + public static record BlocDecImp(ArrayList decls, ArrayList instrs) implements Instruction{ + public S accept(InstrVisitor v, H h) { + return v.visitBlocDec(this, h); + } + } + + public static record BlocImp(ArrayList instrs) implements Instruction{ + public S accept(InstrVisitor v, H h) { + return v.visitBloc(this, h); + } + } + public static record AssignImp(String t, Expression e) implements Instruction{ public S accept(InstrVisitor v, H h) { return v.visitAssign(this, h); @@ -90,21 +102,21 @@ public class Program{ } } - public static record IfThenImp(Expression e, Instruction i1) implements Instruction { + public static record IfThenImp(Expression e, ArrayList 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 08db214..23a9015 100644 --- a/src/main/java/TP2/asd/toLLVM_Visitor.java +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -93,6 +93,18 @@ public class toLLVM_Visitor implements ProgramVisitor return result; } + @Override + public ArrayList visitBloc(BlocImp instr, SymTable h) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'visitBloc'"); + } + + @Override + public ArrayList visitBlocDec(BlocDecImp instr, SymTable h) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'visitBlocDec'"); + } + @Override public ArrayList visitAssign(AssignImp instr, SymTable h) { InstrAndVal res = instr.e().accept(this,h); @@ -132,11 +144,10 @@ public class toLLVM_Visitor implements ProgramVisitor 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 @@ -149,7 +160,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 08ecbb3..2056bce 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 + IF 1 THEN a:=a+1 FI + IF 2 THEN b:=c+1 ELSE + b:=c+1 READ a, b, c, d + FI RETURN 4 + 6 * 5 + 2 } \ No newline at end of file