diff --git a/src/main/antlr/VSLParser.g b/src/main/antlr/VSLParser.g index 5e90b86..28f9632 100644 --- a/src/main/antlr/VSLParser.g +++ b/src/main/antlr/VSLParser.g @@ -113,7 +113,15 @@ instruction returns [Instruction out]: read.add(new VarImp($i2.out)); })* {$out = new ReadImp(read);} - + | //IF THEN ELSE FIN + IF ex1=expression THEN ins1=instruction + (FIN + {$out= new IfThenImp($ex1.out, $ins1.out);} + | ELSE ins2=instruction FIN + {$out= new IfThenElseImp($ex1.out, $ins1.out,$ins2.out); } + ) + | WHILE exp1=expression DO ins3=instruction DONE + {$out = new WhileImp($exp1.out,$ins3.out);} ; //Priorité lit(val, const ou paranthese) -> td_exp (*/%) -> exp (+-) diff --git a/src/main/java/TP2/Error/TypeChecking.java b/src/main/java/TP2/Error/TypeChecking.java index 49d91ea..a70f201 100644 --- a/src/main/java/TP2/Error/TypeChecking.java +++ b/src/main/java/TP2/Error/TypeChecking.java @@ -1,8 +1,34 @@ package TP2.Error; import TP2.asd.SymTable; +import TP2.asd.Interface.ExprVisitor; +import TP2.asd.Program.BinopExpressionImp; +import TP2.asd.Program.ConstImp; +import TP2.asd.Program.VarImp; public class TypeChecking { private SymTable st; - + + /* + public class TypeCheckExpr implements ExprVisitor{ + + @Override + public TypeCheckExprDiag visitConst(ConstImp e, SymTable h) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'visitConst'"); + } + + @Override + public TypeCheckExprDiag visitVar(VarImp e, SymTable h) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'visitVar'"); + } + + @Override + public TypeCheckExprDiag visitBinOp(BinopExpressionImp e, SymTable h) { + TypeCheckExprDiag tce1 = e.e1().accept(this, h) ; + TypeCheckExprDiag tce2 = e.e2().accept(this, h) ; + } + } + */ } diff --git a/src/main/java/TP2/asd/Interface.java b/src/main/java/TP2/asd/Interface.java index 2a61d9c..a008a23 100644 --- a/src/main/java/TP2/asd/Interface.java +++ b/src/main/java/TP2/asd/Interface.java @@ -37,6 +37,9 @@ public interface Interface{ public S visitDeclaration(DeclarationImp instr,H h); public S visitPrint(PrintImp instr, H h); public S visitRead(ReadImp instr,H h); + public S visitIfThen(IfThenImp instr, H h); + public S visitIfThenElse(IfThenElseImp instr, H h); + public S visitWhile(WhileImp instr, H h); } diff --git a/src/main/java/TP2/asd/PrettyprinterVisitor.java b/src/main/java/TP2/asd/PrettyprinterVisitor.java index 0effc34..99e93af 100644 --- a/src/main/java/TP2/asd/PrettyprinterVisitor.java +++ b/src/main/java/TP2/asd/PrettyprinterVisitor.java @@ -74,6 +74,23 @@ public class PrettyprinterVisitor implements ProgramVisitor, return str; } + @Override + public String visitIfThen(IfThenImp instr, String indent) { + String str = indent + "IF "; + str +=(instr.e().accept(this, "")); + str +=" THEN " + (instr.i1().accept(this, "")); + return str; + } + + @Override + 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, "")); + return str; + } + @Override public String visitRead(ReadImp instr, String indent) { String str = indent+"READ "; @@ -84,6 +101,15 @@ public class PrettyprinterVisitor implements ProgramVisitor, return str; } + @Override + public String visitWhile(WhileImp instr, String indent) { + String str = indent+"WHILE "; + str += (instr.e().accept(this, "")); + str+= " DO "+ (instr.i1().accept(this, "")); + str+= " DONE"; + return str; + } + //EXPRESSION @Override diff --git a/src/main/java/TP2/asd/Program.java b/src/main/java/TP2/asd/Program.java index 6d83760..f13847d 100644 --- a/src/main/java/TP2/asd/Program.java +++ b/src/main/java/TP2/asd/Program.java @@ -88,6 +88,27 @@ public class Program{ } } + public static record IfThenImp(Expression e, Instruction 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 { + @Override + public S accept(InstrVisitor v, H h) { + return v.visitIfThenElse(this, h); + } + } + + public static record WhileImp(Expression e, Instruction i1) implements Instruction { + @Override + public S accept(InstrVisitor v, H h) { + return v.visitWhile(this, h); + } + } + //Type public static record Type_voidImp() implements Type{ @Override @@ -103,4 +124,5 @@ public class Program{ return v.visitInt(this, h); } } + } diff --git a/src/main/java/TP2/asd/toLLVM_Visitor.java b/src/main/java/TP2/asd/toLLVM_Visitor.java index f316c51..ec8bb52 100644 --- a/src/main/java/TP2/asd/toLLVM_Visitor.java +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -105,6 +105,25 @@ public class toLLVM_Visitor implements ProgramVisitor return l; } + @Override + public ArrayList visitIfThen(IfThenImp instr, SymTable h) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'visitIfThen'"); + } + + @Override + public ArrayList visitIfThenElse(IfThenElseImp instr, SymTable h) { + // TODO Auto-generated method stub + 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'"); + } + //EXPRESSION @Override