while imp en cours, todo : if else then
This commit is contained in:
@@ -81,9 +81,9 @@ instruction returns [Instruction out]:
|
|||||||
$out =new Return_instrImp($e.out);}
|
$out =new Return_instrImp($e.out);}
|
||||||
| //BLOC
|
| //BLOC
|
||||||
BacO
|
BacO
|
||||||
(dec=list_decls ins2=list_instr
|
(dec=list_decls instr2=list_instr
|
||||||
{
|
{
|
||||||
$out=new BlocDecImp($dec.out,$ins2.out);
|
$out=new BlocDecImp($dec.out,$instr2.out);
|
||||||
}
|
}
|
||||||
| instr3=list_instr
|
| instr3=list_instr
|
||||||
{ $out= new BlocImp($instr3.out);
|
{ $out= new BlocImp($instr3.out);
|
||||||
@@ -128,13 +128,13 @@ instruction returns [Instruction out]:
|
|||||||
})*
|
})*
|
||||||
{$out = new ReadImp(read);}
|
{$out = new ReadImp(read);}
|
||||||
| //IF THEN ELSE FIN
|
| //IF THEN ELSE FIN
|
||||||
IF ex1=expression THEN ins1=list_instr
|
IF ex1=expression THEN ins1=instruction
|
||||||
(FIN
|
(FIN
|
||||||
{$out= new IfThenImp($ex1.out, $ins1.out);}
|
{$out= new IfThenImp($ex1.out, $ins1.out);}
|
||||||
| ELSE ins2=list_instr FIN
|
| ELSE ins2=instruction FIN
|
||||||
{$out= new IfThenElseImp($ex1.out, $ins1.out,$ins2.out); }
|
{$out= new IfThenElseImp($ex1.out, $ins1.out,$ins2.out); }
|
||||||
)
|
)
|
||||||
| WHILE exp1=expression DO ins3=list_instr DONE
|
| WHILE exp1=expression DO ins3=instruction DONE
|
||||||
{$out = new WhileImp($exp1.out,$ins3.out);}
|
{$out = new WhileImp($exp1.out,$ins3.out);}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|||||||
@@ -103,9 +103,7 @@ public class PrettyprinterVisitor implements ProgramVisitor<String,String>,
|
|||||||
String str = indent + "IF ";
|
String str = indent + "IF ";
|
||||||
str +=(instr.e().accept(this, ""));
|
str +=(instr.e().accept(this, ""));
|
||||||
str +=" THEN ";
|
str +=" THEN ";
|
||||||
for(int i=0; i<instr.i1().size();i++){
|
str+= instr.i1().accept(this, "");
|
||||||
str+= instr.i1().get(i).accept(this, "");
|
|
||||||
}
|
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,13 +112,9 @@ public class PrettyprinterVisitor implements ProgramVisitor<String,String>,
|
|||||||
String str = indent + "IF ";
|
String str = indent + "IF ";
|
||||||
str +=(instr.e().accept(this, ""));
|
str +=(instr.e().accept(this, ""));
|
||||||
str +=" THEN ";
|
str +=" THEN ";
|
||||||
for(int i=0; i<instr.i1().size();i++){
|
str+= instr.i1().accept(this, "");
|
||||||
str+= instr.i1().get(i).accept(this, "");
|
|
||||||
}
|
|
||||||
str +=" ELSE ";
|
str +=" ELSE ";
|
||||||
for(int i=0; i<instr.i2().size();i++){
|
str+= instr.i2().accept(this, "");
|
||||||
str+= instr.i2().get(i).accept(this, "");
|
|
||||||
}
|
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,9 +133,7 @@ public class PrettyprinterVisitor implements ProgramVisitor<String,String>,
|
|||||||
String str = indent+"WHILE ";
|
String str = indent+"WHILE ";
|
||||||
str += (instr.e().accept(this, ""));
|
str += (instr.e().accept(this, ""));
|
||||||
str+= " DO ";
|
str+= " DO ";
|
||||||
for(int i=0; i<instr.i1().size();i++){
|
str+= instr.i1().accept(this, "");
|
||||||
str+= instr.i1().get(i).accept(this, "");
|
|
||||||
}
|
|
||||||
str+= " DONE";
|
str+= " DONE";
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,21 +102,21 @@ public class Program{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static record IfThenImp(Expression e, ArrayList<Instruction> i1) implements Instruction {
|
public static record IfThenImp(Expression e, Instruction i1) implements Instruction {
|
||||||
@Override
|
@Override
|
||||||
public <H, S> S accept(InstrVisitor<H, S> v, H h) {
|
public <H, S> S accept(InstrVisitor<H, S> v, H h) {
|
||||||
return v.visitIfThen(this, h);
|
return v.visitIfThen(this, h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static record IfThenElseImp(Expression e, ArrayList<Instruction> i1, ArrayList<Instruction> i2) implements Instruction {
|
public static record IfThenElseImp(Expression e, Instruction i1, Instruction i2) implements Instruction {
|
||||||
@Override
|
@Override
|
||||||
public <H, S> S accept(InstrVisitor<H, S> v, H h) {
|
public <H, S> S accept(InstrVisitor<H, S> v, H h) {
|
||||||
return v.visitIfThenElse(this, h);
|
return v.visitIfThenElse(this, h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static record WhileImp(Expression e, ArrayList<Instruction> i1) implements Instruction {
|
public static record WhileImp(Expression e, Instruction i1) implements Instruction {
|
||||||
@Override
|
@Override
|
||||||
public <H, S> S accept(InstrVisitor<H, S> v, H h) {
|
public <H, S> S accept(InstrVisitor<H, S> v, H h) {
|
||||||
return v.visitWhile(this, h);
|
return v.visitWhile(this, h);
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ public class SymTable {
|
|||||||
|
|
||||||
private PStack<PMap<String,ValueTable>> stackMap;
|
private PStack<PMap<String,ValueTable>> stackMap;
|
||||||
private int id=1;
|
private int id=1;
|
||||||
|
public int idLabel = 1;
|
||||||
public SymTable(){
|
public SymTable(){
|
||||||
this.stackMap= ConsPStack.empty();
|
this.stackMap= ConsPStack.empty();
|
||||||
}
|
}
|
||||||
@@ -41,6 +42,12 @@ public class SymTable {
|
|||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getNewIdLabel(){
|
||||||
|
int a = this.idLabel;
|
||||||
|
this.id++;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
public Result addNewTempVar(/*Type type*/){
|
public Result addNewTempVar(/*Type type*/){
|
||||||
//TODO
|
//TODO
|
||||||
String newVar = "temp"+id;
|
String newVar = "temp"+id;
|
||||||
|
|||||||
@@ -156,6 +156,22 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImpl>
|
|||||||
@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<>();
|
||||||
|
|
||||||
|
String labelWhile = "while"+h.getNewIdLabel();
|
||||||
|
String labelDo = "do"+h.getNewIdLabel();
|
||||||
|
String labelDone = "done"+h.getNewIdLabel();
|
||||||
|
|
||||||
|
l.add(new LabelLLVMImp(labelWhile));
|
||||||
|
InstrAndVal temp = instr.e().accept(this,h); //retourne les instruction pour optenir le résultat ainsi que la variable contenant le résultat final
|
||||||
|
l.addAll(temp.instrs);
|
||||||
|
ValLLVM val = temp.val; //temp6
|
||||||
|
//TODO : icmp et br
|
||||||
|
|
||||||
|
l.add(new LabelLLVMImp(labelDo));
|
||||||
|
l.addAll(instr.i1().accept(this,h));
|
||||||
|
//TODO br vers label while
|
||||||
|
l.add(new LabelLLVMImp(labelDone));
|
||||||
|
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ public interface Interface {
|
|||||||
public S visitIfThenElseLLVM(IfThenElseLLVMImp instr, H h);
|
public S visitIfThenElseLLVM(IfThenElseLLVMImp instr, H h);
|
||||||
public S visitIfThenLLVM(IfThenLLVMImp instr, H h);
|
public S visitIfThenLLVM(IfThenLLVMImp instr, H h);
|
||||||
public S visitWhileLLVM(WhileLLVMImp instr, H h);
|
public S visitWhileLLVM(WhileLLVMImp instr, H h);
|
||||||
|
public S visitLabelLLVM(LabelLLVMImp instr, H h);
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////ExpressionLLVM (expression)
|
//////////ExpressionLLVM (expression)
|
||||||
|
|||||||
@@ -30,14 +30,18 @@ public class ProgramLLVM {
|
|||||||
|
|
||||||
|
|
||||||
//Instructon :
|
//Instructon :
|
||||||
/*
|
|
||||||
public static record LabelLLVMImpl(String nom) implements InstructionLLVM{
|
public static record LabelLLVMImp(String nom) implements InstructionLLVM{
|
||||||
public String prettyprinter(){
|
public String prettyprinter(){
|
||||||
StringBuilder str = new StringBuilder();
|
StringBuilder str = new StringBuilder();
|
||||||
return str.toString();
|
return str.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <H, S> S accept(InstructionLLVMVisitor<H, S> v, H h) {
|
||||||
|
return v.visitLabelLLVM(this, h);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
public static record AssignLVMImpl(VarLLVMImpl var, ExpressionLLVM e) implements InstructionLLVM{
|
public static record AssignLVMImpl(VarLLVMImpl var, ExpressionLLVM e) implements InstructionLLVM{
|
||||||
@@ -76,30 +80,27 @@ public class ProgramLLVM {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static record IfThenLLVMImp() implements InstructionLLVM{
|
public static record IfThenLLVMImp(ExpressionLLVM cond, InstructionLLVM instr) implements InstructionLLVM{
|
||||||
@Override
|
@Override
|
||||||
public <H, S> S accept(InstructionLLVMVisitor<H, S> v, H h) {
|
public <H, S> S accept(InstructionLLVMVisitor<H, S> v, H h) {
|
||||||
// TODO Auto-generated method stub
|
return v.visitIfThenLLVM(this, h);
|
||||||
throw new UnsupportedOperationException("Unimplemented method 'accept'");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static record IfThenElseLLVMImp() implements InstructionLLVM{
|
public static record IfThenElseLLVMImp(ExpressionLLVM cond, InstructionLLVM intr1, InstructionLLVM instr2) implements InstructionLLVM{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <H, S> S accept(InstructionLLVMVisitor<H, S> v, H h) {
|
public <H, S> S accept(InstructionLLVMVisitor<H, S> v, H h) {
|
||||||
// TODO Auto-generated method stub
|
return v.visitIfThenElseLLVM(this, h);
|
||||||
throw new UnsupportedOperationException("Unimplemented method 'accept'");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static record WhileLLVMImp() implements InstructionLLVM{
|
public static record WhileLLVMImp(ExpressionLLVM cond, InstructionLLVM instr) implements InstructionLLVM{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public <H, S> S accept(InstructionLLVMVisitor<H, S> v, H h) {
|
public <H, S> S accept(InstructionLLVMVisitor<H, S> v, H h) {
|
||||||
// TODO Auto-generated method stub
|
return v.visitWhileLLVM(this, h);
|
||||||
throw new UnsupportedOperationException("Unimplemented method 'accept'");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ FUNC INT main() {
|
|||||||
b:=3
|
b:=3
|
||||||
c:=1
|
c:=1
|
||||||
PRINT "coucou, tu peux réparer le visitPrint dans LLVM stp","il manque virgule au milieu", c*5+b
|
PRINT "coucou, tu peux réparer le visitPrint dans LLVM stp","il manque virgule au milieu", c*5+b
|
||||||
b:=c+1
|
IF 1 THEN a:=a+1 FI
|
||||||
READ a, b, c, d
|
IF 2 THEN b:=c+1 ELSE
|
||||||
|
b:=c+1
|
||||||
|
FI
|
||||||
RETURN 4 + 6 * 5 + 2 }
|
RETURN 4 + 6 * 5 + 2 }
|
||||||
Reference in New Issue
Block a user