return 0 à la fin, suppression du typeFunction dans la symTable, Appeal renomé en Call
This commit is contained in:
@@ -226,7 +226,7 @@ lit returns [Expression out]:
|
|||||||
}
|
}
|
||||||
| t=ident
|
| t=ident
|
||||||
(
|
(
|
||||||
ParO (para=list_expression)? ParF {$out = new AppealImp($t.out,($para.out !=null) ?$para.out : new ArrayList<>());}
|
ParO (para=list_expression)? ParF {$out = new CallImp($t.out,($para.out !=null) ?$para.out : new ArrayList<>());}
|
||||||
| {$out=new VarImp($t.out);}
|
| {$out=new VarImp($t.out);}
|
||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -56,12 +56,12 @@ public class Main {
|
|||||||
//System.err.println("todo " + ast);
|
//System.err.println("todo " + ast);
|
||||||
|
|
||||||
//System.out.println("\n\n PRETTYPRINTER VSL : \n--------------\n");
|
//System.out.println("\n\n PRETTYPRINTER VSL : \n--------------\n");
|
||||||
//System.out.println(ast.prettyprinter());
|
System.out.println(ast.prettyprinter());
|
||||||
//System.out.println("\n\n PRETTYPRINTER VSL : \n--------------\n");
|
//System.out.println("\n\n PRETTYPRINTER VSL : \n--------------\n");
|
||||||
// Verify the program semantic
|
// Verify the program semantic
|
||||||
|
|
||||||
// Generate the intermediate representation
|
// Generate the intermediate representation
|
||||||
//System.out.println("\n\n");
|
System.out.println("\n\n");
|
||||||
|
|
||||||
ProgramLLVMImp astLLVM = ast.toLLVM();
|
ProgramLLVMImp astLLVM = ast.toLLVM();
|
||||||
//System.out.println("\n\n PRETTYPRINTER LLVM : \n--------------\n");
|
//System.out.println("\n\n PRETTYPRINTER LLVM : \n--------------\n");
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ public interface Interface{
|
|||||||
public S visitConst(ConstImp e,H h);
|
public S visitConst(ConstImp e,H h);
|
||||||
public S visitBinOp(BinopExpressionImp e, H h);
|
public S visitBinOp(BinopExpressionImp e, H h);
|
||||||
public S visitVar(VarImp e,H h);
|
public S visitVar(VarImp e,H h);
|
||||||
public S visitAppeal(AppealImp instr, H h);
|
public S visitCall(CallImp instr, H h);
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface Type{
|
public interface Type{
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ public class PrettyprinterVisitor implements ProgramVisitor<String,String>,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String visitAppeal(AppealImp instr,String indent){
|
public String visitCall(CallImp instr,String indent){
|
||||||
String str = indent + instr.fName() + "(";
|
String str = indent + instr.fName() + "(";
|
||||||
for(int i=0; i<instr.params().size();i++){
|
for(int i=0; i<instr.params().size();i++){
|
||||||
str += instr.params().get(i).accept(this, "");
|
str += instr.params().get(i).accept(this, "");
|
||||||
|
|||||||
@@ -62,10 +62,10 @@ public class Program{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static record AppealImp(String fName, ArrayList<Expression> params) implements Expression{
|
public static record CallImp(String fName, ArrayList<Expression> params) implements Expression{
|
||||||
@Override
|
@Override
|
||||||
public <H, S> S accept(ExprVisitor<H, S> v, H h) {
|
public <H, S> S accept(ExprVisitor<H, S> v, H h) {
|
||||||
return v.visitAppeal(this, h);
|
return v.visitCall(this, h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ public class SymTable {
|
|||||||
private PMap<String,ValueFunMap> functionsMap;
|
private PMap<String,ValueFunMap> functionsMap;
|
||||||
private int[] id ; //id partagé entre toute les symTable, [0] : idVar, [1] : idLabel, [2] : idGlobalVar
|
private int[] id ; //id partagé entre toute les symTable, [0] : idVar, [1] : idLabel, [2] : idGlobalVar
|
||||||
private ArrayList<DeclarGlobalLLVMImp> declarationsGlobal; //aussi partagé entre toute les symTable (.fmt pour les print et scan)
|
private ArrayList<DeclarGlobalLLVMImp> declarationsGlobal; //aussi partagé entre toute les symTable (.fmt pour les print et scan)
|
||||||
private TypeLLVM currentFuncType;
|
|
||||||
|
|
||||||
public SymTable(){
|
public SymTable(){
|
||||||
this.id = new int[3];
|
this.id = new int[3];
|
||||||
@@ -27,12 +26,11 @@ public class SymTable {
|
|||||||
this.id[2] = 1; //idGlobalVar
|
this.id[2] = 1; //idGlobalVar
|
||||||
}
|
}
|
||||||
public SymTable(PStack<PMap<String,ValueVarMap>> varMap, PMap<String,ValueFunMap> functionsMap,
|
public SymTable(PStack<PMap<String,ValueVarMap>> varMap, PMap<String,ValueFunMap> functionsMap,
|
||||||
int[] id,ArrayList<DeclarGlobalLLVMImp> declarationsGlobal,TypeLLVM type){
|
int[] id,ArrayList<DeclarGlobalLLVMImp> declarationsGlobal){
|
||||||
this.varMap= varMap;
|
this.varMap= varMap;
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.functionsMap = functionsMap;
|
this.functionsMap = functionsMap;
|
||||||
this.declarationsGlobal = declarationsGlobal;
|
this.declarationsGlobal = declarationsGlobal;
|
||||||
this.currentFuncType=type;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ValueFunMap{
|
public static class ValueFunMap{
|
||||||
@@ -45,18 +43,6 @@ public class SymTable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public SymTable newBlock() {
|
|
||||||
return new SymTable(varMap.plus(HashTreePMap.empty()), functionsMap, id,declarationsGlobal,currentFuncType);
|
|
||||||
}
|
|
||||||
|
|
||||||
public SymTable outBlock() {
|
|
||||||
if (varMap.size() > 1) {
|
|
||||||
return new SymTable(varMap.minus(0), functionsMap, id,declarationsGlobal,currentFuncType);
|
|
||||||
} else {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ValueVarMap{
|
public static class ValueVarMap{
|
||||||
public Type type;
|
public Type type;
|
||||||
public int id;
|
public int id;
|
||||||
@@ -67,12 +53,18 @@ public class SymTable {
|
|||||||
this.isParam = isParam;
|
this.isParam = isParam;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*public void update(SymTable symTable2){
|
public SymTable newBlock() {
|
||||||
this.id = symTable2.getId();
|
return new SymTable(varMap.plus(HashTreePMap.empty()), functionsMap, id,declarationsGlobal);
|
||||||
this.idLabel = symTable2.getIdLabel();
|
}
|
||||||
this.declarationsGlobal = symTable2.getDeclarationGlobal();
|
|
||||||
}*/
|
public SymTable outBlock() {
|
||||||
|
if (varMap.size() > 1) {
|
||||||
|
return new SymTable(varMap.minus(0), functionsMap, id,declarationsGlobal);
|
||||||
|
} else {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ArrayList<DeclarGlobalLLVMImp> getDeclarationGlobal(){
|
public ArrayList<DeclarGlobalLLVMImp> getDeclarationGlobal(){
|
||||||
return this.declarationsGlobal;
|
return this.declarationsGlobal;
|
||||||
@@ -88,26 +80,25 @@ public class SymTable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public SymTable addFunction(DefineLLVMImp function, Boolean isProto,TypeLLVM type){
|
public SymTable addFunction(DefineLLVMImp function, Boolean isProto){
|
||||||
ValueFunMap value = this.functionsMap.get(function.name());
|
ValueFunMap value = this.functionsMap.get(function.name());
|
||||||
if(value == null || (value!=null && value.isProto && !isProto)){
|
if(value == null || (value!=null && value.isProto && !isProto)){
|
||||||
return new SymTable(this.varMap, this.functionsMap.plus(function.name(),new ValueFunMap(function,isProto)), this.id,this.declarationsGlobal,type);
|
return new SymTable(this.varMap, this.functionsMap.plus(function.name(),new ValueFunMap(function,isProto)), this.id,this.declarationsGlobal);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
if(value.isProto) System.err.println("[VSL compile error] : Le prototype "+function.name()+" existe déjà");
|
if(value.isProto) System.err.println("[VSL compile error] : Le prototype '"+function.name()+"()' existe déjà");
|
||||||
else if(isProto) System.err.println("[VSL compile error] : Le prototype "+function.name()+" doit être déclaré avant son implémentation");
|
else if(isProto) System.err.println("[VSL compile error] : Le prototype '"+function.name()+"()' doit être déclaré avant son implémentation");
|
||||||
else System.err.println("[VSL compile error] : La fonction "+function.name()+" existe déjà");
|
else System.err.println("[VSL compile error] : La fonction '"+function.name()+"()' existe déjà");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ValueFunMap getFunction(String name){
|
public ValueFunMap getFunction(String name){
|
||||||
return this.functionsMap.get(name);
|
ValueFunMap f = this.functionsMap.get(name);
|
||||||
|
if (f==null) System.err.println("[VSL compile error] : la fonction '" + name + "()' n'existe pas, veuillez vous assurer de l'avoir déclarée avant l'appel");
|
||||||
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
public TypeLLVM getFuncType(){
|
|
||||||
return this.currentFuncType;
|
|
||||||
}
|
|
||||||
public int getId(){
|
public int getId(){
|
||||||
return this.id[0];
|
return this.id[0];
|
||||||
}
|
}
|
||||||
@@ -152,13 +143,13 @@ public class SymTable {
|
|||||||
public Result addVar(String nomVar) {
|
public Result addVar(String nomVar) {
|
||||||
PMap<String, ValueVarMap> top = varMap.get(0);
|
PMap<String, ValueVarMap> top = varMap.get(0);
|
||||||
if (top.containsKey(nomVar)) {
|
if (top.containsKey(nomVar)) {
|
||||||
System.err.println("[VSL compile error] :" + "Erreur");
|
System.err.println("[VSL compile error] : '" + nomVar+ "' Erreur");
|
||||||
return new Result(this, null);
|
return new Result(this, null);
|
||||||
}
|
}
|
||||||
String realName = nomVar + id[0];
|
String realName = nomVar + id[0];
|
||||||
top = top.plus(nomVar, new ValueVarMap(new Type_intImp(), id[0], false));
|
top = top.plus(nomVar, new ValueVarMap(new Type_intImp(), id[0], false));
|
||||||
id[0]++;
|
id[0]++;
|
||||||
SymTable newSym = new SymTable(varMap.minus(0).plus(0, top), functionsMap, id,this.declarationsGlobal,currentFuncType);
|
SymTable newSym = new SymTable(varMap.minus(0).plus(0, top), functionsMap, id,this.declarationsGlobal);
|
||||||
return new Result(newSym, realName);
|
return new Result(newSym, realName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,7 +165,7 @@ public class SymTable {
|
|||||||
return prefix + nomVar + value.id;
|
return prefix + nomVar + value.id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
System.err.println("[VSL compile error] :" + nomVar+" n'est pas trovué");
|
System.err.println("[VSL compile error] : '" + nomVar + "' n'a pas été déclaré");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,7 +175,7 @@ public class SymTable {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
System.err.println("[VSL compile error] :" + nomVar+" n'est pas trouvé");
|
System.err.println("[VSL compile error] : '" + nomVar+"' n'est pas trouvé");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,7 +208,7 @@ public class SymTable {
|
|||||||
}
|
}
|
||||||
top = top.plus(nomVar, new ValueVarMap(type, id[0], isParam));
|
top = top.plus(nomVar, new ValueVarMap(type, id[0], isParam));
|
||||||
if(!isParam) this.id[0]++;
|
if(!isParam) this.id[0]++;
|
||||||
return new SymTable(varMap.minus(0).plus(0, top), functionsMap, id, this.declarationsGlobal,currentFuncType);
|
return new SymTable(varMap.minus(0).plus(0, top), functionsMap, id, this.declarationsGlobal);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String print_all(){
|
public String print_all(){
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
for(int i = 0; i<prog.fonctions().size(); i++){
|
for(int i = 0; i<prog.fonctions().size(); i++){
|
||||||
DefineLLVMImp function = prog.fonctions().get(i).accept(this, h);
|
DefineLLVMImp function = prog.fonctions().get(i).accept(this, h);
|
||||||
Boolean isProto = (prog.fonctions().get(i) instanceof PrototypeImp);
|
Boolean isProto = (prog.fonctions().get(i) instanceof PrototypeImp);
|
||||||
TypeLLVM type = prog.fonctions().get(i); //TODO
|
TypeLLVM type = function.type();
|
||||||
h = h.addFunction(function,isProto,type);
|
h = h.addFunction(function,isProto);
|
||||||
if(!isProto){ //les prototypes n'existent pas dans LLVM
|
if(!isProto){ //les prototypes n'existent pas dans LLVM
|
||||||
fonctionLLVM.add(function);
|
fonctionLLVM.add(function);
|
||||||
}
|
}
|
||||||
@@ -73,7 +73,13 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
paramsLLVM.add(var);
|
paramsLLVM.add(var);
|
||||||
}
|
}
|
||||||
instrLLVM.addAll(fun.instruction().accept(this, h));
|
instrLLVM.addAll(fun.instruction().accept(this, h));
|
||||||
DefineLLVMImp define = new DefineLLVMImp(fun.nom(), fun.type().accept(this, h), paramsLLVM, instrLLVM);
|
TypeLLVM type = fun.type().accept(this, h);
|
||||||
|
if(!(type instanceof VoidLLVMImp)){ //on ajoute un return 0 si la fonction n'est pas un void, et ne finit ni par un return ni pas un goto (sans condition)
|
||||||
|
if(!(instrLLVM.getLast() instanceof ReturnLLVMImp || instrLLVM.getLast() instanceof BrLLVMImp)){
|
||||||
|
instrLLVM.add(new ReturnLLVMImp(type, new ValLLVMImp(type,0)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DefineLLVMImp define = new DefineLLVMImp(fun.nom(), type, paramsLLVM, instrLLVM);
|
||||||
return define;
|
return define;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -273,9 +279,6 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
h=h.outBlock();
|
h=h.outBlock();
|
||||||
|
|
||||||
l.add(new LabelLLVMImp(labelFin));
|
l.add(new LabelLLVMImp(labelFin));
|
||||||
if (h.getFuncType() instanceof IntLLVMImp) {
|
|
||||||
l.add(new ReturnLLVMImp(new IntLLVMImp(), new ValLLVMImp(new IntLLVMImp(), 0)));
|
|
||||||
}
|
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -388,7 +391,7 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
return new InstrAndVal(list, var);
|
return new InstrAndVal(list, var);
|
||||||
}
|
}
|
||||||
|
|
||||||
public InstrAndVal visitAppeal(AppealImp instr,SymTable h){
|
public InstrAndVal visitCall(CallImp instr,SymTable h){
|
||||||
ArrayList<InstructionLLVM> l = new ArrayList<>();
|
ArrayList<InstructionLLVM> l = new ArrayList<>();
|
||||||
ArrayList<ValLLVM> paramsLLVM = new ArrayList<>();
|
ArrayList<ValLLVM> paramsLLVM = new ArrayList<>();
|
||||||
for(Expression param : instr.params()){
|
for(Expression param : instr.params()){
|
||||||
@@ -397,10 +400,10 @@ public class toLLVM_Visitor implements ProgramVisitor<SymTable,ProgramLLVMImp>,
|
|||||||
paramsLLVM.add(result.val);
|
paramsLLVM.add(result.val);
|
||||||
}
|
}
|
||||||
ValueFunMap fLLVM = h.getFunction(instr.fName()); //on récupère la fonction LLVM dans la table des Symboles
|
ValueFunMap fLLVM = h.getFunction(instr.fName()); //on récupère la fonction LLVM dans la table des Symboles
|
||||||
if(fLLVM == null){
|
//if(fLLVM == null){
|
||||||
System.err.println("[VSL compile error] : la fonction n'existe pas, veuillez vous assurer de l'avoir déclarée avant l'appel");
|
// System.err.println("[VSL compile error] : la fonction n'existe pas, veuillez vous assurer de l'avoir déclarée avant l'appel");
|
||||||
return new InstrAndVal(l, null);
|
// return new InstrAndVal(l, null);
|
||||||
}
|
//}
|
||||||
|
|
||||||
//Pour c=func(x,y)
|
//Pour c=func(x,y)
|
||||||
Result res = h.addNewTempVar();
|
Result res = h.addNewTempVar();
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ TypeLLVMVisitor<String,String>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String visitCallLLVM(CallLLVMImp instr, String h) {
|
public String visitCallLLVM(CallLLVMImp instr, String h) {
|
||||||
String str = INDENT+ "call " + instr.str() + instr.f().type().accept(this, h) + " @"+instr.f().name() + "(";
|
String str = "call " + instr.str() + instr.f().type().accept(this, h) + " @"+instr.f().name() + "(";
|
||||||
for(int i = 0; i<instr.params().size(); i++){
|
for(int i = 0; i<instr.params().size(); i++){
|
||||||
str += instr.params().get(i).getType().accept(this, h) + " " + instr.params().get(i).accept(this,h);
|
str += instr.params().get(i).getType().accept(this, h) + " " + instr.params().get(i).accept(this,h);
|
||||||
if(i<instr.params().size()-1) str += ", ";
|
if(i<instr.params().size()-1) str += ", ";
|
||||||
|
|||||||
@@ -1,58 +1,23 @@
|
|||||||
PROTO INT add(x,y)
|
FUNC INT test1(a,b){
|
||||||
|
a := a+b
|
||||||
|
}
|
||||||
|
|
||||||
FUNC INT add(x,y,z) {
|
FUNC INT test2(a,b){
|
||||||
INT z,a,b,c
|
IF a
|
||||||
y := x+y
|
THEN
|
||||||
RETURN z
|
RETURN a
|
||||||
|
FI
|
||||||
|
}
|
||||||
|
|
||||||
|
FUNC INT test3(a,b){
|
||||||
|
IF a
|
||||||
|
THEN
|
||||||
|
RETURN a
|
||||||
|
ELSE
|
||||||
|
RETURN b
|
||||||
|
FI
|
||||||
}
|
}
|
||||||
|
|
||||||
FUNC INT main(x,y) {
|
FUNC INT main(x,y) {
|
||||||
INT a,b,c,minh
|
x := test1(x,y)
|
||||||
x := 5
|
}
|
||||||
minh := x * y
|
|
||||||
b:=3
|
|
||||||
c:=1
|
|
||||||
PRINT "coucou, tu peux réparer le visitPrint dans LLVM stp","il manque virgule au milieu", c*5+b
|
|
||||||
WHILE b - 1
|
|
||||||
DO{
|
|
||||||
b := b - 1
|
|
||||||
c := c + 1
|
|
||||||
WHILE b -1
|
|
||||||
DO{
|
|
||||||
b:= b - 1
|
|
||||||
c:= c + 1
|
|
||||||
WHILE b -1
|
|
||||||
DO{
|
|
||||||
b:= b - 1
|
|
||||||
c:= c + 1
|
|
||||||
}
|
|
||||||
DONE
|
|
||||||
}
|
|
||||||
DONE
|
|
||||||
}
|
|
||||||
DONE
|
|
||||||
WHILE b - 1
|
|
||||||
DO{
|
|
||||||
b := b - 1
|
|
||||||
c := c + 1
|
|
||||||
WHILE b -1
|
|
||||||
DO{
|
|
||||||
b:= b - 1
|
|
||||||
c:= c + 1
|
|
||||||
WHILE b -1
|
|
||||||
DO{
|
|
||||||
b:= b - 1
|
|
||||||
c:= c + 1
|
|
||||||
}
|
|
||||||
DONE
|
|
||||||
}
|
|
||||||
DONE
|
|
||||||
}
|
|
||||||
DONE
|
|
||||||
IF c -1
|
|
||||||
THEN READ a ELSE READ b
|
|
||||||
FI
|
|
||||||
b:=c+1
|
|
||||||
RETURN 4 + 6 * 5 + 2 }
|
|
||||||
|
|
||||||
PROTO INT type(x,y)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user