diff --git a/src/main/antlr/VSLParser.g b/src/main/antlr/VSLParser.g index ed53161..d6abee3 100644 --- a/src/main/antlr/VSLParser.g +++ b/src/main/antlr/VSLParser.g @@ -218,6 +218,10 @@ td_expression returns [Expression out]: ; lit returns [Expression out]: + MINUS n=lit { + $out = new BinopExpressionImp(Op.MINUS, new ConstImp(0), $n.out); + } + | NUMBER { $out = new ConstImp($NUMBER.int); } diff --git a/src/main/java/TP2/asd/toLLVM_Visitor.java b/src/main/java/TP2/asd/toLLVM_Visitor.java index 2db14ab..667909f 100644 --- a/src/main/java/TP2/asd/toLLVM_Visitor.java +++ b/src/main/java/TP2/asd/toLLVM_Visitor.java @@ -78,8 +78,8 @@ public class toLLVM_Visitor implements ProgramVisitor, if(!(instrLLVM.getLast() instanceof ReturnLLVMImp || instrLLVM.getLast() instanceof BrLLVMImp)){ instrLLVM.add(new ReturnLLVMImp(type, new ValLLVMImp(type,0))); } - }else { - //TODO + }else if(type instanceof VoidLLVMImp){ + instrLLVM.add(new ReturnLLVMImp(type,null)); } DefineLLVMImp define = new DefineLLVMImp(fun.nom(), type, paramsLLVM, instrLLVM); return define; @@ -138,14 +138,18 @@ public class toLLVM_Visitor implements ProgramVisitor, @Override public ArrayList visitReturn(Return_instrImp instr, SymTable h) { - InstrAndVal res = instr.e().accept(this,h); - ValLLVM var = res.val; - - InstructionLLVM r = new ReturnLLVMImp(var.getType(),var); ArrayList result = new ArrayList<>(); - result.addAll(res.instrs); - result.add(r); + //ret void + if (instr.e() == null) { + result.add(new ReturnLLVMImp(new VoidLLVMImp(), null)); + }else{ + InstrAndVal res = instr.e().accept(this,h); + ValLLVM var = res.val; + InstructionLLVM r = new ReturnLLVMImp(var.getType(),var); + result.addAll(res.instrs); + result.add(r); + } return result; } diff --git a/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java b/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java index c7c9004..5b28208 100644 --- a/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java +++ b/src/main/java/TP2/llvm/PrettyprinterLLVM_Visitor.java @@ -62,7 +62,11 @@ TypeLLVMVisitor @Override public String visitReturnLLVM(ReturnLLVMImp instr, String h) { - return INDENT+"ret " + instr.type().accept(this, h) + " " + instr.e().accept(this, h); + if (instr.e() == null) { + return INDENT + "ret " + instr.type().accept(this, h); + } else { + return INDENT + "ret " + instr.type().accept(this, h) + " " + instr.e().accept(this, h); + } } @Override @@ -128,31 +132,32 @@ TypeLLVMVisitor @Override public String visitCallLLVM(CallLLVMImp instr, String h) { - String str = "call " + instr.str() + instr.f().type().accept(this, h) + " @"+instr.f().name() + "("; - for(int i = 0; i(), new ArrayList<>()); - CallLLVMImp callPrint = new CallLLVMImp(printLLVM, instr.l(),"(i8*,...) "); + CallLLVMImp callPrint = new CallLLVMImp(printLLVM, instr.l(),"i8*, ..."); return callPrint.accept(this, h); } @Override 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*,...) "); + CallLLVMImp callRead = new CallLLVMImp(readLLVM, instr.l(),"i8*, ..."); return callRead.accept(this, h); } @Override public String visitDeclarGlobalLLVM(DeclarGlobalLLVMImp instr, String h) { - String str = "@."+instr.var().nom() + " = global"; + String str = "@"+instr.var().nom() + " = global"; str += " [" + instr.size() + " x "+ instr.type().accept(this, h) + "] "; str+= "c\""+ instr.str()+"\"\n"; diff --git a/tests/aLaMain2.vsl b/tests/aLaMain2.vsl index 7dea56d..ceb7520 100644 --- a/tests/aLaMain2.vsl +++ b/tests/aLaMain2.vsl @@ -1,23 +1 @@ -FUNC INT test1(a,b){ - a := a+b -} - -FUNC INT test2(a,b){ - IF a - THEN - RETURN a - FI -} - -FUNC INT test3(a,b){ - IF a - THEN - RETURN a - ELSE - RETURN b - FI -} - -FUNC INT main(x,y) { - x := test1(x,y) -} +FUNC VOID main() PRINT 1 diff --git a/tests/fragment1/hello_world b/tests/fragment1/hello_world new file mode 100755 index 0000000..b94fac9 Binary files /dev/null and b/tests/fragment1/hello_world differ diff --git a/tests/fragment1/print1 b/tests/fragment1/print1 new file mode 100755 index 0000000..f9faf29 Binary files /dev/null and b/tests/fragment1/print1 differ diff --git a/tests/fragment1/print2 b/tests/fragment1/print2 new file mode 100755 index 0000000..ba8955f Binary files /dev/null and b/tests/fragment1/print2 differ diff --git a/tests/fragment1/print3 b/tests/fragment1/print3 new file mode 100755 index 0000000..79be5b9 Binary files /dev/null and b/tests/fragment1/print3 differ diff --git a/tests/fragment1/print4 b/tests/fragment1/print4 new file mode 100755 index 0000000..8c58219 Binary files /dev/null and b/tests/fragment1/print4 differ diff --git a/tests/fragment1/sequence b/tests/fragment1/sequence new file mode 100755 index 0000000..06292b3 Binary files /dev/null and b/tests/fragment1/sequence differ diff --git a/tests/fragment2/call b/tests/fragment2/call new file mode 100755 index 0000000..918641a Binary files /dev/null and b/tests/fragment2/call differ