From bd56995d630fc2482383d7fb4e1e91ac7203eeda Mon Sep 17 00:00:00 2001 From: Rochas Date: Tue, 29 Apr 2025 00:50:56 +0200 Subject: [PATCH] print et read fini ! --- src/main/java/TP2/Main.java | 14 +++++ src/main/java/TP2/asd/Program.java | 3 +- src/main/java/TP2/asd/SymTable.java | 2 +- src/main/java/TP2/asd/toLLVM_Visitor.java | 56 ++++++++++++++----- src/main/java/TP2/llvm/Interface.java | 2 +- .../TP2/llvm/PrettyprinterLLVM_Visitor.java | 8 +-- src/main/java/TP2/llvm/ProgramLLVM.java | 6 +- tests/aLaMain.vsl | 3 +- 8 files changed, 70 insertions(+), 24 deletions(-) diff --git a/src/main/java/TP2/Main.java b/src/main/java/TP2/Main.java index 9839e76..aa4c9f2 100644 --- a/src/main/java/TP2/Main.java +++ b/src/main/java/TP2/Main.java @@ -9,6 +9,8 @@ import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.RecognitionException; import org.antlr.runtime.Token; +import .antlr.VSLLexer; +import .antlr.VSLParser; import TP2.asd.Program.*; import TP2.llvm.ProgramLLVM; import TP2.llvm.ProgramLLVM.*; @@ -21,6 +23,18 @@ import java.util.*; java -jar build/libs/TP2.jar tests/fragment0/priority2.vsl java -jar build/libs/TP2.jar tests/aLaMain.vsl */ + +/* TODO : +frament 1 : +java -jar build/libs/TP2.jar tests/fragment1/print4.vsl + +fragment 2 : +java -jar build/libs/TP2.jar tests/fragment2/call3expr.vsl + +java -jar build/libs/TP2.jar tests/fragment2/call4if.vsl + + */ + public class Main { public static void main(String[] args) { try { diff --git a/src/main/java/TP2/asd/Program.java b/src/main/java/TP2/asd/Program.java index 7f5df1c..47dd0c8 100644 --- a/src/main/java/TP2/asd/Program.java +++ b/src/main/java/TP2/asd/Program.java @@ -101,7 +101,8 @@ public class Program{ return v.visitAssign(this, h); } } - + + //t : String et Expression public static record PrintImp(ArrayList t) implements Instruction{ @Override public S accept(InstrVisitor v, H h) { diff --git a/src/main/java/TP2/asd/SymTable.java b/src/main/java/TP2/asd/SymTable.java index 0b77654..34f774f 100644 --- a/src/main/java/TP2/asd/SymTable.java +++ b/src/main/java/TP2/asd/SymTable.java @@ -13,7 +13,7 @@ public class SymTable { private PStack> varMap; private PMap functionsMap; private int[] id ; //id partagé entre toute les symTable, [0] : idVar, [1] : idLabel, [2] : idGlobalVar - private ArrayList declarationsGlobal; + private ArrayList declarationsGlobal; //aussi partagé entre toute les symTable (.fmt pour les print et scan) public SymTable(){ this.id = new int[3]; diff --git a/src/main/java/TP2/asd/toLLVM_Visitor.java b/src/main/java/TP2/asd/toLLVM_Visitor.java index bbcbff5..0ce01c4 100644 --- a/src/main/java/TP2/asd/toLLVM_Visitor.java +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -161,10 +161,32 @@ public class toLLVM_Visitor implements ProgramVisitor, String name = h.getGlobalDeclName(); VarLLVMImp varGlobal = new VarLLVMImp(new CharLLVMImp(true),name,true); - DeclarGlobalLLVMImp globalDecl = new DeclarGlobalLLVMImp(varGlobal,new CharLLVMImp(false),0); //TODO - h.addGlobalDecl(globalDecl); params.add(varGlobal); + String strGlobal = ""; + int size = 1; //le \00 est focément à la fin et compte comme un seul char + for(int i = 0; i, @Override public ArrayList visitRead(ReadImp instr, SymTable h) { ArrayList l = new ArrayList<>(); + ArrayList params = new ArrayList<>(); + + String name = h.getGlobalDeclName(); + VarLLVMImp varGlobal = new VarLLVMImp(new CharLLVMImp(true),name,true); + + params.add(varGlobal); + + String strGlobal = ""; + int size = 1; //le \00 est focément à la fin et compte comme un seul char for(int i = 0; i params = new ArrayList<>(); - - String name = h.getGlobalDeclName(); - VarLLVMImp varGlobal = new VarLLVMImp(new CharLLVMImp(true),name,true); - DeclarGlobalLLVMImp globalDecl = new DeclarGlobalLLVMImp(varGlobal,new CharLLVMImp(false),0);//TODO - h.addGlobalDecl(globalDecl); - - params.add(varGlobal); + strGlobal+="%d"; //2 char de long + size+=2; params.add(newVar); - - l.add(new ReadLLVMImp(globalDecl,params)); - } + } + strGlobal+="\\00"; + + DeclarGlobalLLVMImp globalDecl = new DeclarGlobalLLVMImp(varGlobal,new CharLLVMImp(false),strGlobal,size);//TODO + h.addGlobalDecl(globalDecl); + + l.add(new ScanLLVMImp(globalDecl,params)); + return l; } diff --git a/src/main/java/TP2/llvm/Interface.java b/src/main/java/TP2/llvm/Interface.java index 45f13e7..837f238 100644 --- a/src/main/java/TP2/llvm/Interface.java +++ b/src/main/java/TP2/llvm/Interface.java @@ -30,7 +30,7 @@ public interface Interface { public S visitAssignLLVM(AssignLLVMImp instr, H h); public S visitStoreLLVM(StoreLLVMImp instr, H h); public S visitPrintLLVM(PrintLLVMImp instr, H h); - public S visitReadLLVM(ReadLLVMImp instr, H h); + public S visitScanLLVM(ScanLLVMImp instr, H h); public S visitLabelLLVM(LabelLLVMImp instr, H h); public S visitBrLLVM(BrLLVMImp instr, H h); public S visitBrCondLLVM(BrCondLLVMImp instr, H h); diff --git a/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java b/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java index 61ba0ec..54f8fdb 100644 --- a/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java +++ b/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java @@ -139,12 +139,12 @@ TypeLLVMVisitor @Override public String visitPrintLLVM(PrintLLVMImp instr, String h) { //TODO DefineLLVMImp printLLVM = new DefineLLVMImp("printf", new IntLLVMImp(), new ArrayList<>(), new ArrayList<>()); - CallLLVMImp callPrint = new CallLLVMImp(printLLVM, new ArrayList<>(),"(i8*,...) "); + CallLLVMImp callPrint = new CallLLVMImp(printLLVM, instr.l(),"(i8*,...) "); return callPrint.accept(this, h); } @Override - public String visitReadLLVM(ReadLLVMImp instr, String h) { //TODO + public String visitScanLLVM(ScanLLVMImp instr, String h) { //TODO DefineLLVMImp readLLVM = new DefineLLVMImp("scanf", new IntLLVMImp(), new ArrayList<>(), new ArrayList<>()); CallLLVMImp callRead = new CallLLVMImp(readLLVM, instr.l(),"(i8*,...) "); return callRead.accept(this, h); @@ -153,8 +153,8 @@ TypeLLVMVisitor @Override public String visitDeclarGlobalLLVM(DeclarGlobalLLVMImp instr, String h) { String str = "@."+instr.var().nom() + " = global"; - str += " [" + instr.type().accept(this, h)+ "x"+ instr.size()+ "] "; - str+= "c\"\"\n"; + str += " [" + instr.size() + " x "+ instr.type().accept(this, h) + "] "; + str+= "c\""+ instr.str()+"\"\n"; return str; } diff --git a/src/main/java/TP2/llvm/ProgramLLVM.java b/src/main/java/TP2/llvm/ProgramLLVM.java index 82d0a37..c1bacf0 100644 --- a/src/main/java/TP2/llvm/ProgramLLVM.java +++ b/src/main/java/TP2/llvm/ProgramLLVM.java @@ -88,15 +88,15 @@ public class ProgramLLVM { } } - public static record ReadLLVMImp(DeclarGlobalLLVMImp fmt,ArrayList l) implements InstructionLLVM{ + public static record ScanLLVMImp(DeclarGlobalLLVMImp fmt,ArrayList l) implements InstructionLLVM{ @Override public S accept(InstructionLLVMVisitor v, H h) { - return v.visitReadLLVM(this, h); + return v.visitScanLLVM(this, h); } } - public static record DeclarGlobalLLVMImp(VarLLVMImp var,TypeLLVM type, int size) implements InstructionLLVM{ + public static record DeclarGlobalLLVMImp(VarLLVMImp var,TypeLLVM type,String str, int size) implements InstructionLLVM{ @Override public S accept(InstructionLLVMVisitor v, H h) { diff --git a/tests/aLaMain.vsl b/tests/aLaMain.vsl index c13f29e..2820ad9 100644 --- a/tests/aLaMain.vsl +++ b/tests/aLaMain.vsl @@ -17,7 +17,8 @@ FUNC INT main(x,y) { b:=3 affiche(b) c:=add(x,b) - 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, x + PRINT "test",a WHILE b - 1 DO{ b := b - 1