From 9aedd869962f660578d406441995bfe99a8221c5 Mon Sep 17 00:00:00 2001 From: Alexis Nasr <alexis.nasr@lif.univ-mrs.fr> Date: Mon, 15 Jan 2024 09:00:59 +0100 Subject: [PATCH] commit original --- sablecc/sablecc.jar | Bin 0 -> 406885 bytes sablecc/sablecc_thesis.pdf | Bin 0 -> 346444 bytes src/.gitignore | 4 + src/C3aVM.java | 67 ++ src/Compiler.java | 215 +++++ src/Makefile | 52 + src/NasmVM.java | 66 ++ src/SaVM.java | 46 + src/c3a.cfg | 113 +++ src/c3a/C3a.java | 87 ++ src/c3a/C3aBooleanConstant.java | 15 + src/c3a/C3aConstant.java | 15 + src/c3a/C3aEval.java | 385 ++++++++ src/c3a/C3aFunction.java | 20 + src/c3a/C3aInst.java | 16 + src/c3a/C3aInstAdd.java | 27 + src/c3a/C3aInstAffect.java | 27 + src/c3a/C3aInstCall.java | 28 + src/c3a/C3aInstDiv.java | 27 + src/c3a/C3aInstFBegin.java | 23 + src/c3a/C3aInstFEnd.java | 21 + src/c3a/C3aInstJump.java | 24 + src/c3a/C3aInstJumpIfEqual.java | 27 + src/c3a/C3aInstJumpIfLess.java | 28 + src/c3a/C3aInstJumpIfNotEqual.java | 27 + src/c3a/C3aInstMult.java | 27 + src/c3a/C3aInstParam.java | 25 + src/c3a/C3aInstRead.java | 25 + src/c3a/C3aInstReturn.java | 25 + src/c3a/C3aInstStop.java | 27 + src/c3a/C3aInstSub.java | 27 + src/c3a/C3aInstWrite.java | 26 + src/c3a/C3aLabel.java | 29 + src/c3a/C3aOp.java | 24 + src/c3a/C3aOperand.java | 7 + src/c3a/C3aTemp.java | 16 + src/c3a/C3aVar.java | 24 + src/c3a/C3aVisitor.java | 30 + src/c3a/LoadC3a.java | 473 +++++++++ src/c3a/Sa2c3a.java | 49 + src/fg/Fg.java | 87 ++ src/fg/FgSolution.java | 51 + src/ig/Ig.java | 61 ++ src/l.cfg | 32 + src/nasm.cfg | 210 ++++ src/nasm/C3a2nasm.java | 59 ++ src/nasm/LoadNasm.java | 1117 ++++++++++++++++++++++ src/nasm/Nasm.java | 172 ++++ src/nasm/NasmAdd.java | 25 + src/nasm/NasmAddress.java | 26 + src/nasm/NasmAnd.java | 24 + src/nasm/NasmCall.java | 19 + src/nasm/NasmCmp.java | 23 + src/nasm/NasmConstant.java | 28 + src/nasm/NasmDiv.java | 19 + src/nasm/NasmEmpty.java | 18 + src/nasm/NasmEval.java | 410 ++++++++ src/nasm/NasmExp.java | 11 + src/nasm/NasmExpMinus.java | 34 + src/nasm/NasmExpPlus.java | 34 + src/nasm/NasmExpTimes.java | 34 + src/nasm/NasmInst.java | 36 + src/nasm/NasmInt.java | 18 + src/nasm/NasmJe.java | 19 + src/nasm/NasmJg.java | 19 + src/nasm/NasmJge.java | 19 + src/nasm/NasmJl.java | 19 + src/nasm/NasmJle.java | 25 + src/nasm/NasmJmp.java | 19 + src/nasm/NasmJne.java | 19 + src/nasm/NasmLabel.java | 28 + src/nasm/NasmMov.java | 22 + src/nasm/NasmMul.java | 26 + src/nasm/NasmNot.java | 21 + src/nasm/NasmOperand.java | 8 + src/nasm/NasmOr.java | 24 + src/nasm/NasmPop.java | 20 + src/nasm/NasmPseudoInst.java | 28 + src/nasm/NasmPush.java | 20 + src/nasm/NasmRegister.java | 57 ++ src/nasm/NasmResb.java | 21 + src/nasm/NasmResd.java | 21 + src/nasm/NasmResq.java | 21 + src/nasm/NasmRest.java | 21 + src/nasm/NasmResw.java | 21 + src/nasm/NasmRet.java | 18 + src/nasm/NasmSize.java | 20 + src/nasm/NasmSub.java | 22 + src/nasm/NasmVisitor.java | 47 + src/nasm/NasmXor.java | 24 + src/sa.cfg | 127 +++ src/sa/ErrorException.java | 23 + src/sa/LoadSa.java | 547 +++++++++++ src/sa/SaAppel.java | 33 + src/sa/SaCheckLinkage.java | 42 + src/sa/SaDec.java | 5 + src/sa/SaDecFonc.java | 34 + src/sa/SaDecTab.java | 31 + src/sa/SaDecVar.java | 11 + src/sa/SaDecVarSimple.java | 29 + src/sa/SaDepthFirstVisitor.java | 386 ++++++++ src/sa/SaEnvironment.java | 33 + src/sa/SaEval.java | 465 +++++++++ src/sa/SaExp.java | 6 + src/sa/SaExpAdd.java | 26 + src/sa/SaExpAnd.java | 26 + src/sa/SaExpAppel.java | 25 + src/sa/SaExpDiv.java | 27 + src/sa/SaExpEqual.java | 27 + src/sa/SaExpFaux.java | 28 + src/sa/SaExpInf.java | 28 + src/sa/SaExpInt.java | 26 + src/sa/SaExpLire.java | 21 + src/sa/SaExpMult.java | 27 + src/sa/SaExpNot.java | 26 + src/sa/SaExpOr.java | 28 + src/sa/SaExpSub.java | 28 + src/sa/SaExpVar.java | 24 + src/sa/SaExpVrai.java | 27 + src/sa/SaInst.java | 5 + src/sa/SaInstAffect.java | 22 + src/sa/SaInstBloc.java | 19 + src/sa/SaInstEcriture.java | 20 + src/sa/SaInstRetour.java | 24 + src/sa/SaInstSi.java | 26 + src/sa/SaInstTantQue.java | 23 + src/sa/SaLDecFonc.java | 28 + src/sa/SaLDecVar.java | 27 + src/sa/SaLExp.java | 30 + src/sa/SaLInst.java | 23 + src/sa/SaNode.java | 6 + src/sa/SaProg.java | 21 + src/sa/SaTypeCheck.java | 32 + src/sa/SaVar.java | 6 + src/sa/SaVarIndicee.java | 27 + src/sa/SaVarSimple.java | 24 + src/sa/SaVisitor.java | 38 + src/sa/Sc2sa.java | 43 + src/sa/TypeVal.java | 31 + src/sc/Sc2Xml.java | 48 + src/ts/Sa2ts.java | 36 + src/ts/Ts.java | 147 +++ src/ts/TsItemFct.java | 30 + src/ts/TsItemVar.java | 20 + src/ts/TsItemVarSimple.java | 22 + src/ts/TsItemVarTab.java | 19 + src/ts/TsParser.java | 71 ++ src/util/Error.java | 21 + src/util/Memory.java | 224 +++++ src/util/Type.java | 30 + src/util/graph/ColorGraph.java | 38 + src/util/graph/Graph.java | 83 ++ src/util/graph/Node.java | 55 ++ src/util/graph/NodeList.java | 10 + src/util/graph/TestColorGraph.java | 77 ++ src/util/intset/IntSet.java | 94 ++ test/c3a-ref/add1.c3a | 6 + test/c3a-ref/add2.c3a | 7 + test/c3a-ref/affect1.c3a | 6 + test/c3a-ref/affect2.c3a | 6 + test/c3a-ref/affect3.c3a | 10 + test/c3a-ref/and1.c3a | 10 + test/c3a-ref/and2.c3a | 10 + test/c3a-ref/and3.c3a | 10 + test/c3a-ref/and4.c3a | 10 + test/c3a-ref/and5.c3a | 15 + test/c3a-ref/appel-param1.c3a | 9 + test/c3a-ref/appel-param2.c3a | 11 + test/c3a-ref/appel-param3.c3a | 17 + test/c3a-ref/appel-retour1.c3a | 11 + test/c3a-ref/appel1.c3a | 8 + test/c3a-ref/appel2.c3a | 12 + test/c3a-ref/appel3.c3a | 12 + test/c3a-ref/div1.c3a | 6 + test/c3a-ref/div2.c3a | 6 + test/c3a-ref/div3.c3a | 7 + test/c3a-ref/div4.c3a | 6 + test/c3a-ref/ecrire1.c3a | 5 + test/c3a-ref/ecrire2.c3a | 5 + test/c3a-ref/egal1.c3a | 8 + test/c3a-ref/egal2.c3a | 8 + test/c3a-ref/egal3.c3a | 11 + test/c3a-ref/err5.c3a | 7 + test/c3a-ref/fibo.c3a | 25 + test/c3a-ref/inf1.c3a | 8 + test/c3a-ref/inf2.c3a | 8 + test/c3a-ref/inf3.c3a | 8 + test/c3a-ref/inf4.c3a | 11 + test/c3a-ref/mult1.c3a | 6 + test/c3a-ref/mult2.c3a | 6 + test/c3a-ref/mult3.c3a | 7 + test/c3a-ref/not1.c3a | 8 + test/c3a-ref/not2.c3a | 8 + test/c3a-ref/not3.c3a | 11 + test/c3a-ref/or1.c3a | 10 + test/c3a-ref/or2.c3a | 10 + test/c3a-ref/or3.c3a | 10 + test/c3a-ref/or4.c3a | 10 + test/c3a-ref/or5.c3a | 15 + test/c3a-ref/parenth1.c3a | 5 + test/c3a-ref/parenth2.c3a | 5 + test/c3a-ref/prio23-1.c3a | 9 + test/c3a-ref/prio23-2.c3a | 9 + test/c3a-ref/prio23-3.c3a | 9 + test/c3a-ref/prio23-4.c3a | 12 + test/c3a-ref/prio34-1.c3a | 7 + test/c3a-ref/prio34-2.c3a | 7 + test/c3a-ref/prio34-3.c3a | 7 + test/c3a-ref/prio34-4.c3a | 7 + test/c3a-ref/prio45-1.c3a | 9 + test/c3a-ref/prio45-2.c3a | 9 + test/c3a-ref/prio45-3.c3a | 9 + test/c3a-ref/prio45-4.c3a | 9 + test/c3a-ref/prio56-1.c3a | 13 + test/c3a-ref/prio56-2.c3a | 13 + test/c3a-ref/prio67-1.c3a | 15 + test/c3a-ref/prio67-2.c3a | 15 + test/c3a-ref/rec1.c3a | 22 + test/c3a-ref/si1.c3a | 6 + test/c3a-ref/si2.c3a | 8 + test/c3a-ref/si3.c3a | 9 + test/c3a-ref/si4.c3a | 9 + test/c3a-ref/si5.c3a | 9 + test/c3a-ref/sub1.c3a | 6 + test/c3a-ref/sub2.c3a | 6 + test/c3a-ref/sub3.c3a | 7 + test/c3a-ref/tab1.c3a | 10 + test/c3a-ref/tab2.c3a | 14 + test/c3a-ref/tab3.c3a | 17 + test/c3a-ref/tab4.c3a | 11 + test/c3a-ref/tantque1.c3a | 14 + test/c3a-ref/tantque2.c3a | 22 + test/c3a-ref/tri.c3a | 71 ++ test/c3a-ref/varglob1.c3a | 6 + test/c3a-ref/varglob2.c3a | 7 + test/c3a-ref/varglob3.c3a | 8 + test/c3a-ref/varglob4.c3a | 8 + test/c3a-ref/varloc1.c3a | 6 + test/c3a-ref/varloc2.c3a | 7 + test/c3a-ref/varloc3.c3a | 8 + test/c3a-ref/varloc4.c3a | 8 + test/c3a-ref/varloc5.c3a | 11 + test/evaluate.py | 473 +++++++++ test/fg-ref/add1.fg | 14 + test/fg-ref/add2.fg | 16 + test/fg-ref/affect1.fg | 13 + test/fg-ref/affect2.fg | 13 + test/fg-ref/affect3.fg | 24 + test/fg-ref/and1.fg | 21 + test/fg-ref/and2.fg | 21 + test/fg-ref/and3.fg | 21 + test/fg-ref/and4.fg | 21 + test/fg-ref/and5.fg | 29 + test/fg-ref/appel-param1.fg | 23 + test/fg-ref/appel-param2.fg | 26 + test/fg-ref/appel-param3.fg | 35 + test/fg-ref/appel-retour1.fg | 25 + test/fg-ref/appel1.fg | 21 + test/fg-ref/appel2.fg | 32 + test/fg-ref/appel3.fg | 32 + test/fg-ref/div1.fg | 16 + test/fg-ref/div2.fg | 16 + test/fg-ref/div3.fg | 20 + test/fg-ref/div4.fg | 16 + test/fg-ref/ecrire1.fg | 12 + test/fg-ref/ecrire2.fg | 12 + test/fg-ref/egal1.fg | 17 + test/fg-ref/egal2.fg | 17 + test/fg-ref/egal3.fg | 21 + test/fg-ref/err5.fg | 22 + test/fg-ref/fibo.fg | 80 ++ test/fg-ref/inf1.fg | 17 + test/fg-ref/inf2.fg | 17 + test/fg-ref/inf3.fg | 17 + test/fg-ref/inf4.fg | 21 + test/fg-ref/mult1.fg | 14 + test/fg-ref/mult2.fg | 14 + test/fg-ref/mult3.fg | 16 + test/fg-ref/not1.fg | 17 + test/fg-ref/not2.fg | 17 + test/fg-ref/not3.fg | 21 + test/fg-ref/or1.fg | 21 + test/fg-ref/or2.fg | 21 + test/fg-ref/or3.fg | 21 + test/fg-ref/or4.fg | 21 + test/fg-ref/or5.fg | 29 + test/fg-ref/parenth1.fg | 12 + test/fg-ref/parenth2.fg | 12 + test/fg-ref/prio23-1.fg | 19 + test/fg-ref/prio23-2.fg | 19 + test/fg-ref/prio23-3.fg | 21 + test/fg-ref/prio23-4.fg | 25 + test/fg-ref/prio34-1.fg | 16 + test/fg-ref/prio34-2.fg | 16 + test/fg-ref/prio34-3.fg | 18 + test/fg-ref/prio34-4.fg | 18 + test/fg-ref/prio45-1.fg | 19 + test/fg-ref/prio45-2.fg | 18 + test/fg-ref/prio45-3.fg | 19 + test/fg-ref/prio45-4.fg | 18 + test/fg-ref/prio56-1.fg | 25 + test/fg-ref/prio56-2.fg | 25 + test/fg-ref/prio67-1.fg | 29 + test/fg-ref/prio67-2.fg | 29 + test/fg-ref/rec1.fg | 73 ++ test/fg-ref/si1.fg | 15 + test/fg-ref/si2.fg | 18 + test/fg-ref/si3.fg | 20 + test/fg-ref/si4.fg | 20 + test/fg-ref/si5.fg | 32 + test/fg-ref/sub1.fg | 14 + test/fg-ref/sub2.fg | 14 + test/fg-ref/sub3.fg | 16 + test/fg-ref/tab1.fg | 25 + test/fg-ref/tab2.fg | 32 + test/fg-ref/tab3.fg | 35 + test/fg-ref/tab4.fg | 29 + test/fg-ref/tantque1.fg | 26 + test/fg-ref/tantque2.fg | 36 + test/fg-ref/varglob1.fg | 13 + test/fg-ref/varglob2.fg | 15 + test/fg-ref/varglob3.fg | 16 + test/fg-ref/varglob4.fg | 16 + test/fg-ref/varloc1.fg | 13 + test/fg-ref/varloc2.fg | 15 + test/fg-ref/varloc3.fg | 16 + test/fg-ref/varloc4.fg | 16 + test/fg-ref/varloc5.fg | 25 + test/fgs-ref/add1.fgs | 15 + test/fgs-ref/add2.fgs | 17 + test/fgs-ref/affect1.fgs | 14 + test/fgs-ref/affect2.fgs | 14 + test/fgs-ref/affect3.fgs | 25 + test/fgs-ref/and1.fgs | 22 + test/fgs-ref/and2.fgs | 22 + test/fgs-ref/and3.fgs | 22 + test/fgs-ref/and4.fgs | 22 + test/fgs-ref/and5.fgs | 30 + test/fgs-ref/appel-param1.fgs | 24 + test/fgs-ref/appel-param2.fgs | 27 + test/fgs-ref/appel-param3.fgs | 36 + test/fgs-ref/appel-retour1.fgs | 26 + test/fgs-ref/appel1.fgs | 22 + test/fgs-ref/appel2.fgs | 33 + test/fgs-ref/appel3.fgs | 33 + test/fgs-ref/div1.fgs | 17 + test/fgs-ref/div2.fgs | 17 + test/fgs-ref/div3.fgs | 21 + test/fgs-ref/div4.fgs | 17 + test/fgs-ref/ecrire1.fgs | 13 + test/fgs-ref/ecrire2.fgs | 13 + test/fgs-ref/egal1.fgs | 18 + test/fgs-ref/egal2.fgs | 18 + test/fgs-ref/egal3.fgs | 22 + test/fgs-ref/err5.fgs | 23 + test/fgs-ref/fibo.fgs | 81 ++ test/fgs-ref/inf1.fgs | 18 + test/fgs-ref/inf2.fgs | 18 + test/fgs-ref/inf3.fgs | 18 + test/fgs-ref/inf4.fgs | 22 + test/fgs-ref/mult1.fgs | 15 + test/fgs-ref/mult2.fgs | 15 + test/fgs-ref/mult3.fgs | 17 + test/fgs-ref/not1.fgs | 18 + test/fgs-ref/not2.fgs | 18 + test/fgs-ref/not3.fgs | 22 + test/fgs-ref/or1.fgs | 22 + test/fgs-ref/or2.fgs | 22 + test/fgs-ref/or3.fgs | 22 + test/fgs-ref/or4.fgs | 22 + test/fgs-ref/or5.fgs | 30 + test/fgs-ref/parenth1.fgs | 13 + test/fgs-ref/parenth2.fgs | 13 + test/fgs-ref/prio23-1.fgs | 20 + test/fgs-ref/prio23-2.fgs | 20 + test/fgs-ref/prio23-3.fgs | 22 + test/fgs-ref/prio23-4.fgs | 26 + test/fgs-ref/prio34-1.fgs | 17 + test/fgs-ref/prio34-2.fgs | 17 + test/fgs-ref/prio34-3.fgs | 19 + test/fgs-ref/prio34-4.fgs | 19 + test/fgs-ref/prio45-1.fgs | 20 + test/fgs-ref/prio45-2.fgs | 19 + test/fgs-ref/prio45-3.fgs | 20 + test/fgs-ref/prio45-4.fgs | 19 + test/fgs-ref/prio56-1.fgs | 26 + test/fgs-ref/prio56-2.fgs | 26 + test/fgs-ref/prio67-1.fgs | 30 + test/fgs-ref/prio67-2.fgs | 30 + test/fgs-ref/rec1.fgs | 74 ++ test/fgs-ref/si1.fgs | 16 + test/fgs-ref/si2.fgs | 19 + test/fgs-ref/si3.fgs | 21 + test/fgs-ref/si4.fgs | 21 + test/fgs-ref/si5.fgs | 33 + test/fgs-ref/sub1.fgs | 15 + test/fgs-ref/sub2.fgs | 15 + test/fgs-ref/sub3.fgs | 17 + test/fgs-ref/tab1.fgs | 26 + test/fgs-ref/tab2.fgs | 33 + test/fgs-ref/tab3.fgs | 36 + test/fgs-ref/tab4.fgs | 30 + test/fgs-ref/tantque1.fgs | 27 + test/fgs-ref/tantque2.fgs | 37 + test/fgs-ref/varglob1.fgs | 14 + test/fgs-ref/varglob2.fgs | 16 + test/fgs-ref/varglob3.fgs | 17 + test/fgs-ref/varglob4.fgs | 17 + test/fgs-ref/varloc1.fgs | 14 + test/fgs-ref/varloc2.fgs | 16 + test/fgs-ref/varloc3.fgs | 17 + test/fgs-ref/varloc4.fgs | 17 + test/fgs-ref/varloc5.fgs | 26 + test/ig-ref/add1.ig | 4 + test/ig-ref/add2.ig | 5 + test/ig-ref/affect1.ig | 3 + test/ig-ref/affect2.ig | 3 + test/ig-ref/affect3.ig | 4 + test/ig-ref/and1.ig | 6 + test/ig-ref/and2.ig | 6 + test/ig-ref/and3.ig | 6 + test/ig-ref/and4.ig | 6 + test/ig-ref/and5.ig | 8 + test/ig-ref/appel-param1.ig | 4 + test/ig-ref/appel-param2.ig | 5 + test/ig-ref/appel-param3.ig | 8 + test/ig-ref/appel-retour1.ig | 5 + test/ig-ref/appel1.ig | 4 + test/ig-ref/appel2.ig | 6 + test/ig-ref/appel3.ig | 6 + test/ig-ref/div1.ig | 7 + test/ig-ref/div2.ig | 7 + test/ig-ref/div3.ig | 11 + test/ig-ref/div4.ig | 7 + test/ig-ref/ecrire1.ig | 3 + test/ig-ref/ecrire2.ig | 3 + test/ig-ref/egal1.ig | 5 + test/ig-ref/egal2.ig | 5 + test/ig-ref/egal3.ig | 6 + test/ig-ref/err5.ig | 4 + test/ig-ref/fibo.ig | 35 + test/ig-ref/inf1.ig | 5 + test/ig-ref/inf2.ig | 5 + test/ig-ref/inf3.ig | 5 + test/ig-ref/inf4.ig | 6 + test/ig-ref/mult1.ig | 4 + test/ig-ref/mult2.ig | 4 + test/ig-ref/mult3.ig | 5 + test/ig-ref/not1.ig | 5 + test/ig-ref/not2.ig | 5 + test/ig-ref/not3.ig | 6 + test/ig-ref/or1.ig | 6 + test/ig-ref/or2.ig | 6 + test/ig-ref/or3.ig | 6 + test/ig-ref/or4.ig | 6 + test/ig-ref/or5.ig | 8 + test/ig-ref/parenth1.ig | 3 + test/ig-ref/parenth2.ig | 3 + test/ig-ref/prio23-1.ig | 6 + test/ig-ref/prio23-2.ig | 6 + test/ig-ref/prio23-3.ig | 9 + test/ig-ref/prio23-4.ig | 10 + test/ig-ref/prio34-1.ig | 5 + test/ig-ref/prio34-2.ig | 5 + test/ig-ref/prio34-3.ig | 8 + test/ig-ref/prio34-4.ig | 8 + test/ig-ref/prio45-1.ig | 6 + test/ig-ref/prio45-2.ig | 5 + test/ig-ref/prio45-3.ig | 6 + test/ig-ref/prio45-4.ig | 5 + test/ig-ref/prio56-1.ig | 7 + test/ig-ref/prio56-2.ig | 7 + test/ig-ref/prio67-1.ig | 8 + test/ig-ref/prio67-2.ig | 8 + test/ig-ref/rec1.ig | 33 + test/ig-ref/si1.ig | 4 + test/ig-ref/si2.ig | 5 + test/ig-ref/si3.ig | 6 + test/ig-ref/si4.ig | 6 + test/ig-ref/si5.ig | 16 + test/ig-ref/sub1.ig | 4 + test/ig-ref/sub2.ig | 4 + test/ig-ref/sub3.ig | 5 + test/ig-ref/tab1.ig | 11 + test/ig-ref/tab2.ig | 14 + test/ig-ref/tab3.ig | 14 + test/ig-ref/tab4.ig | 14 + test/ig-ref/tantque1.ig | 7 + test/ig-ref/tantque2.ig | 8 + test/ig-ref/varglob1.ig | 3 + test/ig-ref/varglob2.ig | 4 + test/ig-ref/varglob3.ig | 4 + test/ig-ref/varglob4.ig | 4 + test/ig-ref/varloc1.ig | 3 + test/ig-ref/varloc2.ig | 4 + test/ig-ref/varloc3.ig | 4 + test/ig-ref/varloc4.ig | 4 + test/ig-ref/varloc5.ig | 5 + test/input/.gitignore | 17 + test/input/add1.l | 4 + test/input/add1.s | 20 + test/input/add2.l | 4 + test/input/add2.s | 21 + test/input/affect1.l | 6 + test/input/affect1.s | 22 + test/input/affect2.l | 6 + test/input/affect2.s | 19 + test/input/affect3.l | 11 + test/input/and1.l | 4 + test/input/and2.l | 4 + test/input/and3.l | 4 + test/input/and4.l | 4 + test/input/and5.l | 4 + test/input/appel-param1.l | 9 + test/input/appel-param2.l | 10 + test/input/appel-param3.l | 13 + test/input/appel-retour1.l | 9 + test/input/appel1.l | 9 + test/input/appel2.l | 15 + test/input/appel3.l | 15 + test/input/clean | 14 + test/input/div1.l | 4 + test/input/div2.l | 4 + test/input/div3.l | 4 + test/input/div4.l | 4 + test/input/ecrire1.l | 4 + test/input/ecrire2.l | 4 + test/input/egal1.l | 4 + test/input/egal2.l | 4 + test/input/egal3.l | 4 + test/input/fibo.l | 14 + test/input/inf1.l | 4 + test/input/inf2.l | 4 + test/input/inf3.l | 4 + test/input/mult1.l | 4 + test/input/mult2.l | 4 + test/input/mult3.l | 4 + test/input/nettoie.sh | 16 + test/input/not1.l | 4 + test/input/not2.l | 4 + test/input/not3.l | 4 + test/input/or1.l | 4 + test/input/or2.l | 4 + test/input/or3.l | 4 + test/input/or4.l | 4 + test/input/or5.l | 4 + test/input/parenth1.l | 4 + test/input/parenth2.l | 4 + test/input/prio34-1.l | 4 + test/input/prio34-2.l | 4 + test/input/prio34-3.l | 4 + test/input/prio34-4.l | 4 + test/input/prio45-1.l | 4 + test/input/prio45-2.l | 4 + test/input/prio45-3.l | 4 + test/input/prio45-4.l | 4 + test/input/prio56-1.l | 4 + test/input/prio56-2.l | 4 + test/input/prio67-1.l | 4 + test/input/prio67-2.l | 4 + test/input/rec1.l | 14 + test/input/si1.l | 6 + test/input/si2.l | 9 + test/input/si3.l | 10 + test/input/si4.l | 10 + test/input/si5.l | 13 + test/input/sub1.l | 4 + test/input/sub2.l | 4 + test/input/sub3.l | 4 + test/input/tab1.l | 10 + test/input/tab2.l | 12 + test/input/tab3.l | 15 + test/input/tab4.l | 10 + test/input/tantque1.l | 10 + test/input/tantque2.l | 14 + test/input/tri.l | 57 ++ test/input/varglob1.l | 6 + test/input/varglob2.l | 6 + test/input/varglob3.l | 8 + test/input/varglob4.l | 7 + test/input/varloc1.l | 6 + test/input/varloc2.l | 6 + test/input/varloc3.l | 8 + test/input/varloc4.l | 7 + test/input/varloc5.l | 15 + test/input_err_ts/double_dec1.l | 4 + test/input_err_ts/double_dec2.l | 4 + test/input_err_ts/double_dec3.l | 7 + test/input_err_ts/double_dec4.l | 10 + test/input_err_ts/fct_inconnue1.l | 3 + test/input_err_ts/mauvais_nb_arg1.l | 7 + test/input_err_ts/var_inconnue1.l | 3 + test/input_err_type/add1.l | 4 + test/input_err_type/add2.l | 4 + test/input_err_type/add3.l | 4 + test/input_err_type/add4.l | 4 + test/input_err_type/affect1.l | 5 + test/input_err_type/affect2.l | 5 + test/input_err_type/affect3.l | 5 + test/input_err_type/affect4.l | 5 + test/input_err_type/and1.l | 4 + test/input_err_type/and2.l | 4 + test/input_err_type/and3.l | 4 + test/input_err_type/and4.l | 4 + test/input_err_type/appel1.l | 8 + test/input_err_type/appel2.l | 8 + test/input_err_type/appel3.l | 8 + test/input_err_type/appel4.l | 8 + test/input_err_type/div1.l | 4 + test/input_err_type/div2.l | 4 + test/input_err_type/div3.l | 4 + test/input_err_type/div4.l | 4 + test/input_err_type/egal1.l | 4 + test/input_err_type/egal2.l | 4 + test/input_err_type/egal3.l | 4 + test/input_err_type/egal3.nasm | 35 + test/input_err_type/inf1.l | 4 + test/input_err_type/inf2.l | 4 + test/input_err_type/inf3.l | 4 + test/input_err_type/inf3.nasm | 35 + test/input_err_type/inf4.l | 4 + test/input_err_type/mult1.l | 4 + test/input_err_type/mult2.l | 4 + test/input_err_type/mult3.l | 4 + test/input_err_type/mult4.l | 4 + test/input_err_type/not1.l | 4 + test/input_err_type/or1.l | 4 + test/input_err_type/or2.l | 4 + test/input_err_type/or3.l | 4 + test/input_err_type/or4.l | 4 + test/input_err_type/retour1.l | 9 + test/input_err_type/retour2.l | 9 + test/input_err_type/retour3.l | 9 + test/input_err_type/si1.l | 5 + test/input_err_type/sub1.l | 4 + test/input_err_type/sub2.l | 4 + test/input_err_type/sub3.l | 4 + test/input_err_type/sub4.l | 4 + test/input_err_type/tantque1.l | 5 + test/io.asm | 205 ++++ test/nasm-ref/add1.nasm | 32 + test/nasm-ref/add2.nasm | 34 + test/nasm-ref/affect1.nasm | 32 + test/nasm-ref/affect2.nasm | 31 + test/nasm-ref/affect3.nasm | 50 + test/nasm-ref/and1.nasm | 39 + test/nasm-ref/and2.nasm | 39 + test/nasm-ref/and3.nasm | 39 + test/nasm-ref/and4.nasm | 39 + test/nasm-ref/and5.nasm | 47 + test/nasm-ref/appel-param1.nasm | 49 + test/nasm-ref/appel-param2.nasm | 52 + test/nasm-ref/appel-param3.nasm | 61 ++ test/nasm-ref/appel-retour1.nasm | 58 ++ test/nasm-ref/appel1.nasm | 47 + test/nasm-ref/appel2.nasm | 66 ++ test/nasm-ref/appel3.nasm | 66 ++ test/nasm-ref/div1.nasm | 36 + test/nasm-ref/div2.nasm | 36 + test/nasm-ref/div3.nasm | 42 + test/nasm-ref/div4.nasm | 36 + test/nasm-ref/ecrire1.nasm | 30 + test/nasm-ref/ecrire2.nasm | 30 + test/nasm-ref/egal1.nasm | 35 + test/nasm-ref/egal2.nasm | 35 + test/nasm-ref/egal3.nasm | 39 + test/nasm-ref/fibo.nasm | 88 ++ test/nasm-ref/inf1.nasm | 35 + test/nasm-ref/inf2.nasm | 35 + test/nasm-ref/inf3.nasm | 35 + test/nasm-ref/inf4.nasm | 39 + test/nasm-ref/mult1.nasm | 32 + test/nasm-ref/mult2.nasm | 32 + test/nasm-ref/mult3.nasm | 34 + test/nasm-ref/not1.nasm | 35 + test/nasm-ref/not2.nasm | 35 + test/nasm-ref/not3.nasm | 39 + test/nasm-ref/or1.nasm | 39 + test/nasm-ref/or2.nasm | 39 + test/nasm-ref/or3.nasm | 39 + test/nasm-ref/or4.nasm | 39 + test/nasm-ref/or5.nasm | 47 + test/nasm-ref/parenth1.nasm | 30 + test/nasm-ref/parenth2.nasm | 30 + test/nasm-ref/prio23-1.nasm | 37 + test/nasm-ref/prio23-2.nasm | 37 + test/nasm-ref/prio23-3.nasm | 41 + test/nasm-ref/prio23-4.nasm | 45 + test/nasm-ref/prio34-1.nasm | 34 + test/nasm-ref/prio34-2.nasm | 34 + test/nasm-ref/prio34-3.nasm | 38 + test/nasm-ref/prio34-4.nasm | 38 + test/nasm-ref/prio45-1.nasm | 37 + test/nasm-ref/prio45-2.nasm | 36 + test/nasm-ref/prio45-3.nasm | 37 + test/nasm-ref/prio45-4.nasm | 36 + test/nasm-ref/prio56-1.nasm | 43 + test/nasm-ref/prio56-2.nasm | 43 + test/nasm-ref/prio67-1.nasm | 47 + test/nasm-ref/prio67-2.nasm | 47 + test/nasm-ref/rec1.nasm | 81 ++ test/nasm-ref/si1.nasm | 33 + test/nasm-ref/si2.nasm | 36 + test/nasm-ref/si3.nasm | 38 + test/nasm-ref/si4.nasm | 38 + test/nasm-ref/si5.nasm | 40 + test/nasm-ref/sub1.nasm | 32 + test/nasm-ref/sub2.nasm | 32 + test/nasm-ref/sub3.nasm | 34 + test/nasm-ref/tab1.nasm | 50 + test/nasm-ref/tab2.nasm | 57 ++ test/nasm-ref/tab3.nasm | 60 ++ test/nasm-ref/tab4.nasm | 56 ++ test/nasm-ref/tantque1.nasm | 44 + test/nasm-ref/tantque2.nasm | 54 ++ test/nasm-ref/tri.nasm | 214 +++++ test/nasm-ref/varglob1.nasm | 32 + test/nasm-ref/varglob2.nasm | 34 + test/nasm-ref/varglob3.nasm | 36 + test/nasm-ref/varglob4.nasm | 36 + test/nasm-ref/varloc1.nasm | 31 + test/nasm-ref/varloc2.nasm | 33 + test/nasm-ref/varloc3.nasm | 34 + test/nasm-ref/varloc4.nasm | 34 + test/nasm-ref/varloc5.nasm | 52 + test/out-ref/add1.out | 1 + test/out-ref/add2.out | 1 + test/out-ref/affect1.out | 1 + test/out-ref/affect2.out | 1 + test/out-ref/affect3.out | 1 + test/out-ref/and1.out | 1 + test/out-ref/and2.out | 1 + test/out-ref/and3.out | 1 + test/out-ref/and4.out | 1 + test/out-ref/and5.out | 1 + test/out-ref/appel-param1.out | 1 + test/out-ref/appel-param2.out | 2 + test/out-ref/appel-param3.out | 5 + test/out-ref/appel-retour1.out | 1 + test/out-ref/appel1.out | 1 + test/out-ref/appel2.out | 2 + test/out-ref/appel3.out | 2 + test/out-ref/div1.out | 1 + test/out-ref/div2.out | 1 + test/out-ref/div3.out | 1 + test/out-ref/div4.out | 1 + test/out-ref/ecrire1.out | 1 + test/out-ref/ecrire2.out | 1 + test/out-ref/egal1.out | 1 + test/out-ref/egal2.out | 1 + test/out-ref/egal3.out | 1 + test/out-ref/err5.out | 1 + test/out-ref/fibo.out | 1 + test/out-ref/inf1.out | 1 + test/out-ref/inf2.out | 1 + test/out-ref/inf3.out | 1 + test/out-ref/inf4.out | 1 + test/out-ref/mult1.out | 1 + test/out-ref/mult2.out | 1 + test/out-ref/mult3.out | 1 + test/out-ref/not1.out | 1 + test/out-ref/not2.out | 1 + test/out-ref/not3.out | 1 + test/out-ref/or1.out | 1 + test/out-ref/or2.out | 1 + test/out-ref/or3.out | 1 + test/out-ref/or4.out | 1 + test/out-ref/or5.out | 1 + test/out-ref/parenth1.out | 1 + test/out-ref/parenth2.out | 1 + test/out-ref/prio23-1.out | 1 + test/out-ref/prio23-2.out | 1 + test/out-ref/prio23-3.out | 1 + test/out-ref/prio23-4.out | 1 + test/out-ref/prio34-1.out | 1 + test/out-ref/prio34-2.out | 1 + test/out-ref/prio34-3.out | 1 + test/out-ref/prio34-4.out | 1 + test/out-ref/prio45-1.out | 1 + test/out-ref/prio45-2.out | 1 + test/out-ref/prio45-3.out | 1 + test/out-ref/prio45-4.out | 1 + test/out-ref/prio56-1.out | 1 + test/out-ref/prio56-2.out | 1 + test/out-ref/prio67-1.out | 1 + test/out-ref/prio67-2.out | 1 + test/out-ref/rec1.out | 1 + test/out-ref/si1.out | 1 + test/out-ref/si2.out | 1 + test/out-ref/si3.out | 2 + test/out-ref/si4.out | 2 + test/out-ref/si5.out | 3 + test/out-ref/sub1.out | 1 + test/out-ref/sub2.out | 1 + test/out-ref/sub3.out | 1 + test/out-ref/tab1.out | 3 + test/out-ref/tab2.out | 3 + test/out-ref/tab3.out | 3 + test/out-ref/tab4.out | 3 + test/out-ref/tantque1.out | 11 + test/out-ref/tantque2.out | 32 + test/out-ref/tri.out | 22 + test/out-ref/varglob1.out | 1 + test/out-ref/varglob2.out | 1 + test/out-ref/varglob3.out | 2 + test/out-ref/varglob4.out | 1 + test/out-ref/varloc1.out | 1 + test/out-ref/varloc2.out | 1 + test/out-ref/varloc3.out | 2 + test/out-ref/varloc4.out | 1 + test/out-ref/varloc5.out | 2 + test/pre-nasm-ref/add1.pre-nasm | 32 + test/pre-nasm-ref/add2.pre-nasm | 34 + test/pre-nasm-ref/affect1.pre-nasm | 32 + test/pre-nasm-ref/affect2.pre-nasm | 31 + test/pre-nasm-ref/affect3.pre-nasm | 50 + test/pre-nasm-ref/and1.pre-nasm | 39 + test/pre-nasm-ref/and2.pre-nasm | 39 + test/pre-nasm-ref/and3.pre-nasm | 39 + test/pre-nasm-ref/and4.pre-nasm | 39 + test/pre-nasm-ref/and5.pre-nasm | 47 + test/pre-nasm-ref/appel-param1.pre-nasm | 49 + test/pre-nasm-ref/appel-param2.pre-nasm | 52 + test/pre-nasm-ref/appel-param3.pre-nasm | 61 ++ test/pre-nasm-ref/appel-retour1.pre-nasm | 58 ++ test/pre-nasm-ref/appel1.pre-nasm | 47 + test/pre-nasm-ref/appel2.pre-nasm | 66 ++ test/pre-nasm-ref/appel3.pre-nasm | 66 ++ test/pre-nasm-ref/div1.pre-nasm | 36 + test/pre-nasm-ref/div2.pre-nasm | 36 + test/pre-nasm-ref/div3.pre-nasm | 42 + test/pre-nasm-ref/div4.pre-nasm | 36 + test/pre-nasm-ref/ecrire1.pre-nasm | 30 + test/pre-nasm-ref/ecrire2.pre-nasm | 30 + test/pre-nasm-ref/egal1.pre-nasm | 35 + test/pre-nasm-ref/egal2.pre-nasm | 35 + test/pre-nasm-ref/egal3.pre-nasm | 39 + test/pre-nasm-ref/fibo.pre-nasm | 88 ++ test/pre-nasm-ref/inf1.pre-nasm | 35 + test/pre-nasm-ref/inf2.pre-nasm | 35 + test/pre-nasm-ref/inf3.pre-nasm | 35 + test/pre-nasm-ref/inf4.pre-nasm | 39 + test/pre-nasm-ref/mult1.pre-nasm | 32 + test/pre-nasm-ref/mult2.pre-nasm | 32 + test/pre-nasm-ref/mult3.pre-nasm | 34 + test/pre-nasm-ref/not1.pre-nasm | 35 + test/pre-nasm-ref/not2.pre-nasm | 35 + test/pre-nasm-ref/not3.pre-nasm | 39 + test/pre-nasm-ref/or1.pre-nasm | 39 + test/pre-nasm-ref/or2.pre-nasm | 39 + test/pre-nasm-ref/or3.pre-nasm | 39 + test/pre-nasm-ref/or4.pre-nasm | 39 + test/pre-nasm-ref/or5.pre-nasm | 47 + test/pre-nasm-ref/parenth1.pre-nasm | 30 + test/pre-nasm-ref/parenth2.pre-nasm | 30 + test/pre-nasm-ref/prio23-1.pre-nasm | 37 + test/pre-nasm-ref/prio23-2.pre-nasm | 37 + test/pre-nasm-ref/prio23-3.pre-nasm | 41 + test/pre-nasm-ref/prio23-4.pre-nasm | 45 + test/pre-nasm-ref/prio34-1.pre-nasm | 34 + test/pre-nasm-ref/prio34-2.pre-nasm | 34 + test/pre-nasm-ref/prio34-3.pre-nasm | 38 + test/pre-nasm-ref/prio34-4.pre-nasm | 38 + test/pre-nasm-ref/prio45-1.pre-nasm | 37 + test/pre-nasm-ref/prio45-2.pre-nasm | 36 + test/pre-nasm-ref/prio45-3.pre-nasm | 37 + test/pre-nasm-ref/prio45-4.pre-nasm | 36 + test/pre-nasm-ref/prio56-1.pre-nasm | 43 + test/pre-nasm-ref/prio56-2.pre-nasm | 43 + test/pre-nasm-ref/prio67-1.pre-nasm | 47 + test/pre-nasm-ref/prio67-2.pre-nasm | 47 + test/pre-nasm-ref/rec1.pre-nasm | 81 ++ test/pre-nasm-ref/si1.pre-nasm | 33 + test/pre-nasm-ref/si2.pre-nasm | 36 + test/pre-nasm-ref/si3.pre-nasm | 38 + test/pre-nasm-ref/si4.pre-nasm | 38 + test/pre-nasm-ref/si5.pre-nasm | 40 + test/pre-nasm-ref/sub1.pre-nasm | 32 + test/pre-nasm-ref/sub2.pre-nasm | 32 + test/pre-nasm-ref/sub3.pre-nasm | 34 + test/pre-nasm-ref/tab1.pre-nasm | 50 + test/pre-nasm-ref/tab2.pre-nasm | 57 ++ test/pre-nasm-ref/tab3.pre-nasm | 60 ++ test/pre-nasm-ref/tab4.pre-nasm | 56 ++ test/pre-nasm-ref/tantque1.pre-nasm | 44 + test/pre-nasm-ref/tantque2.pre-nasm | 54 ++ test/pre-nasm-ref/tri.pre-nasm | 214 +++++ test/pre-nasm-ref/varglob1.pre-nasm | 32 + test/pre-nasm-ref/varglob2.pre-nasm | 34 + test/pre-nasm-ref/varglob3.pre-nasm | 36 + test/pre-nasm-ref/varglob4.pre-nasm | 36 + test/pre-nasm-ref/varloc1.pre-nasm | 31 + test/pre-nasm-ref/varloc2.pre-nasm | 33 + test/pre-nasm-ref/varloc3.pre-nasm | 34 + test/pre-nasm-ref/varloc4.pre-nasm | 34 + test/pre-nasm-ref/varloc5.pre-nasm | 52 + test/sa-ref/add1.sa | 1 + test/sa-ref/add2.sa | 1 + test/sa-ref/affect1.sa | 1 + test/sa-ref/affect2.sa | 1 + test/sa-ref/affect3.sa | 1 + test/sa-ref/and1.sa | 1 + test/sa-ref/and2.sa | 1 + test/sa-ref/and3.sa | 1 + test/sa-ref/and4.sa | 1 + test/sa-ref/and5.sa | 1 + test/sa-ref/appel-param1.sa | 1 + test/sa-ref/appel-param2.sa | 1 + test/sa-ref/appel-param3.sa | 1 + test/sa-ref/appel-retour1.sa | 1 + test/sa-ref/appel1.sa | 1 + test/sa-ref/appel2.sa | 1 + test/sa-ref/appel3.sa | 1 + test/sa-ref/div1.sa | 1 + test/sa-ref/div2.sa | 1 + test/sa-ref/div3.sa | 1 + test/sa-ref/div4.sa | 1 + test/sa-ref/ecrire1.sa | 1 + test/sa-ref/ecrire2.sa | 1 + test/sa-ref/egal1.sa | 1 + test/sa-ref/egal2.sa | 1 + test/sa-ref/egal3.sa | 1 + test/sa-ref/err1.sa | 18 + test/sa-ref/err2.sa | 13 + test/sa-ref/err3.sa | 23 + test/sa-ref/err4.sa | 33 + test/sa-ref/err5.sa | 39 + test/sa-ref/fibo.sa | 1 + test/sa-ref/inf1.sa | 1 + test/sa-ref/inf2.sa | 1 + test/sa-ref/inf3.sa | 1 + test/sa-ref/inf4.sa | 19 + test/sa-ref/mult1.sa | 1 + test/sa-ref/mult2.sa | 1 + test/sa-ref/mult3.sa | 1 + test/sa-ref/not1.sa | 1 + test/sa-ref/not2.sa | 1 + test/sa-ref/not3.sa | 1 + test/sa-ref/or1.sa | 1 + test/sa-ref/or2.sa | 1 + test/sa-ref/or3.sa | 1 + test/sa-ref/or4.sa | 1 + test/sa-ref/or5.sa | 1 + test/sa-ref/parenth1.sa | 1 + test/sa-ref/parenth2.sa | 1 + test/sa-ref/prio23-1.sa | 18 + test/sa-ref/prio23-2.sa | 18 + test/sa-ref/prio23-3.sa | 18 + test/sa-ref/prio23-4.sa | 20 + test/sa-ref/prio34-1.sa | 1 + test/sa-ref/prio34-2.sa | 1 + test/sa-ref/prio34-3.sa | 1 + test/sa-ref/prio34-4.sa | 1 + test/sa-ref/prio45-1.sa | 1 + test/sa-ref/prio45-2.sa | 1 + test/sa-ref/prio45-3.sa | 1 + test/sa-ref/prio45-4.sa | 1 + test/sa-ref/prio56-1.sa | 1 + test/sa-ref/prio56-2.sa | 1 + test/sa-ref/prio67-1.sa | 1 + test/sa-ref/prio67-2.sa | 1 + test/sa-ref/rec1.sa | 1 + test/sa-ref/si1.sa | 1 + test/sa-ref/si2.sa | 1 + test/sa-ref/si3.sa | 1 + test/sa-ref/si4.sa | 1 + test/sa-ref/si5.sa | 1 + test/sa-ref/sub1.sa | 1 + test/sa-ref/sub2.sa | 1 + test/sa-ref/sub3.sa | 1 + test/sa-ref/tab1.sa | 1 + test/sa-ref/tab2.sa | 1 + test/sa-ref/tab3.sa | 1 + test/sa-ref/tab4.sa | 1 + test/sa-ref/tantque1.sa | 1 + test/sa-ref/tantque2.sa | 1 + test/sa-ref/tri.sa | 1 + test/sa-ref/varglob1.sa | 1 + test/sa-ref/varglob2.sa | 1 + test/sa-ref/varglob3.sa | 1 + test/sa-ref/varglob4.sa | 1 + test/sa-ref/varloc1.sa | 1 + test/sa-ref/varloc2.sa | 1 + test/sa-ref/varloc3.sa | 1 + test/sa-ref/varloc4.sa | 1 + test/sa-ref/varloc5.sa | 1 + test/sc-ref/add1.sc | 44 + test/sc-ref/add2.sc | 52 + test/sc-ref/affect1.sc | 66 ++ test/sc-ref/affect2.sc | 66 ++ test/sc-ref/affect3.sc | 106 ++ test/sc-ref/and1.sc | 48 + test/sc-ref/and2.sc | 48 + test/sc-ref/and3.sc | 48 + test/sc-ref/and4.sc | 48 + test/sc-ref/and5.sc | 60 ++ test/sc-ref/appel-param1.sc | 78 ++ test/sc-ref/appel-param2.sc | 120 +++ test/sc-ref/appel-param3.sc | 246 +++++ test/sc-ref/appel-retour1.sc | 106 ++ test/sc-ref/appel1.sc | 56 ++ test/sc-ref/appel2.sc | 96 ++ test/sc-ref/appel3.sc | 96 ++ test/sc-ref/div1.sc | 42 + test/sc-ref/div2.sc | 42 + test/sc-ref/div3.sc | 48 + test/sc-ref/div4.sc | 42 + test/sc-ref/ecrire1.sc | 36 + test/sc-ref/ecrire2.sc | 36 + test/sc-ref/egal1.sc | 46 + test/sc-ref/egal2.sc | 46 + test/sc-ref/egal3.sc | 56 ++ test/sc-ref/err1.sc | 38 + test/sc-ref/err2.sc | 26 + test/sc-ref/err3.sc | 40 + test/sc-ref/err4.sc | 62 ++ test/sc-ref/err5.sc | 78 ++ test/sc-ref/fibo.sc | 248 +++++ test/sc-ref/inf1.sc | 46 + test/sc-ref/inf2.sc | 46 + test/sc-ref/inf3.sc | 46 + test/sc-ref/inf4.sc | 56 ++ test/sc-ref/modulo1.sc | 42 + test/sc-ref/mult1.sc | 42 + test/sc-ref/mult2.sc | 42 + test/sc-ref/mult3.sc | 48 + test/sc-ref/not1.sc | 38 + test/sc-ref/not2.sc | 38 + test/sc-ref/not3.sc | 40 + test/sc-ref/or1.sc | 50 + test/sc-ref/or2.sc | 50 + test/sc-ref/or3.sc | 50 + test/sc-ref/or4.sc | 50 + test/sc-ref/or5.sc | 64 ++ test/sc-ref/parenth1.sc | 50 + test/sc-ref/parenth2.sc | 64 ++ test/sc-ref/prio23-1.sc | 44 + test/sc-ref/prio23-2.sc | 44 + test/sc-ref/prio23-3.sc | 44 + test/sc-ref/prio23-4.sc | 46 + test/sc-ref/prio34-1.sc | 50 + test/sc-ref/prio34-2.sc | 50 + test/sc-ref/prio34-3.sc | 50 + test/sc-ref/prio34-4.sc | 50 + test/sc-ref/prio45-1.sc | 54 ++ test/sc-ref/prio45-2.sc | 54 ++ test/sc-ref/prio45-3.sc | 54 ++ test/sc-ref/prio45-4.sc | 54 ++ test/sc-ref/prio56-1.sc | 58 ++ test/sc-ref/prio56-2.sc | 58 ++ test/sc-ref/prio67-1.sc | 62 ++ test/sc-ref/prio67-2.sc | 62 ++ test/sc-ref/rec1.sc | 258 +++++ test/sc-ref/si1.sc | 74 ++ test/sc-ref/si2.sc | 100 ++ test/sc-ref/si3.sc | 120 +++ test/sc-ref/si4.sc | 120 +++ test/sc-ref/si5.sc | 152 +++ test/sc-ref/sub1.sc | 44 + test/sc-ref/sub2.sc | 44 + test/sc-ref/sub3.sc | 52 + test/sc-ref/tab1.sc | 238 +++++ test/sc-ref/tab2.sc | 296 ++++++ test/sc-ref/tab3.sc | 372 +++++++ test/sc-ref/tab4.sc | 278 ++++++ test/sc-ref/tantque1.sc | 168 ++++ test/sc-ref/tantque2.sc | 278 ++++++ test/sc-ref/varglob1.sc | 66 ++ test/sc-ref/varglob2.sc | 74 ++ test/sc-ref/varglob3.sc | 114 +++ test/sc-ref/varglob4.sc | 102 ++ test/sc-ref/varloc1.sc | 66 ++ test/sc-ref/varloc2.sc | 74 ++ test/sc-ref/varloc3.sc | 114 +++ test/sc-ref/varloc4.sc | 102 ++ test/sc-ref/varloc5.sc | 136 +++ test/ts-ref/add1.ts | 3 + test/ts-ref/add2.ts | 3 + test/ts-ref/affect1.ts | 4 + test/ts-ref/affect2.ts | 4 + test/ts-ref/affect3.ts | 7 + test/ts-ref/and1.ts | 3 + test/ts-ref/and2.ts | 3 + test/ts-ref/and3.ts | 3 + test/ts-ref/and4.ts | 3 + test/ts-ref/and5.ts | 3 + test/ts-ref/appel-param1.ts | 6 + test/ts-ref/appel-param2.ts | 7 + test/ts-ref/appel-param3.ts | 10 + test/ts-ref/appel-retour1.ts | 6 + test/ts-ref/appel1.ts | 5 + test/ts-ref/appel2.ts | 7 + test/ts-ref/appel3.ts | 7 + test/ts-ref/div1.ts | 3 + test/ts-ref/div2.ts | 3 + test/ts-ref/div3.ts | 3 + test/ts-ref/div4.ts | 3 + test/ts-ref/ecrire1.ts | 3 + test/ts-ref/ecrire2.ts | 3 + test/ts-ref/egal1.ts | 3 + test/ts-ref/egal2.ts | 3 + test/ts-ref/egal3.ts | 3 + test/ts-ref/err5.ts | 6 + test/ts-ref/fibo.ts | 6 + test/ts-ref/inf1.ts | 3 + test/ts-ref/inf2.ts | 3 + test/ts-ref/inf3.ts | 3 + test/ts-ref/inf4.ts | 3 + test/ts-ref/modulo1.ts | 3 + test/ts-ref/mult1.ts | 3 + test/ts-ref/mult2.ts | 3 + test/ts-ref/mult3.ts | 3 + test/ts-ref/not1.ts | 3 + test/ts-ref/not2.ts | 3 + test/ts-ref/not3.ts | 3 + test/ts-ref/or1.ts | 3 + test/ts-ref/or2.ts | 3 + test/ts-ref/or3.ts | 3 + test/ts-ref/or4.ts | 3 + test/ts-ref/or5.ts | 3 + test/ts-ref/parenth1.ts | 3 + test/ts-ref/parenth2.ts | 3 + test/ts-ref/prio23-1.ts | 3 + test/ts-ref/prio23-2.ts | 3 + test/ts-ref/prio23-3.ts | 3 + test/ts-ref/prio23-4.ts | 3 + test/ts-ref/prio34-1.ts | 3 + test/ts-ref/prio34-2.ts | 3 + test/ts-ref/prio34-3.ts | 3 + test/ts-ref/prio34-4.ts | 3 + test/ts-ref/prio45-1.ts | 3 + test/ts-ref/prio45-2.ts | 3 + test/ts-ref/prio45-3.ts | 3 + test/ts-ref/prio45-4.ts | 3 + test/ts-ref/prio56-1.ts | 3 + test/ts-ref/prio56-2.ts | 3 + test/ts-ref/prio67-1.ts | 3 + test/ts-ref/prio67-2.ts | 3 + test/ts-ref/rec1.ts | 6 + test/ts-ref/si1.ts | 3 + test/ts-ref/si2.ts | 3 + test/ts-ref/si3.ts | 3 + test/ts-ref/si4.ts | 3 + test/ts-ref/si5.ts | 3 + test/ts-ref/sub1.ts | 3 + test/ts-ref/sub2.ts | 3 + test/ts-ref/sub3.ts | 3 + test/ts-ref/tab1.ts | 4 + test/ts-ref/tab2.ts | 5 + test/ts-ref/tab3.ts | 6 + test/ts-ref/tab4.ts | 4 + test/ts-ref/tantque1.ts | 4 + test/ts-ref/tantque2.ts | 5 + test/ts-ref/tri.ts | 21 + test/ts-ref/varglob1.ts | 4 + test/ts-ref/varglob2.ts | 4 + test/ts-ref/varglob3.ts | 5 + test/ts-ref/varglob4.ts | 5 + test/ts-ref/varloc1.ts | 4 + test/ts-ref/varloc2.ts | 4 + test/ts-ref/varloc3.ts | 5 + test/ts-ref/varloc4.ts | 5 + test/ts-ref/varloc5.ts | 7 + 1163 files changed, 31448 insertions(+) create mode 100644 sablecc/sablecc.jar create mode 100644 sablecc/sablecc_thesis.pdf create mode 100644 src/.gitignore create mode 100644 src/C3aVM.java create mode 100644 src/Compiler.java create mode 100644 src/Makefile create mode 100644 src/NasmVM.java create mode 100644 src/SaVM.java create mode 100644 src/c3a.cfg create mode 100644 src/c3a/C3a.java create mode 100644 src/c3a/C3aBooleanConstant.java create mode 100644 src/c3a/C3aConstant.java create mode 100644 src/c3a/C3aEval.java create mode 100644 src/c3a/C3aFunction.java create mode 100644 src/c3a/C3aInst.java create mode 100644 src/c3a/C3aInstAdd.java create mode 100644 src/c3a/C3aInstAffect.java create mode 100644 src/c3a/C3aInstCall.java create mode 100644 src/c3a/C3aInstDiv.java create mode 100644 src/c3a/C3aInstFBegin.java create mode 100644 src/c3a/C3aInstFEnd.java create mode 100644 src/c3a/C3aInstJump.java create mode 100644 src/c3a/C3aInstJumpIfEqual.java create mode 100644 src/c3a/C3aInstJumpIfLess.java create mode 100644 src/c3a/C3aInstJumpIfNotEqual.java create mode 100644 src/c3a/C3aInstMult.java create mode 100644 src/c3a/C3aInstParam.java create mode 100644 src/c3a/C3aInstRead.java create mode 100644 src/c3a/C3aInstReturn.java create mode 100644 src/c3a/C3aInstStop.java create mode 100644 src/c3a/C3aInstSub.java create mode 100644 src/c3a/C3aInstWrite.java create mode 100644 src/c3a/C3aLabel.java create mode 100644 src/c3a/C3aOp.java create mode 100644 src/c3a/C3aOperand.java create mode 100644 src/c3a/C3aTemp.java create mode 100644 src/c3a/C3aVar.java create mode 100644 src/c3a/C3aVisitor.java create mode 100644 src/c3a/LoadC3a.java create mode 100644 src/c3a/Sa2c3a.java create mode 100644 src/fg/Fg.java create mode 100644 src/fg/FgSolution.java create mode 100644 src/ig/Ig.java create mode 100644 src/l.cfg create mode 100644 src/nasm.cfg create mode 100644 src/nasm/C3a2nasm.java create mode 100644 src/nasm/LoadNasm.java create mode 100644 src/nasm/Nasm.java create mode 100644 src/nasm/NasmAdd.java create mode 100644 src/nasm/NasmAddress.java create mode 100644 src/nasm/NasmAnd.java create mode 100644 src/nasm/NasmCall.java create mode 100644 src/nasm/NasmCmp.java create mode 100644 src/nasm/NasmConstant.java create mode 100644 src/nasm/NasmDiv.java create mode 100644 src/nasm/NasmEmpty.java create mode 100644 src/nasm/NasmEval.java create mode 100644 src/nasm/NasmExp.java create mode 100644 src/nasm/NasmExpMinus.java create mode 100644 src/nasm/NasmExpPlus.java create mode 100644 src/nasm/NasmExpTimes.java create mode 100644 src/nasm/NasmInst.java create mode 100644 src/nasm/NasmInt.java create mode 100644 src/nasm/NasmJe.java create mode 100644 src/nasm/NasmJg.java create mode 100644 src/nasm/NasmJge.java create mode 100644 src/nasm/NasmJl.java create mode 100644 src/nasm/NasmJle.java create mode 100644 src/nasm/NasmJmp.java create mode 100644 src/nasm/NasmJne.java create mode 100644 src/nasm/NasmLabel.java create mode 100644 src/nasm/NasmMov.java create mode 100644 src/nasm/NasmMul.java create mode 100644 src/nasm/NasmNot.java create mode 100644 src/nasm/NasmOperand.java create mode 100644 src/nasm/NasmOr.java create mode 100644 src/nasm/NasmPop.java create mode 100644 src/nasm/NasmPseudoInst.java create mode 100644 src/nasm/NasmPush.java create mode 100644 src/nasm/NasmRegister.java create mode 100644 src/nasm/NasmResb.java create mode 100644 src/nasm/NasmResd.java create mode 100644 src/nasm/NasmResq.java create mode 100644 src/nasm/NasmRest.java create mode 100644 src/nasm/NasmResw.java create mode 100644 src/nasm/NasmRet.java create mode 100644 src/nasm/NasmSize.java create mode 100644 src/nasm/NasmSub.java create mode 100644 src/nasm/NasmVisitor.java create mode 100644 src/nasm/NasmXor.java create mode 100644 src/sa.cfg create mode 100644 src/sa/ErrorException.java create mode 100644 src/sa/LoadSa.java create mode 100644 src/sa/SaAppel.java create mode 100644 src/sa/SaCheckLinkage.java create mode 100644 src/sa/SaDec.java create mode 100644 src/sa/SaDecFonc.java create mode 100644 src/sa/SaDecTab.java create mode 100644 src/sa/SaDecVar.java create mode 100644 src/sa/SaDecVarSimple.java create mode 100644 src/sa/SaDepthFirstVisitor.java create mode 100644 src/sa/SaEnvironment.java create mode 100644 src/sa/SaEval.java create mode 100644 src/sa/SaExp.java create mode 100644 src/sa/SaExpAdd.java create mode 100644 src/sa/SaExpAnd.java create mode 100644 src/sa/SaExpAppel.java create mode 100644 src/sa/SaExpDiv.java create mode 100644 src/sa/SaExpEqual.java create mode 100644 src/sa/SaExpFaux.java create mode 100644 src/sa/SaExpInf.java create mode 100644 src/sa/SaExpInt.java create mode 100644 src/sa/SaExpLire.java create mode 100644 src/sa/SaExpMult.java create mode 100644 src/sa/SaExpNot.java create mode 100644 src/sa/SaExpOr.java create mode 100644 src/sa/SaExpSub.java create mode 100644 src/sa/SaExpVar.java create mode 100644 src/sa/SaExpVrai.java create mode 100644 src/sa/SaInst.java create mode 100644 src/sa/SaInstAffect.java create mode 100644 src/sa/SaInstBloc.java create mode 100644 src/sa/SaInstEcriture.java create mode 100644 src/sa/SaInstRetour.java create mode 100644 src/sa/SaInstSi.java create mode 100644 src/sa/SaInstTantQue.java create mode 100644 src/sa/SaLDecFonc.java create mode 100644 src/sa/SaLDecVar.java create mode 100644 src/sa/SaLExp.java create mode 100644 src/sa/SaLInst.java create mode 100644 src/sa/SaNode.java create mode 100644 src/sa/SaProg.java create mode 100644 src/sa/SaTypeCheck.java create mode 100644 src/sa/SaVar.java create mode 100644 src/sa/SaVarIndicee.java create mode 100644 src/sa/SaVarSimple.java create mode 100644 src/sa/SaVisitor.java create mode 100644 src/sa/Sc2sa.java create mode 100644 src/sa/TypeVal.java create mode 100644 src/sc/Sc2Xml.java create mode 100644 src/ts/Sa2ts.java create mode 100644 src/ts/Ts.java create mode 100644 src/ts/TsItemFct.java create mode 100644 src/ts/TsItemVar.java create mode 100644 src/ts/TsItemVarSimple.java create mode 100644 src/ts/TsItemVarTab.java create mode 100644 src/ts/TsParser.java create mode 100644 src/util/Error.java create mode 100644 src/util/Memory.java create mode 100644 src/util/Type.java create mode 100644 src/util/graph/ColorGraph.java create mode 100644 src/util/graph/Graph.java create mode 100644 src/util/graph/Node.java create mode 100644 src/util/graph/NodeList.java create mode 100644 src/util/graph/TestColorGraph.java create mode 100644 src/util/intset/IntSet.java create mode 100644 test/c3a-ref/add1.c3a create mode 100644 test/c3a-ref/add2.c3a create mode 100644 test/c3a-ref/affect1.c3a create mode 100644 test/c3a-ref/affect2.c3a create mode 100644 test/c3a-ref/affect3.c3a create mode 100644 test/c3a-ref/and1.c3a create mode 100644 test/c3a-ref/and2.c3a create mode 100644 test/c3a-ref/and3.c3a create mode 100644 test/c3a-ref/and4.c3a create mode 100644 test/c3a-ref/and5.c3a create mode 100644 test/c3a-ref/appel-param1.c3a create mode 100644 test/c3a-ref/appel-param2.c3a create mode 100644 test/c3a-ref/appel-param3.c3a create mode 100644 test/c3a-ref/appel-retour1.c3a create mode 100644 test/c3a-ref/appel1.c3a create mode 100644 test/c3a-ref/appel2.c3a create mode 100644 test/c3a-ref/appel3.c3a create mode 100644 test/c3a-ref/div1.c3a create mode 100644 test/c3a-ref/div2.c3a create mode 100644 test/c3a-ref/div3.c3a create mode 100644 test/c3a-ref/div4.c3a create mode 100644 test/c3a-ref/ecrire1.c3a create mode 100644 test/c3a-ref/ecrire2.c3a create mode 100644 test/c3a-ref/egal1.c3a create mode 100644 test/c3a-ref/egal2.c3a create mode 100644 test/c3a-ref/egal3.c3a create mode 100644 test/c3a-ref/err5.c3a create mode 100644 test/c3a-ref/fibo.c3a create mode 100644 test/c3a-ref/inf1.c3a create mode 100644 test/c3a-ref/inf2.c3a create mode 100644 test/c3a-ref/inf3.c3a create mode 100644 test/c3a-ref/inf4.c3a create mode 100644 test/c3a-ref/mult1.c3a create mode 100644 test/c3a-ref/mult2.c3a create mode 100644 test/c3a-ref/mult3.c3a create mode 100644 test/c3a-ref/not1.c3a create mode 100644 test/c3a-ref/not2.c3a create mode 100644 test/c3a-ref/not3.c3a create mode 100644 test/c3a-ref/or1.c3a create mode 100644 test/c3a-ref/or2.c3a create mode 100644 test/c3a-ref/or3.c3a create mode 100644 test/c3a-ref/or4.c3a create mode 100644 test/c3a-ref/or5.c3a create mode 100644 test/c3a-ref/parenth1.c3a create mode 100644 test/c3a-ref/parenth2.c3a create mode 100644 test/c3a-ref/prio23-1.c3a create mode 100644 test/c3a-ref/prio23-2.c3a create mode 100644 test/c3a-ref/prio23-3.c3a create mode 100644 test/c3a-ref/prio23-4.c3a create mode 100644 test/c3a-ref/prio34-1.c3a create mode 100644 test/c3a-ref/prio34-2.c3a create mode 100644 test/c3a-ref/prio34-3.c3a create mode 100644 test/c3a-ref/prio34-4.c3a create mode 100644 test/c3a-ref/prio45-1.c3a create mode 100644 test/c3a-ref/prio45-2.c3a create mode 100644 test/c3a-ref/prio45-3.c3a create mode 100644 test/c3a-ref/prio45-4.c3a create mode 100644 test/c3a-ref/prio56-1.c3a create mode 100644 test/c3a-ref/prio56-2.c3a create mode 100644 test/c3a-ref/prio67-1.c3a create mode 100644 test/c3a-ref/prio67-2.c3a create mode 100644 test/c3a-ref/rec1.c3a create mode 100644 test/c3a-ref/si1.c3a create mode 100644 test/c3a-ref/si2.c3a create mode 100644 test/c3a-ref/si3.c3a create mode 100644 test/c3a-ref/si4.c3a create mode 100644 test/c3a-ref/si5.c3a create mode 100644 test/c3a-ref/sub1.c3a create mode 100644 test/c3a-ref/sub2.c3a create mode 100644 test/c3a-ref/sub3.c3a create mode 100644 test/c3a-ref/tab1.c3a create mode 100644 test/c3a-ref/tab2.c3a create mode 100644 test/c3a-ref/tab3.c3a create mode 100644 test/c3a-ref/tab4.c3a create mode 100644 test/c3a-ref/tantque1.c3a create mode 100644 test/c3a-ref/tantque2.c3a create mode 100644 test/c3a-ref/tri.c3a create mode 100644 test/c3a-ref/varglob1.c3a create mode 100644 test/c3a-ref/varglob2.c3a create mode 100644 test/c3a-ref/varglob3.c3a create mode 100644 test/c3a-ref/varglob4.c3a create mode 100644 test/c3a-ref/varloc1.c3a create mode 100644 test/c3a-ref/varloc2.c3a create mode 100644 test/c3a-ref/varloc3.c3a create mode 100644 test/c3a-ref/varloc4.c3a create mode 100644 test/c3a-ref/varloc5.c3a create mode 100755 test/evaluate.py create mode 100644 test/fg-ref/add1.fg create mode 100644 test/fg-ref/add2.fg create mode 100644 test/fg-ref/affect1.fg create mode 100644 test/fg-ref/affect2.fg create mode 100644 test/fg-ref/affect3.fg create mode 100644 test/fg-ref/and1.fg create mode 100644 test/fg-ref/and2.fg create mode 100644 test/fg-ref/and3.fg create mode 100644 test/fg-ref/and4.fg create mode 100644 test/fg-ref/and5.fg create mode 100644 test/fg-ref/appel-param1.fg create mode 100644 test/fg-ref/appel-param2.fg create mode 100644 test/fg-ref/appel-param3.fg create mode 100644 test/fg-ref/appel-retour1.fg create mode 100644 test/fg-ref/appel1.fg create mode 100644 test/fg-ref/appel2.fg create mode 100644 test/fg-ref/appel3.fg create mode 100644 test/fg-ref/div1.fg create mode 100644 test/fg-ref/div2.fg create mode 100644 test/fg-ref/div3.fg create mode 100644 test/fg-ref/div4.fg create mode 100644 test/fg-ref/ecrire1.fg create mode 100644 test/fg-ref/ecrire2.fg create mode 100644 test/fg-ref/egal1.fg create mode 100644 test/fg-ref/egal2.fg create mode 100644 test/fg-ref/egal3.fg create mode 100644 test/fg-ref/err5.fg create mode 100644 test/fg-ref/fibo.fg create mode 100644 test/fg-ref/inf1.fg create mode 100644 test/fg-ref/inf2.fg create mode 100644 test/fg-ref/inf3.fg create mode 100644 test/fg-ref/inf4.fg create mode 100644 test/fg-ref/mult1.fg create mode 100644 test/fg-ref/mult2.fg create mode 100644 test/fg-ref/mult3.fg create mode 100644 test/fg-ref/not1.fg create mode 100644 test/fg-ref/not2.fg create mode 100644 test/fg-ref/not3.fg create mode 100644 test/fg-ref/or1.fg create mode 100644 test/fg-ref/or2.fg create mode 100644 test/fg-ref/or3.fg create mode 100644 test/fg-ref/or4.fg create mode 100644 test/fg-ref/or5.fg create mode 100644 test/fg-ref/parenth1.fg create mode 100644 test/fg-ref/parenth2.fg create mode 100644 test/fg-ref/prio23-1.fg create mode 100644 test/fg-ref/prio23-2.fg create mode 100644 test/fg-ref/prio23-3.fg create mode 100644 test/fg-ref/prio23-4.fg create mode 100644 test/fg-ref/prio34-1.fg create mode 100644 test/fg-ref/prio34-2.fg create mode 100644 test/fg-ref/prio34-3.fg create mode 100644 test/fg-ref/prio34-4.fg create mode 100644 test/fg-ref/prio45-1.fg create mode 100644 test/fg-ref/prio45-2.fg create mode 100644 test/fg-ref/prio45-3.fg create mode 100644 test/fg-ref/prio45-4.fg create mode 100644 test/fg-ref/prio56-1.fg create mode 100644 test/fg-ref/prio56-2.fg create mode 100644 test/fg-ref/prio67-1.fg create mode 100644 test/fg-ref/prio67-2.fg create mode 100644 test/fg-ref/rec1.fg create mode 100644 test/fg-ref/si1.fg create mode 100644 test/fg-ref/si2.fg create mode 100644 test/fg-ref/si3.fg create mode 100644 test/fg-ref/si4.fg create mode 100644 test/fg-ref/si5.fg create mode 100644 test/fg-ref/sub1.fg create mode 100644 test/fg-ref/sub2.fg create mode 100644 test/fg-ref/sub3.fg create mode 100644 test/fg-ref/tab1.fg create mode 100644 test/fg-ref/tab2.fg create mode 100644 test/fg-ref/tab3.fg create mode 100644 test/fg-ref/tab4.fg create mode 100644 test/fg-ref/tantque1.fg create mode 100644 test/fg-ref/tantque2.fg create mode 100644 test/fg-ref/varglob1.fg create mode 100644 test/fg-ref/varglob2.fg create mode 100644 test/fg-ref/varglob3.fg create mode 100644 test/fg-ref/varglob4.fg create mode 100644 test/fg-ref/varloc1.fg create mode 100644 test/fg-ref/varloc2.fg create mode 100644 test/fg-ref/varloc3.fg create mode 100644 test/fg-ref/varloc4.fg create mode 100644 test/fg-ref/varloc5.fg create mode 100644 test/fgs-ref/add1.fgs create mode 100644 test/fgs-ref/add2.fgs create mode 100644 test/fgs-ref/affect1.fgs create mode 100644 test/fgs-ref/affect2.fgs create mode 100644 test/fgs-ref/affect3.fgs create mode 100644 test/fgs-ref/and1.fgs create mode 100644 test/fgs-ref/and2.fgs create mode 100644 test/fgs-ref/and3.fgs create mode 100644 test/fgs-ref/and4.fgs create mode 100644 test/fgs-ref/and5.fgs create mode 100644 test/fgs-ref/appel-param1.fgs create mode 100644 test/fgs-ref/appel-param2.fgs create mode 100644 test/fgs-ref/appel-param3.fgs create mode 100644 test/fgs-ref/appel-retour1.fgs create mode 100644 test/fgs-ref/appel1.fgs create mode 100644 test/fgs-ref/appel2.fgs create mode 100644 test/fgs-ref/appel3.fgs create mode 100644 test/fgs-ref/div1.fgs create mode 100644 test/fgs-ref/div2.fgs create mode 100644 test/fgs-ref/div3.fgs create mode 100644 test/fgs-ref/div4.fgs create mode 100644 test/fgs-ref/ecrire1.fgs create mode 100644 test/fgs-ref/ecrire2.fgs create mode 100644 test/fgs-ref/egal1.fgs create mode 100644 test/fgs-ref/egal2.fgs create mode 100644 test/fgs-ref/egal3.fgs create mode 100644 test/fgs-ref/err5.fgs create mode 100644 test/fgs-ref/fibo.fgs create mode 100644 test/fgs-ref/inf1.fgs create mode 100644 test/fgs-ref/inf2.fgs create mode 100644 test/fgs-ref/inf3.fgs create mode 100644 test/fgs-ref/inf4.fgs create mode 100644 test/fgs-ref/mult1.fgs create mode 100644 test/fgs-ref/mult2.fgs create mode 100644 test/fgs-ref/mult3.fgs create mode 100644 test/fgs-ref/not1.fgs create mode 100644 test/fgs-ref/not2.fgs create mode 100644 test/fgs-ref/not3.fgs create mode 100644 test/fgs-ref/or1.fgs create mode 100644 test/fgs-ref/or2.fgs create mode 100644 test/fgs-ref/or3.fgs create mode 100644 test/fgs-ref/or4.fgs create mode 100644 test/fgs-ref/or5.fgs create mode 100644 test/fgs-ref/parenth1.fgs create mode 100644 test/fgs-ref/parenth2.fgs create mode 100644 test/fgs-ref/prio23-1.fgs create mode 100644 test/fgs-ref/prio23-2.fgs create mode 100644 test/fgs-ref/prio23-3.fgs create mode 100644 test/fgs-ref/prio23-4.fgs create mode 100644 test/fgs-ref/prio34-1.fgs create mode 100644 test/fgs-ref/prio34-2.fgs create mode 100644 test/fgs-ref/prio34-3.fgs create mode 100644 test/fgs-ref/prio34-4.fgs create mode 100644 test/fgs-ref/prio45-1.fgs create mode 100644 test/fgs-ref/prio45-2.fgs create mode 100644 test/fgs-ref/prio45-3.fgs create mode 100644 test/fgs-ref/prio45-4.fgs create mode 100644 test/fgs-ref/prio56-1.fgs create mode 100644 test/fgs-ref/prio56-2.fgs create mode 100644 test/fgs-ref/prio67-1.fgs create mode 100644 test/fgs-ref/prio67-2.fgs create mode 100644 test/fgs-ref/rec1.fgs create mode 100644 test/fgs-ref/si1.fgs create mode 100644 test/fgs-ref/si2.fgs create mode 100644 test/fgs-ref/si3.fgs create mode 100644 test/fgs-ref/si4.fgs create mode 100644 test/fgs-ref/si5.fgs create mode 100644 test/fgs-ref/sub1.fgs create mode 100644 test/fgs-ref/sub2.fgs create mode 100644 test/fgs-ref/sub3.fgs create mode 100644 test/fgs-ref/tab1.fgs create mode 100644 test/fgs-ref/tab2.fgs create mode 100644 test/fgs-ref/tab3.fgs create mode 100644 test/fgs-ref/tab4.fgs create mode 100644 test/fgs-ref/tantque1.fgs create mode 100644 test/fgs-ref/tantque2.fgs create mode 100644 test/fgs-ref/varglob1.fgs create mode 100644 test/fgs-ref/varglob2.fgs create mode 100644 test/fgs-ref/varglob3.fgs create mode 100644 test/fgs-ref/varglob4.fgs create mode 100644 test/fgs-ref/varloc1.fgs create mode 100644 test/fgs-ref/varloc2.fgs create mode 100644 test/fgs-ref/varloc3.fgs create mode 100644 test/fgs-ref/varloc4.fgs create mode 100644 test/fgs-ref/varloc5.fgs create mode 100644 test/ig-ref/add1.ig create mode 100644 test/ig-ref/add2.ig create mode 100644 test/ig-ref/affect1.ig create mode 100644 test/ig-ref/affect2.ig create mode 100644 test/ig-ref/affect3.ig create mode 100644 test/ig-ref/and1.ig create mode 100644 test/ig-ref/and2.ig create mode 100644 test/ig-ref/and3.ig create mode 100644 test/ig-ref/and4.ig create mode 100644 test/ig-ref/and5.ig create mode 100644 test/ig-ref/appel-param1.ig create mode 100644 test/ig-ref/appel-param2.ig create mode 100644 test/ig-ref/appel-param3.ig create mode 100644 test/ig-ref/appel-retour1.ig create mode 100644 test/ig-ref/appel1.ig create mode 100644 test/ig-ref/appel2.ig create mode 100644 test/ig-ref/appel3.ig create mode 100644 test/ig-ref/div1.ig create mode 100644 test/ig-ref/div2.ig create mode 100644 test/ig-ref/div3.ig create mode 100644 test/ig-ref/div4.ig create mode 100644 test/ig-ref/ecrire1.ig create mode 100644 test/ig-ref/ecrire2.ig create mode 100644 test/ig-ref/egal1.ig create mode 100644 test/ig-ref/egal2.ig create mode 100644 test/ig-ref/egal3.ig create mode 100644 test/ig-ref/err5.ig create mode 100644 test/ig-ref/fibo.ig create mode 100644 test/ig-ref/inf1.ig create mode 100644 test/ig-ref/inf2.ig create mode 100644 test/ig-ref/inf3.ig create mode 100644 test/ig-ref/inf4.ig create mode 100644 test/ig-ref/mult1.ig create mode 100644 test/ig-ref/mult2.ig create mode 100644 test/ig-ref/mult3.ig create mode 100644 test/ig-ref/not1.ig create mode 100644 test/ig-ref/not2.ig create mode 100644 test/ig-ref/not3.ig create mode 100644 test/ig-ref/or1.ig create mode 100644 test/ig-ref/or2.ig create mode 100644 test/ig-ref/or3.ig create mode 100644 test/ig-ref/or4.ig create mode 100644 test/ig-ref/or5.ig create mode 100644 test/ig-ref/parenth1.ig create mode 100644 test/ig-ref/parenth2.ig create mode 100644 test/ig-ref/prio23-1.ig create mode 100644 test/ig-ref/prio23-2.ig create mode 100644 test/ig-ref/prio23-3.ig create mode 100644 test/ig-ref/prio23-4.ig create mode 100644 test/ig-ref/prio34-1.ig create mode 100644 test/ig-ref/prio34-2.ig create mode 100644 test/ig-ref/prio34-3.ig create mode 100644 test/ig-ref/prio34-4.ig create mode 100644 test/ig-ref/prio45-1.ig create mode 100644 test/ig-ref/prio45-2.ig create mode 100644 test/ig-ref/prio45-3.ig create mode 100644 test/ig-ref/prio45-4.ig create mode 100644 test/ig-ref/prio56-1.ig create mode 100644 test/ig-ref/prio56-2.ig create mode 100644 test/ig-ref/prio67-1.ig create mode 100644 test/ig-ref/prio67-2.ig create mode 100644 test/ig-ref/rec1.ig create mode 100644 test/ig-ref/si1.ig create mode 100644 test/ig-ref/si2.ig create mode 100644 test/ig-ref/si3.ig create mode 100644 test/ig-ref/si4.ig create mode 100644 test/ig-ref/si5.ig create mode 100644 test/ig-ref/sub1.ig create mode 100644 test/ig-ref/sub2.ig create mode 100644 test/ig-ref/sub3.ig create mode 100644 test/ig-ref/tab1.ig create mode 100644 test/ig-ref/tab2.ig create mode 100644 test/ig-ref/tab3.ig create mode 100644 test/ig-ref/tab4.ig create mode 100644 test/ig-ref/tantque1.ig create mode 100644 test/ig-ref/tantque2.ig create mode 100644 test/ig-ref/varglob1.ig create mode 100644 test/ig-ref/varglob2.ig create mode 100644 test/ig-ref/varglob3.ig create mode 100644 test/ig-ref/varglob4.ig create mode 100644 test/ig-ref/varloc1.ig create mode 100644 test/ig-ref/varloc2.ig create mode 100644 test/ig-ref/varloc3.ig create mode 100644 test/ig-ref/varloc4.ig create mode 100644 test/ig-ref/varloc5.ig create mode 100644 test/input/.gitignore create mode 100644 test/input/add1.l create mode 100644 test/input/add1.s create mode 100644 test/input/add2.l create mode 100644 test/input/add2.s create mode 100644 test/input/affect1.l create mode 100644 test/input/affect1.s create mode 100644 test/input/affect2.l create mode 100644 test/input/affect2.s create mode 100644 test/input/affect3.l create mode 100644 test/input/and1.l create mode 100644 test/input/and2.l create mode 100644 test/input/and3.l create mode 100644 test/input/and4.l create mode 100644 test/input/and5.l create mode 100644 test/input/appel-param1.l create mode 100644 test/input/appel-param2.l create mode 100644 test/input/appel-param3.l create mode 100644 test/input/appel-retour1.l create mode 100644 test/input/appel1.l create mode 100644 test/input/appel2.l create mode 100644 test/input/appel3.l create mode 100755 test/input/clean create mode 100644 test/input/div1.l create mode 100644 test/input/div2.l create mode 100644 test/input/div3.l create mode 100644 test/input/div4.l create mode 100644 test/input/ecrire1.l create mode 100644 test/input/ecrire2.l create mode 100644 test/input/egal1.l create mode 100644 test/input/egal2.l create mode 100644 test/input/egal3.l create mode 100644 test/input/fibo.l create mode 100644 test/input/inf1.l create mode 100644 test/input/inf2.l create mode 100644 test/input/inf3.l create mode 100644 test/input/mult1.l create mode 100644 test/input/mult2.l create mode 100644 test/input/mult3.l create mode 100644 test/input/nettoie.sh create mode 100644 test/input/not1.l create mode 100644 test/input/not2.l create mode 100644 test/input/not3.l create mode 100644 test/input/or1.l create mode 100644 test/input/or2.l create mode 100644 test/input/or3.l create mode 100644 test/input/or4.l create mode 100644 test/input/or5.l create mode 100644 test/input/parenth1.l create mode 100644 test/input/parenth2.l create mode 100644 test/input/prio34-1.l create mode 100644 test/input/prio34-2.l create mode 100644 test/input/prio34-3.l create mode 100644 test/input/prio34-4.l create mode 100644 test/input/prio45-1.l create mode 100644 test/input/prio45-2.l create mode 100644 test/input/prio45-3.l create mode 100644 test/input/prio45-4.l create mode 100644 test/input/prio56-1.l create mode 100644 test/input/prio56-2.l create mode 100644 test/input/prio67-1.l create mode 100644 test/input/prio67-2.l create mode 100644 test/input/rec1.l create mode 100644 test/input/si1.l create mode 100644 test/input/si2.l create mode 100644 test/input/si3.l create mode 100644 test/input/si4.l create mode 100644 test/input/si5.l create mode 100644 test/input/sub1.l create mode 100644 test/input/sub2.l create mode 100644 test/input/sub3.l create mode 100644 test/input/tab1.l create mode 100644 test/input/tab2.l create mode 100644 test/input/tab3.l create mode 100644 test/input/tab4.l create mode 100644 test/input/tantque1.l create mode 100644 test/input/tantque2.l create mode 100644 test/input/tri.l create mode 100644 test/input/varglob1.l create mode 100644 test/input/varglob2.l create mode 100644 test/input/varglob3.l create mode 100644 test/input/varglob4.l create mode 100644 test/input/varloc1.l create mode 100644 test/input/varloc2.l create mode 100644 test/input/varloc3.l create mode 100644 test/input/varloc4.l create mode 100644 test/input/varloc5.l create mode 100644 test/input_err_ts/double_dec1.l create mode 100644 test/input_err_ts/double_dec2.l create mode 100644 test/input_err_ts/double_dec3.l create mode 100644 test/input_err_ts/double_dec4.l create mode 100644 test/input_err_ts/fct_inconnue1.l create mode 100644 test/input_err_ts/mauvais_nb_arg1.l create mode 100644 test/input_err_ts/var_inconnue1.l create mode 100644 test/input_err_type/add1.l create mode 100644 test/input_err_type/add2.l create mode 100644 test/input_err_type/add3.l create mode 100644 test/input_err_type/add4.l create mode 100644 test/input_err_type/affect1.l create mode 100644 test/input_err_type/affect2.l create mode 100644 test/input_err_type/affect3.l create mode 100644 test/input_err_type/affect4.l create mode 100644 test/input_err_type/and1.l create mode 100644 test/input_err_type/and2.l create mode 100644 test/input_err_type/and3.l create mode 100644 test/input_err_type/and4.l create mode 100644 test/input_err_type/appel1.l create mode 100644 test/input_err_type/appel2.l create mode 100644 test/input_err_type/appel3.l create mode 100644 test/input_err_type/appel4.l create mode 100644 test/input_err_type/div1.l create mode 100644 test/input_err_type/div2.l create mode 100644 test/input_err_type/div3.l create mode 100644 test/input_err_type/div4.l create mode 100644 test/input_err_type/egal1.l create mode 100644 test/input_err_type/egal2.l create mode 100644 test/input_err_type/egal3.l create mode 100644 test/input_err_type/egal3.nasm create mode 100644 test/input_err_type/inf1.l create mode 100644 test/input_err_type/inf2.l create mode 100644 test/input_err_type/inf3.l create mode 100644 test/input_err_type/inf3.nasm create mode 100644 test/input_err_type/inf4.l create mode 100644 test/input_err_type/mult1.l create mode 100644 test/input_err_type/mult2.l create mode 100644 test/input_err_type/mult3.l create mode 100644 test/input_err_type/mult4.l create mode 100644 test/input_err_type/not1.l create mode 100644 test/input_err_type/or1.l create mode 100644 test/input_err_type/or2.l create mode 100644 test/input_err_type/or3.l create mode 100644 test/input_err_type/or4.l create mode 100644 test/input_err_type/retour1.l create mode 100644 test/input_err_type/retour2.l create mode 100644 test/input_err_type/retour3.l create mode 100644 test/input_err_type/si1.l create mode 100644 test/input_err_type/sub1.l create mode 100644 test/input_err_type/sub2.l create mode 100644 test/input_err_type/sub3.l create mode 100644 test/input_err_type/sub4.l create mode 100644 test/input_err_type/tantque1.l create mode 100644 test/io.asm create mode 100644 test/nasm-ref/add1.nasm create mode 100644 test/nasm-ref/add2.nasm create mode 100644 test/nasm-ref/affect1.nasm create mode 100644 test/nasm-ref/affect2.nasm create mode 100644 test/nasm-ref/affect3.nasm create mode 100644 test/nasm-ref/and1.nasm create mode 100644 test/nasm-ref/and2.nasm create mode 100644 test/nasm-ref/and3.nasm create mode 100644 test/nasm-ref/and4.nasm create mode 100644 test/nasm-ref/and5.nasm create mode 100644 test/nasm-ref/appel-param1.nasm create mode 100644 test/nasm-ref/appel-param2.nasm create mode 100644 test/nasm-ref/appel-param3.nasm create mode 100644 test/nasm-ref/appel-retour1.nasm create mode 100644 test/nasm-ref/appel1.nasm create mode 100644 test/nasm-ref/appel2.nasm create mode 100644 test/nasm-ref/appel3.nasm create mode 100644 test/nasm-ref/div1.nasm create mode 100644 test/nasm-ref/div2.nasm create mode 100644 test/nasm-ref/div3.nasm create mode 100644 test/nasm-ref/div4.nasm create mode 100644 test/nasm-ref/ecrire1.nasm create mode 100644 test/nasm-ref/ecrire2.nasm create mode 100644 test/nasm-ref/egal1.nasm create mode 100644 test/nasm-ref/egal2.nasm create mode 100644 test/nasm-ref/egal3.nasm create mode 100644 test/nasm-ref/fibo.nasm create mode 100644 test/nasm-ref/inf1.nasm create mode 100644 test/nasm-ref/inf2.nasm create mode 100644 test/nasm-ref/inf3.nasm create mode 100644 test/nasm-ref/inf4.nasm create mode 100644 test/nasm-ref/mult1.nasm create mode 100644 test/nasm-ref/mult2.nasm create mode 100644 test/nasm-ref/mult3.nasm create mode 100644 test/nasm-ref/not1.nasm create mode 100644 test/nasm-ref/not2.nasm create mode 100644 test/nasm-ref/not3.nasm create mode 100644 test/nasm-ref/or1.nasm create mode 100644 test/nasm-ref/or2.nasm create mode 100644 test/nasm-ref/or3.nasm create mode 100644 test/nasm-ref/or4.nasm create mode 100644 test/nasm-ref/or5.nasm create mode 100644 test/nasm-ref/parenth1.nasm create mode 100644 test/nasm-ref/parenth2.nasm create mode 100644 test/nasm-ref/prio23-1.nasm create mode 100644 test/nasm-ref/prio23-2.nasm create mode 100644 test/nasm-ref/prio23-3.nasm create mode 100644 test/nasm-ref/prio23-4.nasm create mode 100644 test/nasm-ref/prio34-1.nasm create mode 100644 test/nasm-ref/prio34-2.nasm create mode 100644 test/nasm-ref/prio34-3.nasm create mode 100644 test/nasm-ref/prio34-4.nasm create mode 100644 test/nasm-ref/prio45-1.nasm create mode 100644 test/nasm-ref/prio45-2.nasm create mode 100644 test/nasm-ref/prio45-3.nasm create mode 100644 test/nasm-ref/prio45-4.nasm create mode 100644 test/nasm-ref/prio56-1.nasm create mode 100644 test/nasm-ref/prio56-2.nasm create mode 100644 test/nasm-ref/prio67-1.nasm create mode 100644 test/nasm-ref/prio67-2.nasm create mode 100644 test/nasm-ref/rec1.nasm create mode 100644 test/nasm-ref/si1.nasm create mode 100644 test/nasm-ref/si2.nasm create mode 100644 test/nasm-ref/si3.nasm create mode 100644 test/nasm-ref/si4.nasm create mode 100644 test/nasm-ref/si5.nasm create mode 100644 test/nasm-ref/sub1.nasm create mode 100644 test/nasm-ref/sub2.nasm create mode 100644 test/nasm-ref/sub3.nasm create mode 100644 test/nasm-ref/tab1.nasm create mode 100644 test/nasm-ref/tab2.nasm create mode 100644 test/nasm-ref/tab3.nasm create mode 100644 test/nasm-ref/tab4.nasm create mode 100644 test/nasm-ref/tantque1.nasm create mode 100644 test/nasm-ref/tantque2.nasm create mode 100644 test/nasm-ref/tri.nasm create mode 100644 test/nasm-ref/varglob1.nasm create mode 100644 test/nasm-ref/varglob2.nasm create mode 100644 test/nasm-ref/varglob3.nasm create mode 100644 test/nasm-ref/varglob4.nasm create mode 100644 test/nasm-ref/varloc1.nasm create mode 100644 test/nasm-ref/varloc2.nasm create mode 100644 test/nasm-ref/varloc3.nasm create mode 100644 test/nasm-ref/varloc4.nasm create mode 100644 test/nasm-ref/varloc5.nasm create mode 100644 test/out-ref/add1.out create mode 100644 test/out-ref/add2.out create mode 100644 test/out-ref/affect1.out create mode 100644 test/out-ref/affect2.out create mode 100644 test/out-ref/affect3.out create mode 100644 test/out-ref/and1.out create mode 100644 test/out-ref/and2.out create mode 100644 test/out-ref/and3.out create mode 100644 test/out-ref/and4.out create mode 100644 test/out-ref/and5.out create mode 100644 test/out-ref/appel-param1.out create mode 100644 test/out-ref/appel-param2.out create mode 100644 test/out-ref/appel-param3.out create mode 100644 test/out-ref/appel-retour1.out create mode 100644 test/out-ref/appel1.out create mode 100644 test/out-ref/appel2.out create mode 100644 test/out-ref/appel3.out create mode 100644 test/out-ref/div1.out create mode 100644 test/out-ref/div2.out create mode 100644 test/out-ref/div3.out create mode 100644 test/out-ref/div4.out create mode 100644 test/out-ref/ecrire1.out create mode 100644 test/out-ref/ecrire2.out create mode 100644 test/out-ref/egal1.out create mode 100644 test/out-ref/egal2.out create mode 100644 test/out-ref/egal3.out create mode 100644 test/out-ref/err5.out create mode 100644 test/out-ref/fibo.out create mode 100644 test/out-ref/inf1.out create mode 100644 test/out-ref/inf2.out create mode 100644 test/out-ref/inf3.out create mode 100644 test/out-ref/inf4.out create mode 100644 test/out-ref/mult1.out create mode 100644 test/out-ref/mult2.out create mode 100644 test/out-ref/mult3.out create mode 100644 test/out-ref/not1.out create mode 100644 test/out-ref/not2.out create mode 100644 test/out-ref/not3.out create mode 100644 test/out-ref/or1.out create mode 100644 test/out-ref/or2.out create mode 100644 test/out-ref/or3.out create mode 100644 test/out-ref/or4.out create mode 100644 test/out-ref/or5.out create mode 100644 test/out-ref/parenth1.out create mode 100644 test/out-ref/parenth2.out create mode 100644 test/out-ref/prio23-1.out create mode 100644 test/out-ref/prio23-2.out create mode 100644 test/out-ref/prio23-3.out create mode 100644 test/out-ref/prio23-4.out create mode 100644 test/out-ref/prio34-1.out create mode 100644 test/out-ref/prio34-2.out create mode 100644 test/out-ref/prio34-3.out create mode 100644 test/out-ref/prio34-4.out create mode 100644 test/out-ref/prio45-1.out create mode 100644 test/out-ref/prio45-2.out create mode 100644 test/out-ref/prio45-3.out create mode 100644 test/out-ref/prio45-4.out create mode 100644 test/out-ref/prio56-1.out create mode 100644 test/out-ref/prio56-2.out create mode 100644 test/out-ref/prio67-1.out create mode 100644 test/out-ref/prio67-2.out create mode 100644 test/out-ref/rec1.out create mode 100644 test/out-ref/si1.out create mode 100644 test/out-ref/si2.out create mode 100644 test/out-ref/si3.out create mode 100644 test/out-ref/si4.out create mode 100644 test/out-ref/si5.out create mode 100644 test/out-ref/sub1.out create mode 100644 test/out-ref/sub2.out create mode 100644 test/out-ref/sub3.out create mode 100644 test/out-ref/tab1.out create mode 100644 test/out-ref/tab2.out create mode 100644 test/out-ref/tab3.out create mode 100644 test/out-ref/tab4.out create mode 100644 test/out-ref/tantque1.out create mode 100644 test/out-ref/tantque2.out create mode 100644 test/out-ref/tri.out create mode 100644 test/out-ref/varglob1.out create mode 100644 test/out-ref/varglob2.out create mode 100644 test/out-ref/varglob3.out create mode 100644 test/out-ref/varglob4.out create mode 100644 test/out-ref/varloc1.out create mode 100644 test/out-ref/varloc2.out create mode 100644 test/out-ref/varloc3.out create mode 100644 test/out-ref/varloc4.out create mode 100644 test/out-ref/varloc5.out create mode 100644 test/pre-nasm-ref/add1.pre-nasm create mode 100644 test/pre-nasm-ref/add2.pre-nasm create mode 100644 test/pre-nasm-ref/affect1.pre-nasm create mode 100644 test/pre-nasm-ref/affect2.pre-nasm create mode 100644 test/pre-nasm-ref/affect3.pre-nasm create mode 100644 test/pre-nasm-ref/and1.pre-nasm create mode 100644 test/pre-nasm-ref/and2.pre-nasm create mode 100644 test/pre-nasm-ref/and3.pre-nasm create mode 100644 test/pre-nasm-ref/and4.pre-nasm create mode 100644 test/pre-nasm-ref/and5.pre-nasm create mode 100644 test/pre-nasm-ref/appel-param1.pre-nasm create mode 100644 test/pre-nasm-ref/appel-param2.pre-nasm create mode 100644 test/pre-nasm-ref/appel-param3.pre-nasm create mode 100644 test/pre-nasm-ref/appel-retour1.pre-nasm create mode 100644 test/pre-nasm-ref/appel1.pre-nasm create mode 100644 test/pre-nasm-ref/appel2.pre-nasm create mode 100644 test/pre-nasm-ref/appel3.pre-nasm create mode 100644 test/pre-nasm-ref/div1.pre-nasm create mode 100644 test/pre-nasm-ref/div2.pre-nasm create mode 100644 test/pre-nasm-ref/div3.pre-nasm create mode 100644 test/pre-nasm-ref/div4.pre-nasm create mode 100644 test/pre-nasm-ref/ecrire1.pre-nasm create mode 100644 test/pre-nasm-ref/ecrire2.pre-nasm create mode 100644 test/pre-nasm-ref/egal1.pre-nasm create mode 100644 test/pre-nasm-ref/egal2.pre-nasm create mode 100644 test/pre-nasm-ref/egal3.pre-nasm create mode 100644 test/pre-nasm-ref/fibo.pre-nasm create mode 100644 test/pre-nasm-ref/inf1.pre-nasm create mode 100644 test/pre-nasm-ref/inf2.pre-nasm create mode 100644 test/pre-nasm-ref/inf3.pre-nasm create mode 100644 test/pre-nasm-ref/inf4.pre-nasm create mode 100644 test/pre-nasm-ref/mult1.pre-nasm create mode 100644 test/pre-nasm-ref/mult2.pre-nasm create mode 100644 test/pre-nasm-ref/mult3.pre-nasm create mode 100644 test/pre-nasm-ref/not1.pre-nasm create mode 100644 test/pre-nasm-ref/not2.pre-nasm create mode 100644 test/pre-nasm-ref/not3.pre-nasm create mode 100644 test/pre-nasm-ref/or1.pre-nasm create mode 100644 test/pre-nasm-ref/or2.pre-nasm create mode 100644 test/pre-nasm-ref/or3.pre-nasm create mode 100644 test/pre-nasm-ref/or4.pre-nasm create mode 100644 test/pre-nasm-ref/or5.pre-nasm create mode 100644 test/pre-nasm-ref/parenth1.pre-nasm create mode 100644 test/pre-nasm-ref/parenth2.pre-nasm create mode 100644 test/pre-nasm-ref/prio23-1.pre-nasm create mode 100644 test/pre-nasm-ref/prio23-2.pre-nasm create mode 100644 test/pre-nasm-ref/prio23-3.pre-nasm create mode 100644 test/pre-nasm-ref/prio23-4.pre-nasm create mode 100644 test/pre-nasm-ref/prio34-1.pre-nasm create mode 100644 test/pre-nasm-ref/prio34-2.pre-nasm create mode 100644 test/pre-nasm-ref/prio34-3.pre-nasm create mode 100644 test/pre-nasm-ref/prio34-4.pre-nasm create mode 100644 test/pre-nasm-ref/prio45-1.pre-nasm create mode 100644 test/pre-nasm-ref/prio45-2.pre-nasm create mode 100644 test/pre-nasm-ref/prio45-3.pre-nasm create mode 100644 test/pre-nasm-ref/prio45-4.pre-nasm create mode 100644 test/pre-nasm-ref/prio56-1.pre-nasm create mode 100644 test/pre-nasm-ref/prio56-2.pre-nasm create mode 100644 test/pre-nasm-ref/prio67-1.pre-nasm create mode 100644 test/pre-nasm-ref/prio67-2.pre-nasm create mode 100644 test/pre-nasm-ref/rec1.pre-nasm create mode 100644 test/pre-nasm-ref/si1.pre-nasm create mode 100644 test/pre-nasm-ref/si2.pre-nasm create mode 100644 test/pre-nasm-ref/si3.pre-nasm create mode 100644 test/pre-nasm-ref/si4.pre-nasm create mode 100644 test/pre-nasm-ref/si5.pre-nasm create mode 100644 test/pre-nasm-ref/sub1.pre-nasm create mode 100644 test/pre-nasm-ref/sub2.pre-nasm create mode 100644 test/pre-nasm-ref/sub3.pre-nasm create mode 100644 test/pre-nasm-ref/tab1.pre-nasm create mode 100644 test/pre-nasm-ref/tab2.pre-nasm create mode 100644 test/pre-nasm-ref/tab3.pre-nasm create mode 100644 test/pre-nasm-ref/tab4.pre-nasm create mode 100644 test/pre-nasm-ref/tantque1.pre-nasm create mode 100644 test/pre-nasm-ref/tantque2.pre-nasm create mode 100644 test/pre-nasm-ref/tri.pre-nasm create mode 100644 test/pre-nasm-ref/varglob1.pre-nasm create mode 100644 test/pre-nasm-ref/varglob2.pre-nasm create mode 100644 test/pre-nasm-ref/varglob3.pre-nasm create mode 100644 test/pre-nasm-ref/varglob4.pre-nasm create mode 100644 test/pre-nasm-ref/varloc1.pre-nasm create mode 100644 test/pre-nasm-ref/varloc2.pre-nasm create mode 100644 test/pre-nasm-ref/varloc3.pre-nasm create mode 100644 test/pre-nasm-ref/varloc4.pre-nasm create mode 100644 test/pre-nasm-ref/varloc5.pre-nasm create mode 100644 test/sa-ref/add1.sa create mode 100644 test/sa-ref/add2.sa create mode 100644 test/sa-ref/affect1.sa create mode 100644 test/sa-ref/affect2.sa create mode 100644 test/sa-ref/affect3.sa create mode 100644 test/sa-ref/and1.sa create mode 100644 test/sa-ref/and2.sa create mode 100644 test/sa-ref/and3.sa create mode 100644 test/sa-ref/and4.sa create mode 100644 test/sa-ref/and5.sa create mode 100644 test/sa-ref/appel-param1.sa create mode 100644 test/sa-ref/appel-param2.sa create mode 100644 test/sa-ref/appel-param3.sa create mode 100644 test/sa-ref/appel-retour1.sa create mode 100644 test/sa-ref/appel1.sa create mode 100644 test/sa-ref/appel2.sa create mode 100644 test/sa-ref/appel3.sa create mode 100644 test/sa-ref/div1.sa create mode 100644 test/sa-ref/div2.sa create mode 100644 test/sa-ref/div3.sa create mode 100644 test/sa-ref/div4.sa create mode 100644 test/sa-ref/ecrire1.sa create mode 100644 test/sa-ref/ecrire2.sa create mode 100644 test/sa-ref/egal1.sa create mode 100644 test/sa-ref/egal2.sa create mode 100644 test/sa-ref/egal3.sa create mode 100644 test/sa-ref/err1.sa create mode 100644 test/sa-ref/err2.sa create mode 100644 test/sa-ref/err3.sa create mode 100644 test/sa-ref/err4.sa create mode 100644 test/sa-ref/err5.sa create mode 100644 test/sa-ref/fibo.sa create mode 100644 test/sa-ref/inf1.sa create mode 100644 test/sa-ref/inf2.sa create mode 100644 test/sa-ref/inf3.sa create mode 100644 test/sa-ref/inf4.sa create mode 100644 test/sa-ref/mult1.sa create mode 100644 test/sa-ref/mult2.sa create mode 100644 test/sa-ref/mult3.sa create mode 100644 test/sa-ref/not1.sa create mode 100644 test/sa-ref/not2.sa create mode 100644 test/sa-ref/not3.sa create mode 100644 test/sa-ref/or1.sa create mode 100644 test/sa-ref/or2.sa create mode 100644 test/sa-ref/or3.sa create mode 100644 test/sa-ref/or4.sa create mode 100644 test/sa-ref/or5.sa create mode 100644 test/sa-ref/parenth1.sa create mode 100644 test/sa-ref/parenth2.sa create mode 100644 test/sa-ref/prio23-1.sa create mode 100644 test/sa-ref/prio23-2.sa create mode 100644 test/sa-ref/prio23-3.sa create mode 100644 test/sa-ref/prio23-4.sa create mode 100644 test/sa-ref/prio34-1.sa create mode 100644 test/sa-ref/prio34-2.sa create mode 100644 test/sa-ref/prio34-3.sa create mode 100644 test/sa-ref/prio34-4.sa create mode 100644 test/sa-ref/prio45-1.sa create mode 100644 test/sa-ref/prio45-2.sa create mode 100644 test/sa-ref/prio45-3.sa create mode 100644 test/sa-ref/prio45-4.sa create mode 100644 test/sa-ref/prio56-1.sa create mode 100644 test/sa-ref/prio56-2.sa create mode 100644 test/sa-ref/prio67-1.sa create mode 100644 test/sa-ref/prio67-2.sa create mode 100644 test/sa-ref/rec1.sa create mode 100644 test/sa-ref/si1.sa create mode 100644 test/sa-ref/si2.sa create mode 100644 test/sa-ref/si3.sa create mode 100644 test/sa-ref/si4.sa create mode 100644 test/sa-ref/si5.sa create mode 100644 test/sa-ref/sub1.sa create mode 100644 test/sa-ref/sub2.sa create mode 100644 test/sa-ref/sub3.sa create mode 100644 test/sa-ref/tab1.sa create mode 100644 test/sa-ref/tab2.sa create mode 100644 test/sa-ref/tab3.sa create mode 100644 test/sa-ref/tab4.sa create mode 100644 test/sa-ref/tantque1.sa create mode 100644 test/sa-ref/tantque2.sa create mode 100644 test/sa-ref/tri.sa create mode 100644 test/sa-ref/varglob1.sa create mode 100644 test/sa-ref/varglob2.sa create mode 100644 test/sa-ref/varglob3.sa create mode 100644 test/sa-ref/varglob4.sa create mode 100644 test/sa-ref/varloc1.sa create mode 100644 test/sa-ref/varloc2.sa create mode 100644 test/sa-ref/varloc3.sa create mode 100644 test/sa-ref/varloc4.sa create mode 100644 test/sa-ref/varloc5.sa create mode 100644 test/sc-ref/add1.sc create mode 100644 test/sc-ref/add2.sc create mode 100644 test/sc-ref/affect1.sc create mode 100644 test/sc-ref/affect2.sc create mode 100644 test/sc-ref/affect3.sc create mode 100644 test/sc-ref/and1.sc create mode 100644 test/sc-ref/and2.sc create mode 100644 test/sc-ref/and3.sc create mode 100644 test/sc-ref/and4.sc create mode 100644 test/sc-ref/and5.sc create mode 100644 test/sc-ref/appel-param1.sc create mode 100644 test/sc-ref/appel-param2.sc create mode 100644 test/sc-ref/appel-param3.sc create mode 100644 test/sc-ref/appel-retour1.sc create mode 100644 test/sc-ref/appel1.sc create mode 100644 test/sc-ref/appel2.sc create mode 100644 test/sc-ref/appel3.sc create mode 100644 test/sc-ref/div1.sc create mode 100644 test/sc-ref/div2.sc create mode 100644 test/sc-ref/div3.sc create mode 100644 test/sc-ref/div4.sc create mode 100644 test/sc-ref/ecrire1.sc create mode 100644 test/sc-ref/ecrire2.sc create mode 100644 test/sc-ref/egal1.sc create mode 100644 test/sc-ref/egal2.sc create mode 100644 test/sc-ref/egal3.sc create mode 100644 test/sc-ref/err1.sc create mode 100644 test/sc-ref/err2.sc create mode 100644 test/sc-ref/err3.sc create mode 100644 test/sc-ref/err4.sc create mode 100644 test/sc-ref/err5.sc create mode 100644 test/sc-ref/fibo.sc create mode 100644 test/sc-ref/inf1.sc create mode 100644 test/sc-ref/inf2.sc create mode 100644 test/sc-ref/inf3.sc create mode 100644 test/sc-ref/inf4.sc create mode 100644 test/sc-ref/modulo1.sc create mode 100644 test/sc-ref/mult1.sc create mode 100644 test/sc-ref/mult2.sc create mode 100644 test/sc-ref/mult3.sc create mode 100644 test/sc-ref/not1.sc create mode 100644 test/sc-ref/not2.sc create mode 100644 test/sc-ref/not3.sc create mode 100644 test/sc-ref/or1.sc create mode 100644 test/sc-ref/or2.sc create mode 100644 test/sc-ref/or3.sc create mode 100644 test/sc-ref/or4.sc create mode 100644 test/sc-ref/or5.sc create mode 100644 test/sc-ref/parenth1.sc create mode 100644 test/sc-ref/parenth2.sc create mode 100644 test/sc-ref/prio23-1.sc create mode 100644 test/sc-ref/prio23-2.sc create mode 100644 test/sc-ref/prio23-3.sc create mode 100644 test/sc-ref/prio23-4.sc create mode 100644 test/sc-ref/prio34-1.sc create mode 100644 test/sc-ref/prio34-2.sc create mode 100644 test/sc-ref/prio34-3.sc create mode 100644 test/sc-ref/prio34-4.sc create mode 100644 test/sc-ref/prio45-1.sc create mode 100644 test/sc-ref/prio45-2.sc create mode 100644 test/sc-ref/prio45-3.sc create mode 100644 test/sc-ref/prio45-4.sc create mode 100644 test/sc-ref/prio56-1.sc create mode 100644 test/sc-ref/prio56-2.sc create mode 100644 test/sc-ref/prio67-1.sc create mode 100644 test/sc-ref/prio67-2.sc create mode 100644 test/sc-ref/rec1.sc create mode 100644 test/sc-ref/si1.sc create mode 100644 test/sc-ref/si2.sc create mode 100644 test/sc-ref/si3.sc create mode 100644 test/sc-ref/si4.sc create mode 100644 test/sc-ref/si5.sc create mode 100644 test/sc-ref/sub1.sc create mode 100644 test/sc-ref/sub2.sc create mode 100644 test/sc-ref/sub3.sc create mode 100644 test/sc-ref/tab1.sc create mode 100644 test/sc-ref/tab2.sc create mode 100644 test/sc-ref/tab3.sc create mode 100644 test/sc-ref/tab4.sc create mode 100644 test/sc-ref/tantque1.sc create mode 100644 test/sc-ref/tantque2.sc create mode 100644 test/sc-ref/varglob1.sc create mode 100644 test/sc-ref/varglob2.sc create mode 100644 test/sc-ref/varglob3.sc create mode 100644 test/sc-ref/varglob4.sc create mode 100644 test/sc-ref/varloc1.sc create mode 100644 test/sc-ref/varloc2.sc create mode 100644 test/sc-ref/varloc3.sc create mode 100644 test/sc-ref/varloc4.sc create mode 100644 test/sc-ref/varloc5.sc create mode 100644 test/ts-ref/add1.ts create mode 100644 test/ts-ref/add2.ts create mode 100644 test/ts-ref/affect1.ts create mode 100644 test/ts-ref/affect2.ts create mode 100644 test/ts-ref/affect3.ts create mode 100644 test/ts-ref/and1.ts create mode 100644 test/ts-ref/and2.ts create mode 100644 test/ts-ref/and3.ts create mode 100644 test/ts-ref/and4.ts create mode 100644 test/ts-ref/and5.ts create mode 100644 test/ts-ref/appel-param1.ts create mode 100644 test/ts-ref/appel-param2.ts create mode 100644 test/ts-ref/appel-param3.ts create mode 100644 test/ts-ref/appel-retour1.ts create mode 100644 test/ts-ref/appel1.ts create mode 100644 test/ts-ref/appel2.ts create mode 100644 test/ts-ref/appel3.ts create mode 100644 test/ts-ref/div1.ts create mode 100644 test/ts-ref/div2.ts create mode 100644 test/ts-ref/div3.ts create mode 100644 test/ts-ref/div4.ts create mode 100644 test/ts-ref/ecrire1.ts create mode 100644 test/ts-ref/ecrire2.ts create mode 100644 test/ts-ref/egal1.ts create mode 100644 test/ts-ref/egal2.ts create mode 100644 test/ts-ref/egal3.ts create mode 100644 test/ts-ref/err5.ts create mode 100644 test/ts-ref/fibo.ts create mode 100644 test/ts-ref/inf1.ts create mode 100644 test/ts-ref/inf2.ts create mode 100644 test/ts-ref/inf3.ts create mode 100644 test/ts-ref/inf4.ts create mode 100644 test/ts-ref/modulo1.ts create mode 100644 test/ts-ref/mult1.ts create mode 100644 test/ts-ref/mult2.ts create mode 100644 test/ts-ref/mult3.ts create mode 100644 test/ts-ref/not1.ts create mode 100644 test/ts-ref/not2.ts create mode 100644 test/ts-ref/not3.ts create mode 100644 test/ts-ref/or1.ts create mode 100644 test/ts-ref/or2.ts create mode 100644 test/ts-ref/or3.ts create mode 100644 test/ts-ref/or4.ts create mode 100644 test/ts-ref/or5.ts create mode 100644 test/ts-ref/parenth1.ts create mode 100644 test/ts-ref/parenth2.ts create mode 100644 test/ts-ref/prio23-1.ts create mode 100644 test/ts-ref/prio23-2.ts create mode 100644 test/ts-ref/prio23-3.ts create mode 100644 test/ts-ref/prio23-4.ts create mode 100644 test/ts-ref/prio34-1.ts create mode 100644 test/ts-ref/prio34-2.ts create mode 100644 test/ts-ref/prio34-3.ts create mode 100644 test/ts-ref/prio34-4.ts create mode 100644 test/ts-ref/prio45-1.ts create mode 100644 test/ts-ref/prio45-2.ts create mode 100644 test/ts-ref/prio45-3.ts create mode 100644 test/ts-ref/prio45-4.ts create mode 100644 test/ts-ref/prio56-1.ts create mode 100644 test/ts-ref/prio56-2.ts create mode 100644 test/ts-ref/prio67-1.ts create mode 100644 test/ts-ref/prio67-2.ts create mode 100644 test/ts-ref/rec1.ts create mode 100644 test/ts-ref/si1.ts create mode 100644 test/ts-ref/si2.ts create mode 100644 test/ts-ref/si3.ts create mode 100644 test/ts-ref/si4.ts create mode 100644 test/ts-ref/si5.ts create mode 100644 test/ts-ref/sub1.ts create mode 100644 test/ts-ref/sub2.ts create mode 100644 test/ts-ref/sub3.ts create mode 100644 test/ts-ref/tab1.ts create mode 100644 test/ts-ref/tab2.ts create mode 100644 test/ts-ref/tab3.ts create mode 100644 test/ts-ref/tab4.ts create mode 100644 test/ts-ref/tantque1.ts create mode 100644 test/ts-ref/tantque2.ts create mode 100644 test/ts-ref/tri.ts create mode 100644 test/ts-ref/varglob1.ts create mode 100644 test/ts-ref/varglob2.ts create mode 100644 test/ts-ref/varglob3.ts create mode 100644 test/ts-ref/varglob4.ts create mode 100644 test/ts-ref/varloc1.ts create mode 100644 test/ts-ref/varloc2.ts create mode 100644 test/ts-ref/varloc3.ts create mode 100644 test/ts-ref/varloc4.ts create mode 100644 test/ts-ref/varloc5.ts diff --git a/sablecc/sablecc.jar b/sablecc/sablecc.jar new file mode 100644 index 0000000000000000000000000000000000000000..a6187d566eb5524116975e8e2ff324eafe1762c6 GIT binary patch literal 406885 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ℜo|7Ei<2QcD-x*Nvu`U^3sYkUQN%Ru-?6% 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 z	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	O(J0(;&dc)K&%e+d} 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⁡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 literal 0 HcmV?d00001 diff --git a/sablecc/sablecc_thesis.pdf b/sablecc/sablecc_thesis.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c76b634d006c34214caf5df1587f598d652480ed GIT binary patch literal 346444 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∾HeqSb^ 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ξy)@sR{5LR7;WJm^*7g<cnr7S| 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­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 SsEm!xEG&$<R8?L5-M9ed?rpCC literal 0 HcmV?d00001 diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..871caa1 --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,4 @@ +*\.class +*/*\.class +*/*/*\.class +*~ \ No newline at end of file diff --git a/src/C3aVM.java b/src/C3aVM.java new file mode 100644 index 0000000..a8bb341 --- /dev/null +++ b/src/C3aVM.java @@ -0,0 +1,67 @@ +import java.io.IOException; +import c3a.C3a; +import c3a.C3aEval; +import c3a.LoadC3a; +import ts.Ts; +import ts.TsParser; + +public class C3aVM { + private int verboseLevel = 0; + private TsParser stParser; + private String symbolsTableFileName; + private String C3AFileName; + private int stackSize; + private C3a code; + private Ts globalTable; + private LoadC3a loadC3a; + + public C3aVM(String symbolsTableFileName, String C3AFileName, int stackSize, int verboseLevel){ + this.stackSize = stackSize; + this.verboseLevel = verboseLevel; + this.symbolsTableFileName = symbolsTableFileName; + this.C3AFileName = C3AFileName; + stParser = new TsParser(); + this.globalTable = stParser.parse(symbolsTableFileName); + loadC3a = new LoadC3a(C3AFileName, this.globalTable); + this.code = loadC3a.getC3a(); + } + + + public void run() throws IOException { + if(verboseLevel > 0) + code.affiche(null); + C3aEval c3aEval = new C3aEval(code, globalTable, stackSize, verboseLevel); + code.accept(c3aEval); + c3aEval.affiche(null); + // eval.affiche(C3AFileName.substring(0, C3AFileName.length() - 4)); + + } + + public static void main(String[] args){ + int verboseLevel = 0; + String symbolsTableFileName = null; + String C3AFileName = null; + int stackSize = 10000; + + try { + for (int i = 0; i < args.length; i++) { + if(args[i].equals("-v")) + verboseLevel = Integer.parseInt(args[++i]); + else if(args[i].equals("-s")) + stackSize = Integer.parseInt(args[++i]); + else if(args[i].equals("-c3a")) + C3AFileName = args[++i]; + else if(args[i].equals("-ts")) + symbolsTableFileName = args[++i]; + } + if(C3AFileName == null || symbolsTableFileName == null){ + System.out.println("java C3aVM -c3a C3AFile -ts TSFile -s stackSize -v verboseLevel"); + System.exit(1); + } + C3aVM vm = new C3aVM(symbolsTableFileName, C3AFileName, stackSize, verboseLevel); + vm.run(); + }catch(IOException e){ + e.printStackTrace(); + } + } +} diff --git a/src/Compiler.java b/src/Compiler.java new file mode 100644 index 0000000..39aebb8 --- /dev/null +++ b/src/Compiler.java @@ -0,0 +1,215 @@ +import lParser.parser.*; +import lParser.lexer.*; +import lParser.node.*; +import java.io.*; +import sc.*; +import sa.*; +import ts.*; +import c3a.*; +import nasm.*; +import fg.*; +import ig.*; +import util.Error; + + +public class Compiler +{ + private static String baseName = null; + private static String inputFileName = null; + private static int verboseLevel = 0; + private static Start scRoot = null; + private static SaProg saRoot = null; + private static Ts tableGlobale = null; + private static C3a c3a = null; + private static Nasm nasm = null; + private static Fg flowGraph = null; + private static FgSolution flowGraphSolution = null; + private static Ig interferenceGraph = null; + + + public static void main(String[] args) { + processCommandLine(args); + System.out.println("[BUILD SC] "); + buildSc(); + /* System.out.println("[BUILD SA] "); + buildSa(); + System.out.println("[BUILD TS] "); + buildTs(); + System.out.println("[TYPE CHECKING]"); + typeCheck(); + System.out.println("[BUILD C3A] "); + buildC3a(); + System.out.println("[BUILD PRE NASM] "); + buildPreNasm(); + System.out.println("[BUILD FLOW GRAPH] "); + buildFg(); + System.out.println("[SOLVE FLOW GRAPH]"); + solveFg(); + System.out.println("[BUILD INTERFERENCE GRAPH] "); + buildIg(); + System.out.println("[ALLOCATE REGISTERS]"); + interferenceGraph.allocateRegisters(); + System.out.println("[PRINT NASM]"); + nasm.afficheNasm(baseName); + System.exit(Error.NOERROR.code());*/ + } + + private static void processCommandLine(String[] args) { + for (int i = 0; i < args.length; i++) { + if (args[i].equals("-v")) { + verboseLevel = Integer.parseInt(args[++i]); + } else { + inputFileName = args[i]; + baseName = removeSuffix(inputFileName, ".l"); + } + } + if (inputFileName == null) { + System.out.println("java Compiler input_file -v verbose_level"); + System.exit(1); + } + } + + private static void buildSc() { + PushbackReader fileReader = null; + Parser parser = null; + try { + fileReader = new PushbackReader(new FileReader(inputFileName)); + } catch (IOException e) { + System.err.println("cannot open input file"); + e.printStackTrace(); + } + try { + parser = new Parser(new Lexer(fileReader)); + scRoot = parser.parse(); + } catch (ParserException e) { + System.err.println("syntax error"); + e.printStackTrace(); + System.exit(Error.SYNT.code()); + } catch (LexerException e) { + System.err.println("lexical error"); + e.printStackTrace(); + System.exit(Error.LEX.code()); + } catch (IOException e) { + e.printStackTrace(); + } + if (verboseLevel > 1) { + System.out.println("[PRINT SC]"); + scRoot.apply(new Sc2Xml(baseName)); + } + } + + private static void buildSa() { + try { + Sc2sa sc2sa = new Sc2sa(); + scRoot.apply(sc2sa); + saRoot = sc2sa.getRoot(); + } catch (Exception ignored) { + } + PrintStream out = System.out; + if (verboseLevel > 1) { + System.out.println("[PRINT SA]"); + try { + out = new PrintStream(baseName + ".sa"); + } + catch (IOException e) { + System.err.println("Error: " + e.getMessage()); + } + out.println(saRoot); + //new Sa2Xml(saRoot, baseName); + } + } + + private static void buildTs() { + try { + Sa2ts sa2ts = new Sa2ts(); + saRoot.accept(sa2ts); + tableGlobale = sa2ts.getTableGlobale(); + SaCheckLinkage saCheckLinkage = new SaCheckLinkage(); + saCheckLinkage.visit(saRoot); + if (tableGlobale.getFct("main") == null) + throw new ErrorException(Error.TS, "la fonction main n'est pas définie"); + } catch (ErrorException e) { + System.err.print("ERREUR TABLE DES SYMBOLES : "); + System.err.println(e.getMessage()); + System.exit(e.getCode()); + } catch (Exception ignored) { + } + if (verboseLevel > 1) { + System.out.println("[PRINT TS]"); + tableGlobale.afficheTout(baseName); + } + } + + private static void typeCheck() { + new SaTypeCheck(saRoot); + } + + private static void buildC3a() { + try{ + Sa2c3a sa2c3a = new Sa2c3a(saRoot, tableGlobale); + saRoot.accept(sa2c3a); + c3a = sa2c3a.getC3a(); + } + catch(Exception e){} + + if (verboseLevel > 1) { + System.out.println("[PRINT C3A] "); + c3a.affiche(baseName); + } + } + + private static void buildPreNasm() { + C3a2nasm c3a2nasm = new C3a2nasm(c3a, tableGlobale); + c3a.accept(c3a2nasm); + nasm = c3a2nasm.getNasm(); + if (verboseLevel > 1) { + System.out.println("[PRINT PRE NASM] "); + nasm.affichePreNasm(baseName); + } + } + + + private static void buildFg() { + flowGraph = new Fg(nasm); + if (verboseLevel > 1) { + System.out.println("[PRINT FLOW GRAPH] "); + flowGraph.affiche(baseName); + } + } + + private static void solveFg() { + flowGraphSolution = new FgSolution(nasm, flowGraph); + if (verboseLevel > 1) { + System.out.println("[PRINT FLOW GRAPH SOLUTION] "); + flowGraphSolution.affiche(baseName); + } + } + + private static void buildIg() { + interferenceGraph = new Ig(flowGraphSolution); + if (verboseLevel > 1) { + System.out.println("[PRINT INTERFERENCE GRAPH] "); + interferenceGraph.affiche(baseName); + } + } + + + + /*catch (Exception e) + { + e.printStackTrace(); + System.out.println(e.getMessage()); + System.exit(1); + } + }*/ + + + public static String removeSuffix(final String s, final String suffix) + { + if (s != null && suffix != null && s.endsWith(suffix)){ + return s.substring(0, s.length() - suffix.length()); + } + return s; + } + +} diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..b64a54c --- /dev/null +++ b/src/Makefile @@ -0,0 +1,52 @@ +all: Compiler C3aVM NasmVM SaVM + +SaVM: SaVM.java saParser + javac SaVM.java + +NasmVM.jar : NasmVM + jar cmf NasmVM.mf NasmVM.jar NasmVM.class nasm + +C3aVM: C3aVM.java c3aParser + javac C3aVM.java + +NasmVM: NasmVM.java nasmParser + javac NasmVM.java + +Compiler.jar : Compiler + jar cmf Compiler.mf Compiler.jar *.class sc sa ts nasm util c3a fg ig lParser + +Compiler: Compiler.java lParser + javac Compiler.java + +lParser: l.cfg + java -jar ../sablecc/sablecc.jar l.cfg + +saParser: sa.cfg + java -jar ../sablecc/sablecc.jar sa.cfg + +c3aParser: c3a.cfg + java -jar ../sablecc/sablecc.jar c3a.cfg + +nasmParser: nasm.cfg + java -jar ../sablecc/sablecc.jar nasm.cfg + +ualParser: ual.cfg + java -jar ../sablecc/sablecc.jar ual.cfg + +clean: + -rm *.class + -rm sc/*.class + -rm sa/*.class + -rm c3a/*.class + -rm ts/*.class + -rm nasm/*.class + -rm fg/*.class + -rm ig/*.class + -rm util/intset/*.class + -rm util/graph/*.class + -rm util/*.class + -rm -r lParser + -rm -r saParser + -rm -r c3aParser + -rm -r nasmParser + diff --git a/src/NasmVM.java b/src/NasmVM.java new file mode 100644 index 0000000..28c41c6 --- /dev/null +++ b/src/NasmVM.java @@ -0,0 +1,66 @@ +import ts.Ts; +import ts.TsParser; +import nasm.NasmEval; +import nasm.Nasm; +import nasm.LoadNasm; +import java.io.IOException; + + +public class NasmVM { + private int verboseLevel; + private int stackSize; + private Nasm code; + private String nasmFileName; + + public NasmVM(String nasmFileName, int stackSize, int verboseLevel){ + this.nasmFileName = nasmFileName; + this.stackSize = stackSize; + this.verboseLevel = verboseLevel; + } + + public void run() throws IOException { + LoadNasm loadNasm = new LoadNasm(nasmFileName); + this.code = loadNasm.getNasm(); + + if(verboseLevel > 0) + code.afficheNasm(null); + + NasmEval eval = new NasmEval(code, stackSize, verboseLevel); + eval.displayOutput(); + } + + public static void main(String[] args){ + int verboseLevel = 0; + int stackSize = 10000; + String nasmFileName = null; + + try { + for (int i = 0; i < args.length; i++) { + if(args[i].equals("-v")) + verboseLevel = Integer.parseInt(args[++i]); + else if(args[i].equals("-s")) + stackSize = Integer.parseInt(args[++i]); + else if(args[i].equals("-nasm")) + nasmFileName = args[++i]; + } + if(nasmFileName == null){ + System.out.println("java NasmVM -nasm nasmFile -s stackSize -v verboseLevel"); + System.exit(1); + } + var vm = new NasmVM(nasmFileName, stackSize, verboseLevel); + vm.run(); + }catch(IOException e){ + e.printStackTrace(); + } + } +} + +/* + else{ + var pathTab = preNasmFilePath.split("/"); + var fileNamePreNasm = pathTab[pathTab.length - 1]; + var fileName = outputPath + fileNamePreNasm.substring(0, fileNamePreNasm.length()-3)+ ".out"; + vm.displayOutput(fileName); + } + } +*/ diff --git a/src/SaVM.java b/src/SaVM.java new file mode 100644 index 0000000..0588a6e --- /dev/null +++ b/src/SaVM.java @@ -0,0 +1,46 @@ +import sa.*; +import ts.*; + +public class SaVM { + + public static void main(String[] args) { + int verboseLevel = 0; + String saFileName = null; + + try { + for (int i = 0; i < args.length; i++) { + if(args[i].equals("-v")) + verboseLevel = Integer.parseInt(args[++i]); + else if(args[i].equals("-sa")) + saFileName = args[++i]; + } + if(saFileName == null){ + System.out.println("java SaVM -sa saFile -v verboseLevel"); + System.exit(1); + } + + if(verboseLevel > 0) + System.err.println("parsing xml document"); + if(verboseLevel > 0) + System.err.println("building sa tree"); + + SaProg prog = new LoadSa(saFileName).getRoot(); + if(verboseLevel > 0) + System.out.println(prog); + + if(verboseLevel > 0) + System.err.println("building symbol table"); + Sa2ts sa2ts = new Sa2ts(); + prog.accept(sa2ts); + Ts tableGlobale = sa2ts.getTableGlobale(); + + if(verboseLevel > 0) + System.err.println("evaluating sa tree"); + SaEval saEval = new SaEval(prog, tableGlobale); + saEval.affiche(null); + + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/c3a.cfg b/src/c3a.cfg new file mode 100644 index 0000000..0737c8b --- /dev/null +++ b/src/c3a.cfg @@ -0,0 +1,113 @@ +Package c3aParser; + +Helpers + +lettre = [['a' .. 'z'] + ['A' .. 'Z']]; +chiffre = ['0' .. '9']; +alpha = [lettre + ['_' + '$']]; +alphanum = [lettre + chiffre]; + +Tokens + +espaces = (' ' | 13 | 10 | 9)+; +commentaire= '#' [[0 .. 0xffff] - [10 + 13]]* (10 | 13 | 10 13); + + +co = '['; +cf = ']'; +call = 'call'; +stop = 'stop'; +fbegin = 'fbegin'; +fend = 'fend'; +aff = '='; +noteq = '!='; +inf = '<'; +infeq = '<='; +sup = '>'; +supeq = '>='; +eq = '=='; +goto = 'goto'; +param = 'param'; +ret = 'ret'; +if = 'if'; +moins = '-'; +plus = '+'; +fois = '*'; +divise = '/'; +write = 'write'; +read = 'read'; +nombre = chiffre+; +prefixe_temp = '@'; +identif = alpha alphanum*; + + +Ignored Tokens + +espaces, commentaire; + +Productions + +prog = listeinst; + +listeinst = {recursif} inst listeinst | + {final} inst + ; + +inst = {add} add | + {sub} sub | + {mul} mul | + {div} div | + {aff} affect | + {jmp} jmp | + {jmpeg} jmpeg | + {jmpneg} jmpneg | + {jmpinf} jmpinf | + {jminfeg} jmpinfeg | + {jmpsup} jmpsup | + {jmpsupeg} jmpsupeg | + {fcall} fcall | + {iwrite} iwrite | + {iread} iread | + {arg} arg | + {return} return | + {begin} begin | + {end} end | + {stop} istop + ; + +add = etiqop [result]:tv aff [op1]:ctv plus [op2]:ctv; +sub = etiqop [result]:tv aff [op1]:ctv moins [op2]:ctv; +mul = etiqop [result]:tv aff [op1]:ctv fois [op2]:ctv; +div = etiqop [result]:tv aff [op1]:ctv divise [op2]:ctv; +affect = etiqop [result]:tv aff [op1]:ctv; +jmpeg = etiqop if [op1]:ctv eq [op2]:ctv goto [result]:constante; +jmpneg = etiqop if [op1]:ctv noteq [op2]:ctv goto [result]:constante; +jmpinf = etiqop if [op1]:ctv inf [op2]:ctv goto [result]:constante; +jmpinfeg = etiqop if [op1]:ctv infeq [op2]:ctv goto [result]:constante; +jmpsup = etiqop if [op1]:ctv sup [op2]:ctv goto [result]:constante; +jmpsupeg = etiqop if [op1]:ctv supeq [op2]:ctv goto [result]:constante; +jmp = etiqop goto [result]:constante; +begin = identif fbegin; +end = etiqop fend; +fcall = etiqop [result]:tv aff call identif; +iwrite = etiqop write ctv; +iread = etiqop [result]:tv aff read; +arg = etiqop param ctv; +return = etiqop ret ctv; +istop = etiqop stop ctv; + + +ctv = {c} constante | {t} temporaire | {v} variable; +tv = {t} temporaire | {v} variable; + +constante = nombre; + +temporaire = prefixe_temp nombre; + +variable = {scalaire} identif | + {tab} identif co ctv cf + ; + +etiqop = {cte} nombre | + {vide} + ; diff --git a/src/c3a/C3a.java b/src/c3a/C3a.java new file mode 100644 index 0000000..9fe8ad5 --- /dev/null +++ b/src/c3a/C3a.java @@ -0,0 +1,87 @@ +package c3a; +import java.util.*; +import java.io.*; +import ts.*; +import sa.*; + + +public class C3a{ + public List<C3aInst> listeInst; + // compteur des temporaires, pour générer des noms uniques + private int tempCounter; + // étiquette de la prochaine instruction, on retarde l'ajout de l'étiquette + private C3aLabel nextLabel; + private int labelCounter; + public C3aConstant True; + public C3aConstant False; + + public C3a(){ + this.listeInst = new ArrayList<C3aInst>(); + this.labelCounter = 0; + this.tempCounter = 0; + this.nextLabel = null; + this.True = new C3aConstant(1); // constantes utilisées partout + this.False = new C3aConstant(0); // constantes utilisées partout + } + + public int getTempCounter(){return this.tempCounter;} + public void setTempCounter(int value){this.tempCounter = value;} + public int getLabelCounter(){return this.labelCounter;} + public void setLableCounter(int value){this.labelCounter = value;} + + public void ajouteInst(C3aInst inst){ + if(this.nextLabel != null){ + inst.setLabel(this.nextLabel); + this.nextLabel = null; + } + this.listeInst.add(inst); + } + + public C3aLabel newAutoLabel(){ + return new C3aLabel(this.labelCounter++); + } + + public C3aTemp newTemp(){ + return new C3aTemp(this.tempCounter++); + } + + public void addLabelToNextInst(C3aLabel label){ + if(this.nextLabel != null){ + label.affect(this.nextLabel); + System.err.println("WARNING : Étiquette précédente ignorée " + this.nextLabel.getNumber()); + } + this.nextLabel = label; + // if(etiquette->oper_type == O_ETIQUETTE){ + // etiquette->u.oper_etiquette.ligne = c3a->next; + //} + //if(etiquette->oper_type == O_FCT){ + // etiquette->u.oper_fct->adresse = c3a->next; + //} + } + + public void affiche(String baseFileName){ + String fileName; + PrintStream out = System.out; + + if (baseFileName != null){ + try { + baseFileName = baseFileName; + fileName = baseFileName + ".c3a"; + out = new PrintStream(fileName); + } + + catch (IOException e) { + System.err.println("Error: " + e.getMessage()); + } + } + Iterator<C3aInst> iter = this.listeInst.iterator(); + while(iter.hasNext()){ + out.println(iter.next()); + } + } + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } + +} + diff --git a/src/c3a/C3aBooleanConstant.java b/src/c3a/C3aBooleanConstant.java new file mode 100644 index 0000000..419e5e9 --- /dev/null +++ b/src/c3a/C3aBooleanConstant.java @@ -0,0 +1,15 @@ +package c3a; + +public class C3aBooleanConstant extends C3aOperand{ + public boolean val; + + public C3aBooleanConstant(boolean val){ + this.val = val; + } + + public String toString(){return String.valueOf(this.val);} + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } +} diff --git a/src/c3a/C3aConstant.java b/src/c3a/C3aConstant.java new file mode 100644 index 0000000..657cdd3 --- /dev/null +++ b/src/c3a/C3aConstant.java @@ -0,0 +1,15 @@ +package c3a; + +public class C3aConstant extends C3aOperand{ + public int val; + + public C3aConstant(int val){ + this.val = val; + } + + public String toString(){return Integer.toString(this.val);} + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } +} diff --git a/src/c3a/C3aEval.java b/src/c3a/C3aEval.java new file mode 100644 index 0000000..e1f2fd2 --- /dev/null +++ b/src/c3a/C3aEval.java @@ -0,0 +1,385 @@ +package c3a; +import java.util.*; +import java.io.*; +import ts.*; +import util.Memory; +import util.Type; + +public class C3aEval implements C3aVisitor <Integer> { + private C3a c3a; + private Ts tableGlobale; + private int nbReg; + private int[] reg; + private int[] stack; + private Memory varGlob; + private int eip; + private int ebp; + private int esp; + private int stackSize; + private Map< Integer, Integer> label2index; + private Map< String, Integer> function2index; + private boolean debug; + private boolean stop; + private ArrayList<String> programOutput = new ArrayList<String>(); + private TsItemFct currentFct; + private Stack<TsItemFct> stackCurrentFct; + + private C3aOperand storeReturnValue; + private Stack<C3aOperand> stackStoreReturnValue; + private int verboseLevel; + + + public C3aEval(C3a c3a, Ts tableGlobale, int stackSize, int verboseLevel){ + debug = true; + this.verboseLevel = verboseLevel; + this.c3a = c3a; + stack = new int[stackSize]; + nbReg = c3a.getTempCounter(); + reg = new int[nbReg]; + esp = 0; + varGlob = new Memory(tableGlobale.getAdrVarCourante(), 0); + this.tableGlobale = tableGlobale; + this.currentFct = null; + storeReturnValue = null; + label2index = new HashMap< Integer, Integer>(); + function2index = new HashMap< String, Integer>(); + C3aInst c3aInst = null; + stackCurrentFct = new Stack<>(); + stackStoreReturnValue = new Stack<>(); + eip = 0; + + for(int i = 0; i < c3a.listeInst.size(); i++){ + c3aInst = c3a.listeInst.get(i); + if(c3aInst.label != null){ + label2index.put(c3aInst.label.number, i); + } + if(c3aInst instanceof C3aInstFBegin){ + String identif = ((C3aInstFBegin)c3aInst).val.identif; + function2index.put(identif, i); + } + } + + } + + public C3a getC3a(){ + return this.c3a; + } + public void afficheEtat(C3aInst inst){ + System.out.println("---------------------------------------------"); + System.out.println("eip = " + eip + "\tesp = " + esp + "\tebp = " + ebp); + System.out.print("PILE : "); + affichePile(); + System.out.print("REGISTRES : "); + afficheReg(); + System.out.println(inst); + } + + + + public void affiche(String baseFileName){ + String fileName; + PrintStream out = System.out; + + if (baseFileName != null){ + try { + baseFileName = baseFileName; + fileName = baseFileName + ".c3aout"; + out = new PrintStream(fileName); + } + + catch (IOException e) { + System.err.println("Error: " + e.getMessage()); + } + } + for (String line : programOutput) + out.println(line); + } + + + public void affichePileVertical(){ + for(int i = esp-1; i >= 0; i--){ + System.out.println(i + ":" + stack[i]); + } + } + + public void affichePile(){ + for(int i = 0; i < esp; i++){ + System.out.print(stack[i] + " "); + } + System.out.println(""); + + } + + public void push(int i){ + if(esp == stackSize){ + System.out.println("stack overflow !!!"); + System.exit(1); + } + stack[esp] = i; + esp++; + } + + public void afficheReg(){ + for(int i=0; i <nbReg; i++) + System.out.print(i + ":" + reg[i] + " "); + System.out.println(""); + } + + public void pushReg(){ + // System.out.println("pushReg " + nbReg + " registers"); + for(int i=0; i <nbReg; i++) + push(reg[i]); + } + + public void popReg(){ + // System.out.println("popReg " + nbReg + " registers"); + for(int i=nbReg-1; i >=0; i--) + reg[i] = pop(); + } + + public int pop(){ + if(esp == 0){ + System.out.println("cannot pop empty stack !!!"); + System.exit(1); + } + esp--; + return stack[esp]; + } + + public Integer visit(C3a c3a){ + stop = false; + C3aInst c3aInst; + while(!stop){ + c3aInst = c3a.listeInst.get(eip); + // System.out.println("<" + c3aInst.getClass().getSimpleName() + ">"); + if(verboseLevel > 0) + afficheEtat(c3aInst); + + c3aInst.accept(this); + } + return 0; + } + public Integer visit(C3aConstant constant){ + return constant.val; + } + + public Integer visit(C3aBooleanConstant constant){ + return (constant.val == true)? 1 : 0; + } + + public Integer visit(C3aTemp temp){ + return reg[temp.num]; + } + + public Integer visit(C3aVar var){ + int adresse = var.item.adresse; + Type type = var.item.type; + // variable globale + if(var.item.portee == this.tableGlobale){ + int offset = (var.index != null)? var.index.accept(this) : 0; + // return varGlob[adresse/4 + offset]; + // System.out.println("adresse = " + adresse + " taille = " + type.taille()); + return varGlob.readNBytes(adresse + offset * type.taille(), type.taille()); + } + if(var.item.isParam){ // parametre + int nbArgs = this.currentFct.nbArgs; + return stack[ebp - 2 - nbArgs + adresse / 4]; + } + // variable locale + return stack[ebp + 1 + adresse / 4]; + } + + public void affect(C3aOperand op, int val){ + if(op instanceof C3aVar){ + C3aVar var = (C3aVar) op; + int adresse = var.item.adresse; + int size = var.item.getType().taille(); + // variable globale + if(var.item.portee == this.tableGlobale){ + int offset = (var.index != null)? var.index.accept(this) : 0; + varGlob.writeInt(adresse + offset * size, val); + } + else if(var.item.isParam){ // parametre + int nbArgs = this.currentFct.nbArgs; + stack[ebp - 2 - nbArgs + adresse/4] = val; + } + else // variable locale + stack[ebp + 1 + adresse/4] = val; + } + else if(op instanceof C3aTemp){ + C3aTemp temp = (C3aTemp) op; + reg[temp.num] = val; + } + } + + public Integer visit(C3aFunction fct){ + return null; + } + + public Integer visit(C3aLabel label){ + return label.number; + } + /*--------------------------------------------------------------------------------------------------------------*/ + + public Integer visit(C3aInstStop inst){ + stop = true; + return null; + } + + public Integer visit(C3aInstAdd inst){ + //if(debug){afficheEtat(inst);} + affect(inst.result, inst.op1.accept(this) + inst.op2.accept(this)); + eip++; + return null; + } + + public Integer visit(C3aInstSub inst){ + //if(debug){afficheEtat(inst);} + affect(inst.result, inst.op1.accept(this) - inst.op2.accept(this)); + eip++; + return null; + } + + public Integer visit(C3aInstMult inst){ + //if(debug){afficheEtat(inst);} + affect(inst.result, inst.op1.accept(this) * inst.op2.accept(this)); + eip++; + return null; + } + + public Integer visit(C3aInstDiv inst){ + //if(debug){afficheEtat(inst);} + affect(inst.result, inst.op1.accept(this) / inst.op2.accept(this)); + eip++; + return null; + } + + public Integer visit(C3aInstJumpIfLess inst){ + //if(debug){afficheEtat(inst);} + if(inst.op1.accept(this) < inst.op2.accept(this)) + eip = label2index.get(inst.result.accept(this)); + else + eip++; + return null; + } + + public Integer visit(C3aInstJumpIfEqual inst){ + //if(debug){afficheEtat(inst);} + if(inst.op1.accept(this) == inst.op2.accept(this)) + eip = label2index.get(inst.result.accept(this)); + else + eip++; + return null; + } + + public Integer visit(C3aInstJumpIfNotEqual inst){ + //if(debug){afficheEtat(inst);} + if(inst.op1.accept(this) != inst.op2.accept(this)) + eip = label2index.get(inst.result.accept(this)); + else + eip++; + return null; + } + + public Integer visit(C3aInstJump inst){ + //if(debug){afficheEtat(inst);} + eip = label2index.get(inst.result.accept(this)); + return null; + } + + public Integer visit(C3aInstAffect inst){ + //if(debug){afficheEtat(inst);} + affect(inst.result, inst.op1.accept(this)); + eip++; + return null; + } + + public Integer visit(C3aInstParam inst){ + //if(debug){afficheEtat(inst);} + push(inst.op1.accept(this)); + eip++; + return null; + } + + public Integer visit(C3aInstReturn inst){ + //if(debug){afficheEtat(inst);} + stack[ebp - 2] = (inst.op1 != null)? inst.op1.accept(this) : 0; + eip++; + return null; + } + + public Integer visit(C3aInstWrite inst){ + //if(debug){afficheEtat(inst);} + programOutput.add(inst.op1.accept(this).toString()); + eip++; + return null; + } + + public Integer visit(C3aInstCall inst){ + //if(debug){afficheEtat(inst);} + // storeReturnValue = inst.result; + stackStoreReturnValue.push(inst.result); + // allocation mémoire pour la valeur de retour + //if(debug){System.out.println("allocation mémoire pour la valeur de retour, esp++");} + esp++; + //if(debug){System.out.println("sauvegarde de l'index de l'instruction à effectuer après l'appel : push(eip + 1)");} + push(eip + 1); + stackCurrentFct.push(currentFct); + eip = function2index.get(inst.op1.val.identif); + return null; + } + + public Integer visit(C3aInstFBegin inst){ + //if(debug){afficheEtat(inst);} + currentFct = inst.val; + int nbVarLoc = currentFct.getTable().getAdrVarCourante(); + + //if(debug){System.out.println("sauvegarde de l'ancienne valeur de ebp");} + push(ebp); + //if(debug){System.out.println("nouvelle valeur de ebp");} + ebp = esp - 1; + //if(debug){System.out.println("allocation des variables locales");} + esp = esp + nbVarLoc; + pushReg(); + eip++; + return null; + } + + public Integer visit(C3aInstFEnd inst){ + //if(debug){afficheEtat(inst);} + int nbVarLoc = currentFct.getTable().getAdrVarCourante(); + int nbParam = currentFct.nbArgs; + popReg(); + esp = esp - nbVarLoc; + ebp = pop(); + eip = pop(); + int rv = pop(); + storeReturnValue = stackStoreReturnValue.pop(); + if(storeReturnValue != null){ + affect(storeReturnValue, rv); + storeReturnValue = null; + } + currentFct = stackCurrentFct.pop(); + esp = esp - nbParam; + return null; + } + + public Integer visit(C3aInstRead inst){ + /* Int label = (inst.label != null) ? inst.label.accept(this) : null; + Int result = inst.result.accept(this); + NasmRegister reg_eax = nasm.newRegister(); + reg_eax.colorRegister(Nasm.REG_EAX); + + nasm.ajouteInst(new NasmMov (label, reg_eax, new NasmLabel("sinput"), "Read 1")); + nasm.ajouteInst(new NasmCall(null, new NasmLabel("readline"), "Read 2")); + nasm.ajouteInst(new NasmMov (null, reg_eax, new NasmLabel("sinput"), "Read 3")); + nasm.ajouteInst(new NasmMov (null, result, reg_eax , "Read 4"));*/ + eip++; + return null; + } + + + public Integer visit(C3aInst inst){ + return null;} + +} diff --git a/src/c3a/C3aFunction.java b/src/c3a/C3aFunction.java new file mode 100644 index 0000000..5966b6a --- /dev/null +++ b/src/c3a/C3aFunction.java @@ -0,0 +1,20 @@ +package c3a; +import ts.*; + + +public class C3aFunction extends C3aOperand{ + public TsItemFct val; + + public C3aFunction(TsItemFct val){ + this.val = val; + } + + public TsItemFct getValue(){return val;} + + public String toString(){ + return this.val.getIdentif(); + } + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } +} diff --git a/src/c3a/C3aInst.java b/src/c3a/C3aInst.java new file mode 100644 index 0000000..9aafc68 --- /dev/null +++ b/src/c3a/C3aInst.java @@ -0,0 +1,16 @@ +package c3a; + +public class C3aInst{ + public C3aLabel label ; // étiquette optionnelle, si la ligne est cible d'un saut + public String comment; // commentaire explicatif - utile pour le débogage + + public void setLabel(C3aLabel label){ + this.label = label; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } + +} + diff --git a/src/c3a/C3aInstAdd.java b/src/c3a/C3aInstAdd.java new file mode 100644 index 0000000..49b9d92 --- /dev/null +++ b/src/c3a/C3aInstAdd.java @@ -0,0 +1,27 @@ +package c3a; + +public class C3aInstAdd extends C3aInst{ + public C3aOperand op1; // opérande 1 (ou null) + public C3aOperand op2; // opérande 2 (ou null) + public C3aOperand result; // résultat ou destination du saut (ou NULL) + + public C3aInstAdd(C3aOperand op1, C3aOperand op2, C3aOperand result, String comment){ + this.op1 = op1; + this.op2 = op2; + this.result = result; + this.comment = comment; + } + + public String toString(){ + if(this.label != null) + return this.label + "\t" + this.result + " = " + this.op1 + " + " + this.op2 + this.comment; + else + return "\t" + this.result + " = " + this.op1 + " + " + this.op2 + this.comment; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } + +} + diff --git a/src/c3a/C3aInstAffect.java b/src/c3a/C3aInstAffect.java new file mode 100644 index 0000000..8596b7b --- /dev/null +++ b/src/c3a/C3aInstAffect.java @@ -0,0 +1,27 @@ +package c3a; + +public class C3aInstAffect extends C3aInst{ + public C3aOperand op1; // opérande 1 (ou null) + public C3aOperand result; // résultat ou destination du saut (ou NULL) + + public C3aInstAffect(C3aOperand op1, C3aOperand result, String comment){ + this.op1 = op1; + this.result = result; + this.comment = comment; + } + + public String toString(){ + String s = ""; + if(this.label != null) s = s + this.label; + s = s + "\t"; + s = s + this.result + " = " + this.op1 + this.comment; + return s; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } + + +} + diff --git a/src/c3a/C3aInstCall.java b/src/c3a/C3aInstCall.java new file mode 100644 index 0000000..dc5794f --- /dev/null +++ b/src/c3a/C3aInstCall.java @@ -0,0 +1,28 @@ +package c3a; + +public class C3aInstCall extends C3aInst{ + public C3aFunction op1; // opérande 1 (ou null) + public C3aOperand result; // résultat ou destination du saut (ou NULL) + + public C3aInstCall(C3aFunction op1, C3aOperand result, String comment){ + this.op1 = op1; + this.result = result; + this.comment = comment; + } + + public String toString(){ + String s = ""; + if(this.label != null) + s = s + this.label; + s = s + "\t"; + if(this.result != null) + s = s + this.result + " ="; + s = s + " call " + this.op1 + this.comment; + return s; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } +} + diff --git a/src/c3a/C3aInstDiv.java b/src/c3a/C3aInstDiv.java new file mode 100644 index 0000000..77885d1 --- /dev/null +++ b/src/c3a/C3aInstDiv.java @@ -0,0 +1,27 @@ +package c3a; + +public class C3aInstDiv extends C3aInst{ + public C3aOperand op1; // opérande 1 (ou null) + public C3aOperand op2; // opérande 2 (ou null) + public C3aOperand result; // résultat ou destination du saut (ou NULL) + + public C3aInstDiv(C3aOperand op1, C3aOperand op2, C3aOperand result, String comment){ + this.op1 = op1; + this.op2 = op2; + this.result = result; + this.comment = comment; + } + + public String toString(){ + if(this.label != null) + return this.label + "\t" + this.result + " = " + this.op1 + " / " + this.op2 + this.comment; + else + return "\t" + this.result + " = " + this.op1 + " / " + this.op2 + this.comment; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } + +} + diff --git a/src/c3a/C3aInstFBegin.java b/src/c3a/C3aInstFBegin.java new file mode 100644 index 0000000..c8a5f2c --- /dev/null +++ b/src/c3a/C3aInstFBegin.java @@ -0,0 +1,23 @@ +package c3a; +import ts.*; + +public class C3aInstFBegin extends C3aInst{ + public TsItemFct val; + public C3aInstFBegin(TsItemFct val, String comment){ + this.val = val; + this.comment = comment; + } + + public String toString(){ + // String s = ""; + // if(this.label != null) + // s = s + this.label; + return this.val.getIdentif() + "\tfbegin\t#" + this.comment; + // return s; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } +} + diff --git a/src/c3a/C3aInstFEnd.java b/src/c3a/C3aInstFEnd.java new file mode 100644 index 0000000..8e0380f --- /dev/null +++ b/src/c3a/C3aInstFEnd.java @@ -0,0 +1,21 @@ +package c3a; + +public class C3aInstFEnd extends C3aInst{ + public C3aInstFEnd(String comment){ + this.comment = comment; + } + + public String toString(){ + String s = ""; + if(this.label != null) + s = s + this.label; + s = s + "\t"; + s = s + "fend"; + return s; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } +} + diff --git a/src/c3a/C3aInstJump.java b/src/c3a/C3aInstJump.java new file mode 100644 index 0000000..1324e5e --- /dev/null +++ b/src/c3a/C3aInstJump.java @@ -0,0 +1,24 @@ +package c3a; + +public class C3aInstJump extends C3aInst{ + public C3aOperand result; // résultat ou destination du saut (ou NULL) + + public C3aInstJump(C3aOperand result, String comment){ + this.result = result; + this.comment = comment; + } + + public String toString(){ + String s = ""; + if(this.label != null) + s = s + this.label; + s = s + "\t"; + s = s + "goto " + this.result; + return s; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } +} + diff --git a/src/c3a/C3aInstJumpIfEqual.java b/src/c3a/C3aInstJumpIfEqual.java new file mode 100644 index 0000000..98bdb79 --- /dev/null +++ b/src/c3a/C3aInstJumpIfEqual.java @@ -0,0 +1,27 @@ +package c3a; + +public class C3aInstJumpIfEqual extends C3aInst{ + public C3aOperand op1; // opérande 1 (ou null) + public C3aOperand op2; // opérande 2 (ou null) + public C3aOperand result; // résultat ou destination du saut (ou NULL) + + public C3aInstJumpIfEqual(C3aOperand op1, C3aOperand op2, C3aOperand result, String comment){ + this.op1 = op1; + this.op2 = op2; + this.result = result; + this.comment = comment; + } + + public String toString(){ + String s = ""; + if(this.label != null) + s = s + this.label; + s = s + "\tif " + this.op1 + " == " + this.op2 + " goto " + this.result; + return s; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } +} + diff --git a/src/c3a/C3aInstJumpIfLess.java b/src/c3a/C3aInstJumpIfLess.java new file mode 100644 index 0000000..a88a20e --- /dev/null +++ b/src/c3a/C3aInstJumpIfLess.java @@ -0,0 +1,28 @@ +package c3a; + +public class C3aInstJumpIfLess extends C3aInst{ + public C3aOperand op1; // opérande 1 (ou null) + public C3aOperand op2; // opérande 2 (ou null) + public C3aOperand result; // résultat ou destination du saut (ou NULL) + + public C3aInstJumpIfLess(C3aOperand op1, C3aOperand op2, C3aOperand result, String comment){ + this.op1 = op1; + this.op2 = op2; + this.result = result; + this.comment = comment; + } + + public String toString(){ + String s = ""; + if(this.label != null) + s = s + this.label; + s = s + "\t"; + s = s + "if " + this.op1 + " < " + this.op2 + " goto " + this.result; + return s; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } +} + diff --git a/src/c3a/C3aInstJumpIfNotEqual.java b/src/c3a/C3aInstJumpIfNotEqual.java new file mode 100644 index 0000000..06bc8c4 --- /dev/null +++ b/src/c3a/C3aInstJumpIfNotEqual.java @@ -0,0 +1,27 @@ +package c3a; + +public class C3aInstJumpIfNotEqual extends C3aInst{ + public C3aOperand op1; // opérande 1 (ou null) + public C3aOperand op2; // opérande 2 (ou null) + public C3aOperand result; // résultat ou destination du saut (ou NULL) + + public C3aInstJumpIfNotEqual(C3aOperand op1, C3aOperand op2, C3aOperand result, String comment){ + this.op1 = op1; + this.op2 = op2; + this.result = result; + this.comment = comment; + } + + public String toString(){ + String s = ""; + if(this.label != null) + s = s + this.label; + s = s + "\tif " + this.op1 + " != " + this.op2 + " goto " + this.result; + return s; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } +} + diff --git a/src/c3a/C3aInstMult.java b/src/c3a/C3aInstMult.java new file mode 100644 index 0000000..282d20a --- /dev/null +++ b/src/c3a/C3aInstMult.java @@ -0,0 +1,27 @@ +package c3a; + +public class C3aInstMult extends C3aInst{ + public C3aOperand op1; // opérande 1 (ou null) + public C3aOperand op2; // opérande 2 (ou null) + public C3aOperand result; // résultat ou destination du saut (ou NULL) + + public C3aInstMult(C3aOperand op1, C3aOperand op2, C3aOperand result, String comment){ + this.op1 = op1; + this.op2 = op2; + this.result = result; + this.comment = comment; + } + + public String toString(){ + if(this.label != null) + return this.label + "\t" + this.result + " = " + this.op1 + " * " + this.op2 + this.comment; + else + return "\t" + this.result + " = " + this.op1 + " * " + this.op2 + this.comment; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } + +} + diff --git a/src/c3a/C3aInstParam.java b/src/c3a/C3aInstParam.java new file mode 100644 index 0000000..44b96e2 --- /dev/null +++ b/src/c3a/C3aInstParam.java @@ -0,0 +1,25 @@ +package c3a; + +public class C3aInstParam extends C3aInst{ + public C3aOperand op1; // opérande 1 (ou null) + + public C3aInstParam(C3aOperand op1, String comment){ + this.op1 = op1; + this.comment = comment; + } + + public String toString(){ + String s = ""; + if(this.label != null) + s = s + this.label; + s = s + "\t"; + s = s + "param " + this.op1; + return s; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } + +} + diff --git a/src/c3a/C3aInstRead.java b/src/c3a/C3aInstRead.java new file mode 100644 index 0000000..4586c03 --- /dev/null +++ b/src/c3a/C3aInstRead.java @@ -0,0 +1,25 @@ +package c3a; + +public class C3aInstRead extends C3aInst{ + public C3aOperand result; // résultat ou destination du saut (ou NULL) + + public C3aInstRead(C3aOperand result, String comment){ + this.result = result; + this.comment = comment; + } + + public String toString(){ + String s = ""; + if(this.label != null) + s = s + this.label; + s = s + "\t"; + s = s + this.result + " = read #" + this.comment; + return s; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } + +} + diff --git a/src/c3a/C3aInstReturn.java b/src/c3a/C3aInstReturn.java new file mode 100644 index 0000000..48d47a3 --- /dev/null +++ b/src/c3a/C3aInstReturn.java @@ -0,0 +1,25 @@ +package c3a; + +public class C3aInstReturn extends C3aInst{ + public C3aOperand op1; // opérande 1 (ou null) + + public C3aInstReturn(C3aOperand op1, String comment){ + this.op1 = op1; + this.comment = comment; + } + + public String toString(){ + String s = ""; + if(this.label != null) + s = s + this.label; + s = s + "\t"; + s = s + "ret " + this.op1; + return s; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } + +} + diff --git a/src/c3a/C3aInstStop.java b/src/c3a/C3aInstStop.java new file mode 100644 index 0000000..12404d5 --- /dev/null +++ b/src/c3a/C3aInstStop.java @@ -0,0 +1,27 @@ +package c3a; + +public class C3aInstStop extends C3aInst{ + public C3aOperand returnValue; + + public C3aInstStop(C3aOperand returnValue, String comment){ + this.returnValue = returnValue; + this.comment = comment; + } + + public String toString(){ + String s = ""; + if(this.label != null) + s = s + this.label; + s = s + "\t"; + s = s + "stop "; + if(this.returnValue != null) + s = s + this.returnValue; + s = s + this.comment; + return s; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } +} + diff --git a/src/c3a/C3aInstSub.java b/src/c3a/C3aInstSub.java new file mode 100644 index 0000000..18a9853 --- /dev/null +++ b/src/c3a/C3aInstSub.java @@ -0,0 +1,27 @@ +package c3a; + +public class C3aInstSub extends C3aInst{ + public C3aOperand op1; // opérande 1 (ou null) + public C3aOperand op2; // opérande 2 (ou null) + public C3aOperand result; // résultat ou destination du saut (ou NULL) + + public C3aInstSub(C3aOperand op1, C3aOperand op2, C3aOperand result, String comment){ + this.op1 = op1; + this.op2 = op2; + this.result = result; + this.comment = comment; + } + + public String toString(){ + if(this.label != null) + return this.label + "\t" + this.result + " = " + this.op1 + " - " + this.op2 + this.comment; + else + return "\t" + this.result + " = " + this.op1 + " - " + this.op2 + this.comment; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } + +} + diff --git a/src/c3a/C3aInstWrite.java b/src/c3a/C3aInstWrite.java new file mode 100644 index 0000000..0e1b1a7 --- /dev/null +++ b/src/c3a/C3aInstWrite.java @@ -0,0 +1,26 @@ +package c3a; + +public class C3aInstWrite extends C3aInst{ + public C3aOperand op1; // opérande 1 (ou null) + public C3aOperand result; // résultat ou destination du saut (ou NULL) + + public C3aInstWrite(C3aOperand op1, String comment){ + this.op1 = op1; + this.comment = comment; + } + + public String toString(){ + String s = ""; + if(this.label != null) + s = s + this.label; + s = s + "\t"; + s = s + "write " + this.op1 + "\t" + this.comment; + return s; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } + +} + diff --git a/src/c3a/C3aLabel.java b/src/c3a/C3aLabel.java new file mode 100644 index 0000000..f70d1c3 --- /dev/null +++ b/src/c3a/C3aLabel.java @@ -0,0 +1,29 @@ +package c3a; + +public class C3aLabel extends C3aOperand{ + public int number; // numéro de l'étiquette + private int line; // ligne de l'opération correspondant à l'étiquette + // public String name; + + // public C3aLabel(int number, int line, String name){ + public C3aLabel(int number){ + this.number = number; + this.line = 0; + // this.name = name; + } + + public int getNumber(){return this.number;} + public int getLine(){return this.line;} + + public String toString(){return String.valueOf(this.number);} +// public String toString(){return "l" + this.number;} + + public void affect(C3aLabel other) { + this.number = other.number; + this.line = other.line; + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } +} diff --git a/src/c3a/C3aOp.java b/src/c3a/C3aOp.java new file mode 100644 index 0000000..e03daf6 --- /dev/null +++ b/src/c3a/C3aOp.java @@ -0,0 +1,24 @@ +package c3a; + +public enum C3aOp{ + arithAdd, + arithSub, + arithMult, + arithDiv, + funcCall, + funcParam, + funcValRet, + funcBegin, + funcEnd, + assign, //affectation et transferts temporaires <-> variables + alloc, // allouer de la place pour variables + jump, + jump_if_less, + jump_if_less_or_equal, + jumpIfEqual, + jump_if_not_equal, + jump_if_greater, + jump_if_greater_or_equal, + sys_read, + sys_write; // lire et écrire (interruptions système) +} diff --git a/src/c3a/C3aOperand.java b/src/c3a/C3aOperand.java new file mode 100644 index 0000000..7744c0d --- /dev/null +++ b/src/c3a/C3aOperand.java @@ -0,0 +1,7 @@ +package c3a; + +public abstract class C3aOperand { + + public abstract <T> T accept(C3aVisitor <T> visitor); + +} diff --git a/src/c3a/C3aTemp.java b/src/c3a/C3aTemp.java new file mode 100644 index 0000000..6958c45 --- /dev/null +++ b/src/c3a/C3aTemp.java @@ -0,0 +1,16 @@ +package c3a; + +public class C3aTemp extends C3aOperand{ + public int num; + + public C3aTemp(int num){ + this.num = num; + } + + public String toString(){ + return "@" + this.num; + } + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } +} diff --git a/src/c3a/C3aVar.java b/src/c3a/C3aVar.java new file mode 100644 index 0000000..dcef2c2 --- /dev/null +++ b/src/c3a/C3aVar.java @@ -0,0 +1,24 @@ +package c3a; +import ts.*; + +public class C3aVar extends C3aOperand{ + public TsItemVar item; + public C3aOperand index; + + public C3aVar(TsItemVar item, C3aOperand index){ + this.item = item; + this.index = index; + } + + public String toString(){ + if(this.index != null) + // return this.item.getIdentif() + "[" + this.item.getTaille() + "]"; + return this.item.getIdentif() + "[" + this.index + "]"; + else + return this.item.getIdentif(); + } + + public <T> T accept(C3aVisitor <T> visitor) { + return visitor.visit(this); + } +} diff --git a/src/c3a/C3aVisitor.java b/src/c3a/C3aVisitor.java new file mode 100644 index 0000000..b8f2b96 --- /dev/null +++ b/src/c3a/C3aVisitor.java @@ -0,0 +1,30 @@ +package c3a; + +public interface C3aVisitor <T> { + public T visit(C3a c3a); + public T visit(C3aInstAdd inst); + public T visit(C3aInstCall inst); + public T visit(C3aInstFBegin inst); + public T visit(C3aInst inst); + public T visit(C3aInstJumpIfLess inst); + public T visit(C3aInstMult inst); + public T visit(C3aInstRead inst); + public T visit(C3aInstSub inst); + public T visit(C3aInstAffect inst); + public T visit(C3aInstDiv inst); + public T visit(C3aInstFEnd inst); + public T visit(C3aInstJumpIfEqual inst); + public T visit(C3aInstJumpIfNotEqual inst); + public T visit(C3aInstJump inst); + public T visit(C3aInstParam inst); + public T visit(C3aInstReturn inst); + public T visit(C3aInstWrite inst); + public T visit(C3aInstStop inst); + + public T visit(C3aConstant oper); + public T visit(C3aBooleanConstant oper); + public T visit(C3aLabel oper); + public T visit(C3aTemp oper); + public T visit(C3aVar oper); + public T visit(C3aFunction oper); +} diff --git a/src/c3a/LoadC3a.java b/src/c3a/LoadC3a.java new file mode 100644 index 0000000..c321ea9 --- /dev/null +++ b/src/c3a/LoadC3a.java @@ -0,0 +1,473 @@ +package c3a; +import c3aParser.analysis.DepthFirstAdapter; +import ts.*; +import c3aParser.lexer.Lexer; +import c3aParser.lexer.LexerException; +import c3aParser.node.*; +import c3aParser.parser.Parser; +import c3aParser.parser.ParserException; +import util.Error; + +import java.io.FileReader; +import java.io.IOException; +import java.io.PushbackReader; + +public class LoadC3a extends DepthFirstAdapter { + private C3a c3a; + private C3aInst inst; + private C3aOperand operand; + private C3aLabel label; + private Ts tableGlobale; + private Ts tableLocale = null; + + public LoadC3a(String c3aFileName, Ts tableGlobale) { + this.tableGlobale = tableGlobale; + PushbackReader fileReader = null; + Parser parser = null; + Start root = null; + try { + fileReader = new PushbackReader(new FileReader(c3aFileName)); + } catch (IOException e) { + System.err.println("cannot open input file"); + e.printStackTrace(); + } + try { + parser = new Parser(new Lexer(fileReader)); + root = parser.parse(); + } catch (ParserException e) { + System.err.println("syntax error"); + e.printStackTrace(); + System.exit(Error.SYNT.code()); + } catch (LexerException e) { + System.err.println("lexical error"); + e.printStackTrace(); + System.exit(Error.LEX.code()); + } catch (IOException e) { + e.printStackTrace(); + } + root.apply(this); + } + + public void defaultIn(Node node) + { + //System.out.println("<" + node.getClass().getSimpleName() + ">"); + } + + public void defaultOut(Node node) + { + //System.out.println("</" + node.getClass().getSimpleName() + ">"); + } + + public C3a getC3a(){return c3a;} + //prog = listeinst; + @Override + public void caseAProg(AProg node) + { + inAProg(node); + c3a = new C3a(); + if(node.getListeinst() != null) + { + node.getListeinst().apply(this); + } + outAProg(node); + } +//listeinst = {recursif} inst listeinst + @Override + public void caseARecursifListeinst(ARecursifListeinst node) + { + inARecursifListeinst(node); + node.getInst().apply(this); + c3a.ajouteInst(inst); + label = null; + node.getListeinst().apply(this); + outARecursifListeinst(node); + } + +// listeinst = {final} inst + @Override + public void caseAFinalListeinst(AFinalListeinst node) + { + inAFinalListeinst(node); + node.getInst().apply(this); + c3a.ajouteInst(inst); + label = null; + outAFinalListeinst(node); + } + + //add = etiqop [result]:tv aff [op1]:ctv plus [op2]:ctv; + @Override + public void caseAAdd(AAdd node) + { + inAAdd(node); + if(node.getEtiqop() != null) + { + node.getEtiqop().apply(this); + c3a.addLabelToNextInst(label); + } + node.getResult().apply(this); + C3aOperand result = operand; + node.getOp1().apply(this); + C3aOperand op1 = operand; + node.getOp2().apply(this); + C3aOperand op2 = operand; + inst = new C3aInstAdd(op1, op2, result, ""); + outAAdd(node); + } + + //sub = etiqop [result]:tv aff [op1]:ctv moins [op2]:ctv; + @Override + public void caseASub(ASub node) + { + inASub(node); + node.getEtiqop().apply(this); + c3a.addLabelToNextInst(label); + + node.getResult().apply(this); + C3aOperand result = operand; + + node.getOp1().apply(this); + C3aOperand op1 = operand; + + node.getOp2().apply(this); + C3aOperand op2 = operand; + + inst = new C3aInstSub(op1, op2, result, ""); + outASub(node); + } + + //mul = etiqop [result]:tv aff [op1]:ctv fois [op2]:ctv; + @Override + public void caseAMul(AMul node) + { + inAMul(node); + node.getEtiqop().apply(this); + c3a.addLabelToNextInst(label); + + node.getResult().apply(this); + C3aOperand result = operand; + + node.getOp1().apply(this); + C3aOperand op1 = operand; + + node.getOp2().apply(this); + C3aOperand op2 = operand; + + inst = new C3aInstMult(op1,op2, result, ""); + outAMul(node); + } + + //div = etiqop [result]:tv aff [op1]:ctv divise [op2]:ctv; + @Override + public void caseADiv(ADiv node) + { + inADiv(node); + node.getEtiqop().apply(this); + c3a.addLabelToNextInst(label); + + node.getResult().apply(this); + C3aOperand result = operand; + + node.getOp1().apply(this); + C3aOperand op1 = operand; + + node.getOp2().apply(this); + C3aOperand op2 = operand; + + inst = new C3aInstDiv(op1,op2, result, ""); + outADiv(node); + } + + + //istop = etiqop stop ctv; + @Override + public void caseAIstop(AIstop node) + { + inAIstop(node); + node.getEtiqop().apply(this); + c3a.addLabelToNextInst(label); + + node.getCtv().apply(this); + C3aOperand op1 = operand; + + inst = new C3aInstStop(op1, ""); + outAIstop(node); + } + +// iwrite = etiqop write ctv; + + @Override + public void caseAIwrite(AIwrite node) + { + inAIwrite(node); + node.getEtiqop().apply(this); + c3a.addLabelToNextInst(label); + + node.getCtv().apply(this); + C3aOperand op = operand; + + inst = new C3aInstWrite(op, ""); + outAIwrite(node); + } + + // iread = etiqop [result]:tv aff read; + + @Override + public void caseAIread(AIread node) + { + inAIread(node); + node.getEtiqop().apply(this); + c3a.addLabelToNextInst(label); + + node.getResult().apply(this); + C3aOperand result = operand; + + inst = new C3aInstRead(result, ""); + outAIread(node); + } + + // end = etiqop fend; +@Override +public void caseAEnd(AEnd node) +{ + inAEnd(node); + if(node.getEtiqop() != null) + { + node.getEtiqop().apply(this); + c3a.addLabelToNextInst(label); + } + inst = new C3aInstFEnd(""); + outAEnd(node); +} + +// affect = etiqop [result]:tv aff [op1]:ctv; + + @Override + public void caseAAffect(AAffect node) + { + inAAffect(node); + if(node.getEtiqop() != null) + { + node.getEtiqop().apply(this); + c3a.addLabelToNextInst(label); + } + node.getResult().apply(this); + C3aOperand result = operand; + + node.getOp1().apply(this); + C3aOperand op1 = operand; + inst = new C3aInstAffect(op1, result, ""); + outAAffect(node); + } + +// jmpeg = etiqop if [op1]:ctv aff [op2]:ctv goto [result]:constante; +@Override +public void caseAJmpeg(AJmpeg node) +{ + inAJmpeg(node); + node.getEtiqop().apply(this); + c3a.addLabelToNextInst(label); + + node.getOp1().apply(this); + C3aOperand op1 = operand; + + node.getOp2().apply(this); + C3aOperand op2 = operand; + + node.getResult().apply(this); + C3aOperand result = operand; + + inst = new C3aInstJumpIfEqual(op1, op2, result, ""); + outAJmpeg(node); +} + +// jmpinf = etiqop if [op1]:ctv inf [op2]:ctv goto [result]:constante; +@Override +public void caseAJmpinf(AJmpinf node) +{ + inAJmpinf(node); + node.getEtiqop().apply(this); + c3a.addLabelToNextInst(label); + + node.getOp1().apply(this); + C3aOperand op1 = operand; + + node.getOp2().apply(this); + C3aOperand op2 = operand; + + node.getResult().apply(this); + C3aOperand result = operand; + + inst = new C3aInstJumpIfLess(op1, op2, result, ""); + outAJmpinf(node); +} + +// jmpneg = etiqop if [op1]:ctv noteg [op2]:ctv goto [result]:constante; +@Override +public void caseAJmpneg(AJmpneg node) +{ + inAJmpneg(node); + node.getEtiqop().apply(this); + c3a.addLabelToNextInst(label); + + node.getOp1().apply(this); + C3aOperand op1 = operand; + + node.getOp2().apply(this); + C3aOperand op2 = operand; + + node.getResult().apply(this); + C3aOperand result = operand; + + inst = new C3aInstJumpIfNotEqual(op1, op2, result, ""); + outAJmpneg(node); +} + + @Override + public void caseAJmp(AJmp node) + { + inAJmp(node); + node.getEtiqop().apply(this); + c3a.addLabelToNextInst(label); + + node.getResult().apply(this); + C3aOperand result = operand; + + inst = new C3aInstJump(result, ""); + outAJmp(node); + } + + + //arg = etiqop param ctv; + @Override + public void caseAArg(AArg node) + { + inAArg(node); + node.getEtiqop().apply(this); + c3a.addLabelToNextInst(label); + + node.getCtv().apply(this); + C3aOperand op1 = operand; + inst = new C3aInstParam(op1, ""); + outAArg(node); + } +//return = etiqop ret ctv; + + @Override + public void caseAReturn(AReturn node) + { + inAReturn(node); + node.getEtiqop().apply(this); + c3a.addLabelToNextInst(label); + node.getCtv().apply(this); + C3aOperand op1 = operand; + inst = new C3aInstReturn(op1, ""); + outAReturn(node); + } + +//temporaire = prefixe_temp constante; + @Override + public void caseATemporaire(ATemporaire node) + { + inATemporaire(node); + int num = Integer.parseInt(node.getNombre().getText()); + if(num >= c3a.getTempCounter()) + c3a.setTempCounter(num + 1); + operand = new C3aTemp(num); + outATemporaire(node); + } + +//constante = nombre; +@Override +public void caseAConstante(AConstante node) { + inAConstante(node); + int num = Integer.parseInt(node.getNombre().getText()); + operand = new C3aConstant(num); + outAConstante(node); +} + +@Override + public void caseAVideEtiqop(AVideEtiqop node) + { + inAVideEtiqop(node); + outAVideEtiqop(node); + } + //etiqop = {cte} constante; + @Override + public void caseACteEtiqop(ACteEtiqop node) + { + inACteEtiqop(node); + int num = Integer.parseInt(node.getNombre().getText()); + this.label = new C3aLabel(num); + if (num >= c3a.getLabelCounter()) + c3a.setLableCounter(num + 1); + outACteEtiqop(node); + } + +// variable = {scalaire} identif + @Override + public void caseAScalaireVariable(AScalaireVariable node) + { + inAScalaireVariable(node); + String identif = node.getIdentif().getText(); + TsItemVarSimple tsItemVarSimple = null; + if(tableLocale != null) + tsItemVarSimple = (TsItemVarSimple) tableLocale.getVar(identif); + if(tsItemVarSimple == null) + tsItemVarSimple = (TsItemVarSimple) tableGlobale.getVar(identif); + operand = new C3aVar(tsItemVarSimple, null); + outAScalaireVariable(node); + } + +// variable = {tab} identif co ctv cf + @Override + public void caseATabVariable(ATabVariable node) + { + inATabVariable(node); + String identif = node.getIdentif().getText(); + TsItemVarTab tsItemVarTab = null; + if(tableLocale != null) + tsItemVarTab = (TsItemVarTab) tableLocale.getVar(identif); + if(tsItemVarTab == null) + tsItemVarTab = (TsItemVarTab) tableGlobale.getVar(identif); + node.getCtv().apply(this); + C3aOperand index = operand; + operand = new C3aVar(tsItemVarTab, index); + outATabVariable(node); + } + + + @Override + public void caseABegin(ABegin node) + { + inABegin(node); + + String functionName = node.getIdentif().getText(); + TsItemFct tsItemFct = tableGlobale.getFct(functionName); + tableLocale = tsItemFct.getTable(); + inst = new C3aInstFBegin(tsItemFct, ""); + outABegin(node); + } + + //fcall = etiqop [result]:tv aff call identif; + @Override + public void caseAFcall(AFcall node) + { + inAFcall(node); + if(node.getEtiqop() != null) + { + node.getEtiqop().apply(this); + } + node.getResult().apply(this); + C3aOperand result = operand; + + C3aFunction op1 = new C3aFunction(tableGlobale.getFct(node.getIdentif().getText())); + inst = new C3aInstCall(op1, result, ""); + + outAFcall(node); + } + + +} + + + diff --git a/src/c3a/Sa2c3a.java b/src/c3a/Sa2c3a.java new file mode 100644 index 0000000..8e1a01f --- /dev/null +++ b/src/c3a/Sa2c3a.java @@ -0,0 +1,49 @@ +package c3a; +import ts.*; +import sa.*; + + +public class Sa2c3a extends SaDepthFirstVisitor <C3aOperand> { + private C3a c3a; + int indentation; + public C3a getC3a(){return this.c3a;} + + public Sa2c3a(SaNode root, Ts tableGlobale){ + c3a = new C3a(); + C3aTemp result = c3a.newTemp(); + C3aFunction fct = new C3aFunction(tableGlobale.getFct("main")); + c3a.ajouteInst(new C3aInstCall(fct, result, "")); + c3a.ajouteInst(new C3aInstStop(result, "")); + indentation = 0; + } + + public void defaultIn(SaNode node) + { + //for(int i = 0; i < indentation; i++){System.out.print(" ");} + //indentation++; + //System.out.println("<" + node.getClass().getSimpleName() + ">"); + } + + public void defaultOut(SaNode node) + { + //indentation--; + // for(int i = 0; i < indentation; i++){System.out.print(" ");} + // System.out.println("</" + node.getClass().getSimpleName() + ">"); + } + + + // EXP -> op2 EXP EXP + public C3aOperand visit(SaExpAdd node) throws Exception + { + defaultIn(node); + C3aOperand op1 = node.getOp1().accept(this); + C3aOperand op2 = node.getOp2().accept(this); + C3aOperand result = c3a.newTemp(); + + c3a.ajouteInst(new C3aInstAdd(op1, op2, result, "")); + defaultOut(node); + return result; + } + + +} diff --git a/src/fg/Fg.java b/src/fg/Fg.java new file mode 100644 index 0000000..c306fd5 --- /dev/null +++ b/src/fg/Fg.java @@ -0,0 +1,87 @@ +package fg; +import nasm.*; +import util.graph.*; +import java.util.*; +import java.io.*; + +public class Fg implements NasmVisitor <Void> { + public Nasm nasm; + public Graph graph; + Map< NasmInst, Node> inst2Node; + Map< Node, NasmInst> node2Inst; + Map< String, NasmInst> label2Inst; + + public Fg(Nasm nasm){ + this.nasm = nasm; + this.inst2Node = new HashMap< NasmInst, Node>(); + this.node2Inst = new HashMap< Node, NasmInst>(); + this.label2Inst = new HashMap< String, NasmInst>(); + this.graph = new Graph(); + } + + public void affiche(String baseFileName){ + String fileName; + PrintStream out = System.out; + + if (baseFileName != null){ + try { + baseFileName = baseFileName; + fileName = baseFileName + ".fg"; + out = new PrintStream(fileName); + } + + catch (IOException e) { + System.err.println("Error: " + e.getMessage()); + } + } + + for(NasmInst nasmInst : nasm.sectionText){ + Node n = this.inst2Node.get(nasmInst); + out.print(n + " : ( "); + for(NodeList q=n.succ(); q!=null; q=q.tail) { + out.print(q.head.toString()); + out.print(" "); + } + out.println(")\t" + nasmInst); + } + + } + + public Void visit(NasmAdd inst){return null;} + public Void visit(NasmCall inst){return null;} + public Void visit(NasmDiv inst){return null;} + public Void visit(NasmJe inst){return null;} + public Void visit(NasmJle inst){return null;} + public Void visit(NasmJne inst){return null;} + public Void visit(NasmMul inst){return null;} + public Void visit(NasmOr inst){return null;} + public Void visit(NasmCmp inst){return null;} + public Void visit(NasmInst inst){return null;} + public Void visit(NasmJge inst){return null;} + public Void visit(NasmJl inst){return null;} + public Void visit(NasmNot inst){return null;} + public Void visit(NasmPop inst){return null;} + public Void visit(NasmRet inst){return null;} + public Void visit(NasmXor inst){return null;} + public Void visit(NasmAnd inst){return null;} + public Void visit(NasmJg inst){return null;} + public Void visit(NasmJmp inst){return null;} + public Void visit(NasmMov inst){return null;} + public Void visit(NasmPush inst){return null;} + public Void visit(NasmSub inst){return null;} + public Void visit(NasmEmpty inst){return null;} + public Void visit(NasmInt inst){return null;} + public Void visit(NasmAddress operand){return null;} + public Void visit(NasmConstant operand){return null;} + public Void visit(NasmLabel operand){return null;} + public Void visit(NasmRegister operand){return null;} + public Void visit(NasmResb pseudoInst){return null;} + public Void visit(NasmResw pseudoInst){return null;} + public Void visit(NasmResd pseudoInst){return null;} + public Void visit(NasmResq pseudoInst){return null;} + public Void visit(NasmRest pseudoInst){return null;} + public Void visit(NasmExpPlus exp){return null;} + public Void visit(NasmExpMinus exp){return null;} + public Void visit(NasmExpTimes exp){return null;} + public Void visit(NasmExp exp){return null;} +} diff --git a/src/fg/FgSolution.java b/src/fg/FgSolution.java new file mode 100644 index 0000000..0970759 --- /dev/null +++ b/src/fg/FgSolution.java @@ -0,0 +1,51 @@ +package fg; +import util.graph.*; +import nasm.*; +import util.intset.*; +import java.io.*; +import java.util.*; + +public class FgSolution{ + int iterNum = 0; + public Nasm nasm; + Fg fg; + public Map< NasmInst, IntSet> use; + public Map< NasmInst, IntSet> def; + public Map< NasmInst, IntSet> in; + public Map< NasmInst, IntSet> out; + + public FgSolution(Nasm nasm, Fg fg){ + this.nasm = nasm; + this.fg = fg; + this.use = new HashMap< NasmInst, IntSet>(); + this.def = new HashMap< NasmInst, IntSet>(); + this.in = new HashMap< NasmInst, IntSet>(); + this.out = new HashMap< NasmInst, IntSet>(); + } + + public void affiche(String baseFileName){ + String fileName; + PrintStream out = System.out; + + if (baseFileName != null){ + try { + baseFileName = baseFileName; + fileName = baseFileName + ".fgs"; + out = new PrintStream(fileName); + } + + catch (IOException e) { + System.err.println("Error: " + e.getMessage()); + } + } + + out.println("iter num = " + iterNum); + for(NasmInst nasmInst : this.nasm.sectionText){ + out.println("use = "+ this.use.get(nasmInst) + " def = "+ this.def.get(nasmInst) + "\tin = " + this.in.get(nasmInst) + "\t \tout = " + this.out.get(nasmInst) + "\t \t" + nasmInst); + } + + } + + + +} diff --git a/src/ig/Ig.java b/src/ig/Ig.java new file mode 100644 index 0000000..eaf4886 --- /dev/null +++ b/src/ig/Ig.java @@ -0,0 +1,61 @@ +package ig; + +import fg.*; +import nasm.*; +import util.graph.*; +import util.intset.*; +import java.util.*; +import java.io.*; + +public class Ig { + public Graph graph; + public FgSolution fgs; + public int regNb; + public Nasm nasm; + public Node int2Node[]; + + + public Ig(FgSolution fgs){ + this.fgs = fgs; + this.graph = new Graph(); + this.nasm = fgs.nasm; + this.regNb = this.nasm.getTempCounter(); + this.int2Node = new Node[regNb]; + this.build(); + } + + public void build(){ + } + + public void affiche(String baseFileName){ + String fileName; + PrintStream out = System.out; + + if (baseFileName != null){ + try { + baseFileName = baseFileName; + fileName = baseFileName + ".ig"; + out = new PrintStream(fileName); + } + + catch (IOException e) { + System.err.println("Error: " + e.getMessage()); + } + } + + for(int i = 0; i < regNb; i++){ + Node n = this.int2Node[i]; + out.print(n + " : ( "); + for(NodeList q=n.succ(); q!=null; q=q.tail) { + out.print(q.head.toString()); + out.print(" "); + } + out.println(")"); + } + } +} + + + + + diff --git a/src/l.cfg b/src/l.cfg new file mode 100644 index 0000000..5159f48 --- /dev/null +++ b/src/l.cfg @@ -0,0 +1,32 @@ +Package lParser; + +Helpers + +lettre = [['a' .. 'z'] + ['A' .. 'Z']]; +chiffre = ['0' .. '9']; +alpha = [lettre + ['_' + '$']]; +alphanum = [lettre + chiffre]; + +Tokens + +espaces = (' ' | 13 | 10)+; +commentaire= '#' [[0 .. 0xffff] - [10 + 13]]* (10 | 13 | 10 13); +plus = '+'; +nombre = chiffre+; + + +Ignored Tokens + +espaces, commentaire; + +Productions + +// l'axiome + +programme = exp ; + +exp = + {plus} exp plus nombre | + {nb} nombre ; + + diff --git a/src/nasm.cfg b/src/nasm.cfg new file mode 100644 index 0000000..cbc3812 --- /dev/null +++ b/src/nasm.cfg @@ -0,0 +1,210 @@ +Package nasmParser; + +Helpers + +letter = [['a' .. 'z'] + ['A' .. 'Z']]; +digit = ['0' .. '9']; +alpha = [letter + ['_' + '$']]; +alphanum = [letter + digit]; + +Tokens + +spaces = (' ' | 13 | 10 | 9)+; +comment= ';' [[0 .. 0xffff] - [10 + 13]]* (10 | 13 | 10 13); + +plus = '+'; +minus = '-'; +times = '*'; +brackopen = '['; +brackclose = ']'; +semicol = ':'; +comma = ','; +quote = '''; +dot = '.'; +percentage = '%'; +byte = 'byte'; +word = 'word'; +dword = 'dword'; +prefix_register = '@'; + +inc = 'include'; +section = 'section'; + +data = '.data'; +definebyte = 'db'; +defineword = 'dw'; +definedoubleword = 'dd'; +definequadword = 'dq'; +definetenbytes = 'dt'; + +bss = '.bss'; +reservebyte = 'resb'; +reserveword = 'resw'; +reservedoubleword = 'resd'; +reservequadword = 'resq'; +reservetenbytes = 'rest'; + +text = '.text'; + +global = 'global'; + +mov = 'mov'; +push = 'push'; +pop = 'pop'; +add = 'add'; +sub = 'sub'; +imul = 'imul'; +idiv = 'idiv'; +and = 'and'; +or = 'or'; +xor = 'xor'; +not = 'not'; +cmp = 'cmp'; +jmp = 'jmp'; +je = 'je'; +jne = 'jne'; +jg = 'jg'; +jge = 'jge'; +jl = 'jl'; +jle = 'jle'; +call = 'call'; +ret = 'ret'; +int = 'int 0x80'; + +eax = 'eax'; +ebx = 'ebx'; +ecx = 'ecx'; +edx = 'edx'; +ebp = 'ebp'; +esp = 'esp'; + +number = digit+; + +id = alpha alphanum*; + +Ignored Tokens + +spaces, comment; + +Productions + +prog = linclude secdata secbss sectext; + +linclude = {rec} include linclude + | {empty}; + +include = percentage inc [open]: quote filename [close]: quote ; + +filename = {simple} label + | {complex} [prefix]: label dot [suffix]: label + ; + +secdata = {nonempty} section data lconst + | {empty} + ; + +lconst = {rec} const lconst + | {empty} ; + +const = {db} label definebyte numconst + | {dw} label defineword numconst + | {dd} label definedoubleword numconst + | {dq} label definequadword numconst + | {dt} label definetenbytes numconst + ; + +secbss = {nonempty} section bss lvar + | {empty} + ; + +lvar = {rec} var lvar + | {empty} + ; + +var = {resb} label semicol reservebyte number + | {resw} label semicol reserveword number + | {resd} label semicol reservedoubleword number + | {resq} label semicol reservequadword number + | {rest} label semicol reservetenbytes number + ; + +sectext = section text lglobal linst; + +lglobal = {rec} global label lglobal + | {empty} + ; + +linst = {rec} inst linst | + {last} inst + ; + +inst = {mov} oplabel mov ar comma acr + | {push} oplabel push acr + | {pop} oplabel pop ar + | {add} oplabel add ar comma acr + | {sub} oplabel sub ar comma acr + | {imul} oplabel imul ar comma acr + | {idiv} oplabel idiv ar + | {and} oplabel and ar comma acr + | {or} oplabel or ar comma acr + | {xor} oplabel xor ar comma acr + | {not} oplabel not ar + | {cmp} oplabel cmp ar comma acr + | {jmp} oplabel jmp label + | {je} oplabel je label + | {jne} oplabel jne label + | {jg} oplabel jg label + | {jge} oplabel jge label + | {jl} oplabel jl label + | {call} oplabel call label + | {ret} oplabel ret + | {inter} oplabel int + ; + +acr = {address} address + | {numconst} numconst + | {register} register + ; + +ar = {address} address + | {register} register + ; + +address = opsizeof brackopen exp brackclose; + +opsizeof = {byte} byte + | {word} word + | {dword} dword + | {empty} + ; + +exp = {plus} exp plus exp1 + | {minus} exp minus exp1 + | {next} exp1 + ; + +exp1 = {times} exp1 times exp2 + | {next} exp2 + ; + +exp2 = {label} label + | {numconst} numconst + | {register} register + ; + +numconst = number; + +register = {temp} prefix_register number + | {eax} eax + | {ebx} ebx + | {ecx} ecx + | {edx} edx + | {ebp} ebp + | {esp} esp + ; + +oplabel = {label} label semicol + | {empty} + ; + +label = id; diff --git a/src/nasm/C3a2nasm.java b/src/nasm/C3a2nasm.java new file mode 100644 index 0000000..de33f5c --- /dev/null +++ b/src/nasm/C3a2nasm.java @@ -0,0 +1,59 @@ +package nasm; +import java.util.*; +import ts.*; +import c3a.*; + +public class C3a2nasm implements C3aVisitor <NasmOperand> { + private C3a c3a; + private Nasm nasm; + private Ts tableGlobale; + private TsItemFct currentFct; + private NasmRegister esp; + private NasmRegister ebp; + + + public C3a2nasm(C3a c3a, Ts tableGlobale){ + this.c3a = c3a; + nasm = new Nasm(tableGlobale); + nasm.setTempCounter(c3a.getTempCounter()); + + this.tableGlobale = tableGlobale; + this.currentFct = null; + esp = new NasmRegister(-1); + esp.colorRegister(Nasm.REG_ESP); + + ebp = new NasmRegister(-1); + ebp.colorRegister(Nasm.REG_EBP); + } + + public Nasm getNasm(){return nasm;} + + + public NasmOperand visit(C3a c3a){return null;} + public NasmOperand visit(C3aInstAdd inst){return null;} + public NasmOperand visit(C3aInstCall inst){return null;} + public NasmOperand visit(C3aInstFBegin inst){return null;} + public NasmOperand visit(C3aInst inst){return null;} + public NasmOperand visit(C3aInstJumpIfLess inst){return null;} + public NasmOperand visit(C3aInstMult inst){return null;} + public NasmOperand visit(C3aInstRead inst){return null;} + public NasmOperand visit(C3aInstSub inst){return null;} + public NasmOperand visit(C3aInstAffect inst){return null;} + public NasmOperand visit(C3aInstDiv inst){return null;} + public NasmOperand visit(C3aInstFEnd inst){return null;} + public NasmOperand visit(C3aInstJumpIfEqual inst){return null;} + public NasmOperand visit(C3aInstJumpIfNotEqual inst){return null;} + public NasmOperand visit(C3aInstJump inst){return null;} + public NasmOperand visit(C3aInstParam inst){return null;} + public NasmOperand visit(C3aInstReturn inst){return null;} + public NasmOperand visit(C3aInstWrite inst){return null;} + public NasmOperand visit(C3aInstStop inst){return null;} + + public NasmOperand visit(C3aConstant oper){return null;} + public NasmOperand visit(C3aBooleanConstant oper){return null;} + public NasmOperand visit(C3aLabel oper){return null;} + public NasmOperand visit(C3aTemp oper){return null;} + public NasmOperand visit(C3aVar oper){return null;} + public NasmOperand visit(C3aFunction oper){return null;} + +} diff --git a/src/nasm/LoadNasm.java b/src/nasm/LoadNasm.java new file mode 100644 index 0000000..e68802c --- /dev/null +++ b/src/nasm/LoadNasm.java @@ -0,0 +1,1117 @@ +package nasm; +import nasmParser.analysis.DepthFirstAdapter; +import nasmParser.lexer.Lexer; +import nasmParser.lexer.LexerException; +import nasmParser.node.*; +import nasmParser.parser.Parser; +import nasmParser.parser.ParserException; +//import sc.analysis.DepthFirstAdapter; +import util.Error; + +import java.io.FileReader; +import java.io.IOException; +import java.io.PushbackReader; + +public class LoadNasm extends DepthFirstAdapter { + private Nasm nasm; + private NasmInst inst; + private NasmPseudoInst pseudoInst; + private NasmOperand operand; + private NasmLabel label; + private NasmExp exp; + private NasmSize size; + public LoadNasm(String nasmFileName) { + nasm = new Nasm(); + PushbackReader fileReader = null; + Parser parser = null; + Start root = null; + try { + fileReader = new PushbackReader(new FileReader(nasmFileName)); + } catch (IOException e) { + System.err.println("cannot open input file"); + e.printStackTrace(); + } + try { + parser = new Parser(new Lexer(fileReader)); + root = parser.parse(); + } catch (ParserException e) { + System.err.println("syntax error"); + e.printStackTrace(); + System.exit(Error.SYNT.code()); + } catch (LexerException e) { + System.err.println("lexical error"); + e.printStackTrace(); + System.exit(Error.LEX.code()); + } catch (IOException e) { + e.printStackTrace(); + } + root.apply(this); + } + + public void defaultIn(Node node) + { + // System.out.println("<" + node.getClass().getSimpleName() + ">"); + } + + public void defaultOut(Node node) + { + // System.out.println("</" + node.getClass().getSimpleName() + ">"); + } + + public Nasm getNasm(){return nasm;} + + + // prog = linclude secdata secbss sectext + @Override + public void caseAProg(AProg node) + { + inAProg(node); + if(node.getLinclude() != null) + { + node.getLinclude().apply(this); + } + if(node.getSecdata() != null) + { + node.getSecdata().apply(this); + } + if(node.getSecbss() != null) + { + node.getSecbss().apply(this); + } + if(node.getSectext() != null) + { + node.getSectext().apply(this); + } + outAProg(node); + } + + // linclude = {rec} include linclude + @Override + public void caseARecLinclude(ARecLinclude node) + { + inARecLinclude(node); + if(node.getInclude() != null) + { + node.getInclude().apply(this); + } + if(node.getLinclude() != null) + { + node.getLinclude().apply(this); + } + outARecLinclude(node); + } + + // linclude = {empty} + @Override + public void caseAEmptyLinclude(AEmptyLinclude node) + { + inAEmptyLinclude(node); + outAEmptyLinclude(node); + } + + // include = percentage inc [open]: quote filename [close]: quote + @Override + public void caseAInclude(AInclude node) + { + inAInclude(node); + if(node.getPercentage() != null) + { + node.getPercentage().apply(this); + } + if(node.getInc() != null) + { + node.getInc().apply(this); + } + if(node.getOpen() != null) + { + node.getOpen().apply(this); + } + if(node.getFilename() != null) + { + node.getFilename().apply(this); + } + if(node.getClose() != null) + { + node.getClose().apply(this); + } + outAInclude(node); + } + + // filename = {simple} label + @Override + public void caseASimpleFilename(ASimpleFilename node) + { + inASimpleFilename(node); + if(node.getLabel() != null) + { + node.getLabel().apply(this); + } + outASimpleFilename(node); + } + + // filename = {complex} [prefix]: label dot [suffix]: label + @Override + public void caseAComplexFilename(AComplexFilename node) + { + inAComplexFilename(node); + if(node.getPrefix() != null) + { + node.getPrefix().apply(this); + } + if(node.getDot() != null) + { + node.getDot().apply(this); + } + if(node.getSuffix() != null) + { + node.getSuffix().apply(this); + } + outAComplexFilename(node); + } + + // secdata = {nonempty} section data lconst + @Override + public void caseANonemptySecdata(ANonemptySecdata node) + { + inANonemptySecdata(node); + if(node.getSection() != null) + { + node.getSection().apply(this); + } + if(node.getData() != null) + { + node.getData().apply(this); + } + if(node.getLconst() != null) + { + node.getLconst().apply(this); + } + outANonemptySecdata(node); + } + + // secdata = {empty} + @Override + public void caseAEmptySecdata(AEmptySecdata node) + { + inAEmptySecdata(node); + outAEmptySecdata(node); + } + + // lconst = {rec} const lconst + @Override + public void caseARecLconst(ARecLconst node) + { + inARecLconst(node); + if(node.getConst() != null) + { + node.getConst().apply(this); + } + if(node.getLconst() != null) + { + node.getLconst().apply(this); + } + outARecLconst(node); + } + + + // lconst = {empty} + @Override + public void caseAEmptyLconst(AEmptyLconst node) + { + inAEmptyLconst(node); + outAEmptyLconst(node); + } + + // const = {db} label definebyte numconst + @Override + public void caseADbConst(ADbConst node) + { + inADbConst(node); + if(node.getLabel() != null) + { + node.getLabel().apply(this); + } + if(node.getDefinebyte() != null) + { + node.getDefinebyte().apply(this); + } + if(node.getNumconst() != null) + { + node.getNumconst().apply(this); + } + outADbConst(node); + } + + // const = {dw} label defineword numconst + @Override + public void caseADwConst(ADwConst node) + { + inADwConst(node); + if(node.getLabel() != null) + { + node.getLabel().apply(this); + } + if(node.getDefineword() != null) + { + node.getDefineword().apply(this); + } + if(node.getNumconst() != null) + { + node.getNumconst().apply(this); + } + outADwConst(node); + } + + // const = {dd} label definedoubleword numconst + @Override + public void caseADdConst(ADdConst node) + { + inADdConst(node); + if(node.getLabel() != null) + { + node.getLabel().apply(this); + } + if(node.getDefinedoubleword() != null) + { + node.getDefinedoubleword().apply(this); + } + if(node.getNumconst() != null) + { + node.getNumconst().apply(this); + } + outADdConst(node); + } + // const = {dq} label definequadword numconst + @Override + public void caseADqConst(ADqConst node) + { + inADqConst(node); + if(node.getLabel() != null) + { + node.getLabel().apply(this); + } + if(node.getDefinequadword() != null) + { + node.getDefinequadword().apply(this); + } + if(node.getNumconst() != null) + { + node.getNumconst().apply(this); + } + outADqConst(node); + } + // const = {dt} label definetenbytes numconst + @Override + public void caseADtConst(ADtConst node) + { + inADtConst(node); + if(node.getLabel() != null) + { + node.getLabel().apply(this); + } + if(node.getDefinetenbytes() != null) + { + node.getDefinetenbytes().apply(this); + } + if(node.getNumconst() != null) + { + node.getNumconst().apply(this); + } + outADtConst(node); + } + + + // secbss = {nonempty} section bss lvar + @Override + public void caseANonemptySecbss(ANonemptySecbss node) + { + inANonemptySecbss(node); + if(node.getSection() != null) + { + node.getSection().apply(this); + } + if(node.getBss() != null) + { + node.getBss().apply(this); + } + if(node.getLvar() != null) + { + node.getLvar().apply(this); + } + outANonemptySecbss(node); + } + // secbss = {empty} + @Override + public void caseAEmptySecbss(AEmptySecbss node) + { + inAEmptySecbss(node); + outAEmptySecbss(node); + } + + // lvar = {rec} var lvar + @Override + public void caseARecLvar(ARecLvar node) + { + inARecLvar(node); + node.getVar().apply(this); + nasm.ajoutePseudoInst(pseudoInst); + node.getLvar().apply(this); + outARecLvar(node); + } + // lvar = {empty} + @Override + public void caseAEmptyLvar(AEmptyLvar node) + { + inAEmptyLvar(node); + outAEmptyLvar(node); + } + + // var = {resb} label reservebyte number + @Override + public void caseAResbVar(AResbVar node) + { + inAResbVar(node); + node.getLabel().apply(this); + + int nb = Integer.parseInt(node.getNumber().getText()); + pseudoInst = new NasmResb(label,nb,""); + outAResbVar(node); + } + // var = {resw} label reserveword number + @Override + public void caseAReswVar(AReswVar node) + { + inAReswVar(node); + node.getLabel().apply(this); + int nb = Integer.parseInt(node.getNumber().getText()); + pseudoInst = new NasmResw(label,nb,""); + outAReswVar(node); + } + // var = {resd} label reservedoubleword number + @Override + public void caseAResdVar(AResdVar node) + { + inAResdVar(node); + node.getLabel().apply(this); + int nb = Integer.parseInt(node.getNumber().getText()); + pseudoInst = new NasmResd(label,nb,""); + outAResdVar(node); + } + // var = {resq} label reservequadword number + @Override + public void caseAResqVar(AResqVar node) + { + inAResqVar(node); + node.getLabel().apply(this); + int nb = Integer.parseInt(node.getNumber().getText()); + pseudoInst = new NasmResq(label,nb,""); + outAResqVar(node); + } + // var = {rest} label reservetenbytes number + @Override + public void caseARestVar(ARestVar node) + { + inARestVar(node); + node.getLabel().apply(this); + int nb = Integer.parseInt(node.getNumber().getText()); + pseudoInst = new NasmRest(label,nb,""); + outARestVar(node); + } + + // sectext = section text lglobal linst + ////////////////////// + @Override + public void caseASectext(ASectext node) + { + inASectext(node); + if(node.getSection() != null) + { + node.getSection().apply(this); + } + if(node.getText() != null) + { + node.getText().apply(this); + } + if(node.getLglobal() != null) + { + node.getLglobal().apply(this); + } + if(node.getLinst() != null) + { + node.getLinst().apply(this); + } + outASectext(node); + } + + // lglobal = {rec} global label lglobal + @Override + public void caseARecLglobal(ARecLglobal node) + { + inARecLglobal(node); + if(node.getGlobal() != null) + { + node.getGlobal().apply(this); + } + if(node.getLabel() != null) + { + node.getLabel().apply(this); + } + if(node.getLglobal() != null) + { + node.getLglobal().apply(this); + } + outARecLglobal(node); + } + // lglobal = {empty} + @Override + public void caseAEmptyLglobal(AEmptyLglobal node) + { + inAEmptyLglobal(node); + outAEmptyLglobal(node); + } + + + // linst = {rec} inst linst + @Override + public void caseARecLinst(ARecLinst node) + { + inARecLinst(node); + node.getInst().apply(this); + nasm.ajouteInst(inst); + label = null; + exp = null; + size = null; + operand = null; + + node.getLinst().apply(this); + outARecLinst(node); + } + + // linst = {last} inst + @Override + public void caseALastLinst(ALastLinst node) + { + inALastLinst(node); + node.getInst().apply(this); + nasm.ajouteInst(inst); + label = null; + exp = null; + size = null; + operand = null; + outALastLinst(node); + } + + + // inst = {mov} oplabel mov ar comma acr + @Override + public void caseAMovInst(AMovInst node) + { + inAMovInst(node); + node.getOplabel().apply(this); + NasmLabel lineLabel = label; + node.getAr().apply(this); + NasmOperand destination = operand; + + node.getAcr().apply(this); + NasmOperand source = operand; + + inst = new NasmMov(lineLabel, destination, source, ""); + outAMovInst(node); + } + + // inst = {push} oplabel push acr + @Override + public void caseAPushInst(APushInst node) + { + inAPushInst(node); + node.getOplabel().apply(this); + NasmLabel lineLabel = label; + node.getAcr().apply(this); + NasmOperand source = operand; + inst = new NasmPush(lineLabel, source, ""); + outAPushInst(node); + } + + // inst = {pop} oplabel pop ar + @Override + public void caseAPopInst(APopInst node) + { + inAPopInst(node); + node.getOplabel().apply(this); + NasmLabel lineLabel = label; + + node.getAr().apply(this); + NasmOperand destination = operand; + inst = new NasmPop(lineLabel, destination, ""); + outAPopInst(node); + } + + // inst = {add} oplabel add ar comma acr + @Override + public void caseAAddInst(AAddInst node) + { + inAAddInst(node); + node.getOplabel().apply(this); + NasmLabel lineLabel = label; + node.getAr().apply(this); + NasmOperand destination = operand; + node.getAcr().apply(this); + NasmOperand source = operand; + inst = new NasmAdd(lineLabel, destination, source, ""); + outAAddInst(node); + } + + // inst = {sub} oplabel sub ar comma acr + @Override + public void caseASubInst(ASubInst node) + { + inASubInst(node); + node.getOplabel().apply(this); + NasmLabel lineLabel = label; + node.getAr().apply(this); + NasmOperand destination = operand; + node.getAcr().apply(this); + NasmOperand source = operand; + inst = new NasmSub(lineLabel, destination, source, ""); + outASubInst(node); + } + + // inst = {imul} oplabel imul ar comma acr + @Override + public void caseAImulInst(AImulInst node) + { + inAImulInst(node); + node.getOplabel().apply(this); + NasmLabel lineLabel = label; + + node.getAr().apply(this); + NasmOperand destination = operand; + node.getAcr().apply(this); + NasmOperand source = operand; + inst = new NasmMul(lineLabel, destination, source, ""); + outAImulInst(node); + } + + // inst = {idiv} oplabel idiv ar + @Override + public void caseAIdivInst(AIdivInst node) + { + inAIdivInst(node); + node.getOplabel().apply(this); + NasmLabel lineLabel = label; + node.getAr().apply(this); + NasmOperand source = operand; + inst = new NasmDiv(lineLabel, source, ""); + outAIdivInst(node); + } + + // inst = {and} oplabel and ar comma acr + @Override + public void caseAAndInst(AAndInst node) + { + inAAndInst(node); + node.getOplabel().apply(this); + NasmLabel lineLabel = label; + node.getAr().apply(this); + NasmOperand destination = operand; + node.getAcr().apply(this); + NasmOperand source = label; + inst = new NasmOr(lineLabel, destination, source, ""); + outAAndInst(node); + } + + // inst = {or} oplabel or ar comma acr + @Override + public void caseAOrInst(AOrInst node) + { + inAOrInst(node); + node.getOplabel().apply(this); + NasmLabel lineLabel = label; + node.getAr().apply(this); + NasmOperand destination = operand; + node.getAcr().apply(this); + NasmOperand source = operand; + inst = new NasmOr(lineLabel, destination, source, ""); + outAOrInst(node); + } + + // inst = {xor} oplabel xor ar comma acr + @Override + public void caseAXorInst(AXorInst node) + { + inAXorInst(node); + node.getOplabel().apply(this); + NasmLabel lineLabel = label; + node.getAr().apply(this); + NasmOperand destination = operand; + node.getAcr().apply(this); + NasmOperand source = operand; + inst = new NasmXor(lineLabel, destination, source, ""); + outAXorInst(node); + } + + // inst = {not} oplabel not ar + @Override + public void caseANotInst(ANotInst node) + { + inANotInst(node); + node.getOplabel().apply(this); + NasmLabel lineLabel = label; + node.getAr().apply(this); + NasmOperand destination = operand; + inst = new NasmNot(lineLabel, destination, ""); + outANotInst(node); + } + + // inst = {cmp} oplabel cmp ar comma acr + @Override + public void caseACmpInst(ACmpInst node) + { + inACmpInst(node); + node.getOplabel().apply(this); + NasmLabel lineLabel = label; + node.getAr().apply(this); + NasmOperand destination = operand; + node.getAcr().apply(this); + NasmOperand source = operand; + inst = new NasmCmp(lineLabel, destination, source, ""); + outACmpInst(node); + } + + // inst = {jmp} oplabel jmp label + @Override + public void caseAJmpInst(AJmpInst node) + { + inAJmpInst(node); + node.getOplabel().apply(this); + NasmOperand lineLabel = label; + node.getLabel().apply(this); + NasmOperand jumpTo = label; + inst = new NasmJmp(lineLabel, jumpTo, ""); + outAJmpInst(node); + } + + // inst = {je} oplabel je label + @Override + public void caseAJeInst(AJeInst node) + { + inAJeInst(node); + node.getOplabel().apply(this); + NasmOperand lineLabel = label; + node.getLabel().apply(this); + NasmOperand jumpTo = label; + inst = new NasmJe(lineLabel, jumpTo, ""); + outAJeInst(node); + } + + // inst = {jne} oplabel jne label + @Override + public void caseAJneInst(AJneInst node) + { + inAJneInst(node); + node.getOplabel().apply(this); + NasmOperand lineLabel = label; + node.getLabel().apply(this); + NasmOperand jumpTo = label; + inst = new NasmJne(lineLabel, jumpTo, ""); + } + + // inst = {jg} oplabel jg label + @Override + public void caseAJgInst(AJgInst node) + { + inAJgInst(node); + node.getOplabel().apply(this); + NasmOperand lineLabel = label; + + node.getLabel().apply(this); + NasmOperand jumpTo = label; + inst = new NasmJg(lineLabel, jumpTo, ""); + outAJgInst(node); + } + + // inst = {jge} oplabel jge label + @Override + public void caseAJgeInst(AJgeInst node) + { + inAJgeInst(node); + node.getOplabel().apply(this); + NasmOperand lineLabel = label; + node.getLabel().apply(this); + NasmOperand jumpTo = label; + inst = new NasmJge(lineLabel, jumpTo, ""); + outAJgeInst(node); + } + + // inst = {jl} oplabel jl label + @Override + public void caseAJlInst(AJlInst node) + { + inAJlInst(node); + node.getOplabel().apply(this); + NasmOperand lineLabel = label; + node.getLabel().apply(this); + NasmOperand jumpTo = label; + inst = new NasmJl(lineLabel, jumpTo, ""); + outAJlInst(node); + } + + // inst = {call} oplabel call label + @Override + public void caseACallInst(ACallInst node) + { + inACallInst(node); + node.getOplabel().apply(this); + NasmLabel lineLabel = label; + node.getLabel().apply(this); + NasmOperand jumpTo = label; + inst = new NasmCall(lineLabel, jumpTo, ""); + outACallInst(node); + } + + // inst = {ret} oplabel ret + @Override + public void caseARetInst(ARetInst node) + { + inARetInst(node); + node.getOplabel().apply(this); + NasmLabel lineLabel = label; + inst = new NasmRet(lineLabel, ""); + outARetInst(node); + } + + // inst = {inter} oplabel int + @Override + public void caseAInterInst(AInterInst node) + { + inAInterInst(node); + node.getOplabel().apply(this); + NasmLabel lineLabel = label; + inst = new NasmInt(lineLabel, ""); + outAInterInst(node); + } + + // acr = {address} address + @Override + public void caseAAddressAcr(AAddressAcr node) + { + inAAddressAcr(node); + if(node.getAddress() != null) + { + node.getAddress().apply(this); + } + outAAddressAcr(node); + } + + // acr = {numconst} numconst + @Override + public void caseANumconstAcr(ANumconstAcr node) + { + inANumconstAcr(node); + if(node.getNumconst() != null) + { + node.getNumconst().apply(this); + } + outANumconstAcr(node); + } + + // acr = {register} register + @Override + public void caseARegisterAcr(ARegisterAcr node) + { + inARegisterAcr(node); + if(node.getRegister() != null) + { + node.getRegister().apply(this); + } + outARegisterAcr(node); + } + + + // ar = {address} address + @Override + public void caseAAddressAr(AAddressAr node) + { + inAAddressAr(node); + if(node.getAddress() != null) + { + node.getAddress().apply(this); + } + outAAddressAr(node); + } + + // ar = {register} register + @Override + public void caseARegisterAr(ARegisterAr node) + { + inARegisterAr(node); + if(node.getRegister() != null) + { + node.getRegister().apply(this); + } + outARegisterAr(node); + } + + // address = opsizeof brackopen exp brackclose + @Override + public void caseAAddress(AAddress node) + { + inAAddress(node); + node.getOpsizeof().apply(this); + NasmSize sizeof = size; + node.getExp().apply(this); + NasmExp val = exp; + operand = new NasmAddress(val, sizeof); + outAAddress(node); + } + + + // opsizeof = {byte} byte + @Override + public void caseAByteOpsizeof(AByteOpsizeof node) + { + inAByteOpsizeof(node); + size = NasmSize.BYTE; + outAByteOpsizeof(node); + } + + // opsizeof = {word} word + @Override + public void caseAWordOpsizeof(AWordOpsizeof node) + { + inAWordOpsizeof(node); + size = NasmSize.WORD; + outAWordOpsizeof(node); + } + + // opsizeof = {dword} dword + @Override + public void caseADwordOpsizeof(ADwordOpsizeof node) + { + inADwordOpsizeof(node); + size = NasmSize.DWORD; + outADwordOpsizeof(node); + } + + // opsizeof = {empty} + @Override + public void caseAEmptyOpsizeof(AEmptyOpsizeof node) + { + inAEmptyOpsizeof(node); + size = NasmSize.UNDEFINED; + outAEmptyOpsizeof(node); + } + + // exp = {plus} exp plus exp1 + @Override + public void caseAPlusExp(APlusExp node) + { + inAPlusExp(node); + node.getExp().apply(this); + NasmExp op1 = exp; + node.getExp1().apply(this); + NasmExp op2 = exp; + exp = new NasmExpPlus(op1, op2); + outAPlusExp(node); + } + + // exp = {minus} exp minus exp1 + @Override + public void caseAMinusExp(AMinusExp node) + { + inAMinusExp(node); + node.getExp().apply(this); + NasmExp op1 = exp; + node.getExp1().apply(this); + NasmExp op2 = exp; + exp = new NasmExpMinus(op1, op2); + outAMinusExp(node); + } + + // exp = {next} exp1 + @Override + public void caseANextExp(ANextExp node) + { + inANextExp(node); + if(node.getExp1() != null) + { + node.getExp1().apply(this); + } + outANextExp(node); + } + + + // exp1 = {times} exp1 times exp2 + @Override + public void caseATimesExp1(ATimesExp1 node) + { + inATimesExp1(node); + node.getExp1().apply(this); + NasmExp op1 = exp; + node.getExp2().apply(this); + NasmExp op2 = exp; + exp = new NasmExpTimes(op1, op2); + outATimesExp1(node); + } + + // exp1 = {next} exp2 + @Override + public void caseANextExp1(ANextExp1 node) + { + inANextExp1(node); + if(node.getExp2() != null) + { + node.getExp2().apply(this); + } + outANextExp1(node); + } + + + // exp2 = {label} label + @Override + public void caseALabelExp2(ALabelExp2 node) + { + inALabelExp2(node); + node.getLabel().apply(this); + exp = label; + outALabelExp2(node); + } + + // exp2 = {numconst} numconst + @Override + public void caseANumconstExp2(ANumconstExp2 node) + { + inANumconstExp2(node); + node.getNumconst().apply(this); + exp = (NasmConstant)operand; + outANumconstExp2(node); + } + + // exp2 = {register} register + @Override + public void caseARegisterExp2(ARegisterExp2 node) + { + inARegisterExp2(node); + node.getRegister().apply(this); + exp = (NasmRegister) operand; + outARegisterExp2(node); + } + + // numconst = number + @Override + public void caseANumconst(ANumconst node) + { + inANumconst(node); + operand = new NasmConstant(Integer.parseInt(node.getNumber().getText())); + outANumconst(node); + } + + // register = {temp} prefix_register number + @Override + public void caseATempRegister(ATempRegister node) + { + inATempRegister(node); + int regNb = Integer.parseInt(node.getNumber().getText()); + if (regNb > nasm.getTempCounter()) + nasm.setTempCounter(regNb); + operand = new NasmRegister(regNb); + outATempRegister(node); + } + + // register = {eax} eax + @Override + public void caseAEaxRegister(AEaxRegister node) + { + inAEaxRegister(node); + NasmRegister reg = new NasmRegister(0); + reg.colorRegister(Nasm.REG_EAX); + operand = reg; + outAEaxRegister(node); + } + + // register = {ebx} ebx + @Override + public void caseAEbxRegister(AEbxRegister node) + { + inAEbxRegister(node); + NasmRegister reg = new NasmRegister(0); + reg.colorRegister(Nasm.REG_EBX); + operand = reg; + outAEbxRegister(node); + } + + // register = {ecx} ecx + @Override + public void caseAEcxRegister(AEcxRegister node) + { + inAEcxRegister(node); + NasmRegister reg = new NasmRegister(0); + reg.colorRegister(Nasm.REG_ECX); + operand = reg; + outAEcxRegister(node); + } + + // register = {edx} edx + @Override + public void caseAEdxRegister(AEdxRegister node) + { + inAEdxRegister(node); + NasmRegister reg = new NasmRegister(0); + reg.colorRegister(Nasm.REG_EDX); + operand = reg; + outAEdxRegister(node); + } + + // register = {ebp} ebp + @Override + public void caseAEbpRegister(AEbpRegister node) + { + inAEbpRegister(node); + NasmRegister reg = new NasmRegister(0); + reg.colorRegister(Nasm.REG_EBP); + operand = reg; + outAEbpRegister(node); + } + + // register = {esp} esp + @Override + public void caseAEspRegister(AEspRegister node) + { + inAEspRegister(node); + NasmRegister reg = new NasmRegister(0); + reg.colorRegister(Nasm.REG_ESP); + operand = reg; + outAEspRegister(node); + } + + + // oplabel = {label} label semicol + @Override + public void caseALabelOplabel(ALabelOplabel node) + { + inALabelOplabel(node); + node.getLabel().apply(this); + outALabelOplabel(node); + } + + // oplabel = {empty} + @Override + public void caseAEmptyOplabel(AEmptyOplabel node) + { + inAEmptyOplabel(node); + label = null; + outAEmptyOplabel(node); + } + + // label = id + @Override + public void caseALabel(ALabel node) + { + inALabel(node); + label = new NasmLabel(node.getId().getText()); + outALabel(node); + } +} + + + diff --git a/src/nasm/Nasm.java b/src/nasm/Nasm.java new file mode 100644 index 0000000..3bd34e4 --- /dev/null +++ b/src/nasm/Nasm.java @@ -0,0 +1,172 @@ +package nasm; +import java.util.*; +import java.io.*; +import ts.*; + +public class Nasm{ + public List<NasmInst> sectionText; + public List<NasmPseudoInst> sectionBss; + protected int tempCounter = 0; + Ts tableGlobale; + public static int REG_EAX = 0; + public static int REG_EBX = 1; + public static int REG_ECX = 2; + public static int REG_EDX = 3; + public static int REG_ESP = 4; + public static int REG_EBP = 5; + public static int REG_UNK = 6; + // public static int NB_PREDEFINED_REG = 7; + + + public Nasm(Ts tableGlobale){ + this.tableGlobale = tableGlobale; + this.sectionBss = new ArrayList<NasmPseudoInst>(); + this.sectionText = new ArrayList<NasmInst>(); + populateSectionBss(tableGlobale); + } + + public Nasm(){ + this.sectionBss = new ArrayList<NasmPseudoInst>(); + this.sectionText = new ArrayList<NasmInst>(); + } + + public int getTempCounter(){return this.tempCounter;} + public int setTempCounter(int c){return this.tempCounter = c;} + + public void ajoutePseudoInst(NasmPseudoInst pseudoInst){ + this.sectionBss.add(pseudoInst); + } + + public void ajouteInst(NasmInst inst){ + if(inst instanceof NasmMov && inst.destination instanceof NasmAddress && inst.source instanceof NasmAddress){ + NasmRegister newReg = newRegister(); + this.sectionText.add(new NasmMov(inst.label, newReg, inst.source, inst.comment)); + this.sectionText.add(new NasmMov(null, inst.destination, newReg, "on passe par un registre temporaire")); + return; + } + if(inst instanceof NasmAdd && inst.destination instanceof NasmAddress && inst.source instanceof NasmAddress){ + NasmRegister newReg = newRegister(); + this.sectionText.add(new NasmMov(inst.label, newReg, inst.source, inst.comment)); + this.sectionText.add(new NasmAdd(null, inst.destination, newReg, "on passe par un registre temporaire")); + return; + } + if(inst instanceof NasmSub && inst.destination instanceof NasmAddress && inst.source instanceof NasmAddress){ + NasmRegister newReg = newRegister(); + this.sectionText.add(new NasmMov(inst.label, newReg, inst.source, inst.comment)); + this.sectionText.add(new NasmSub(null, inst.destination, newReg, "on passe par un registre temporaire")); + return; + } + if(inst instanceof NasmMul && inst.destination instanceof NasmAddress && inst.source instanceof NasmAddress){ + NasmRegister newReg = newRegister(); + this.sectionText.add(new NasmMov(inst.label, newReg, inst.source, inst.comment)); + this.sectionText.add(new NasmMul(null, inst.destination, newReg, "on passe par un registre temporaire")); + return; + } + + + // if(inst instanceof NasmCmp && inst.destination instanceof NasmConstant && inst.source instanceof NasmConstant){ + if(inst instanceof NasmCmp + && (inst.destination instanceof NasmConstant + || (inst.destination instanceof NasmAddress && inst.source instanceof NasmAddress))){ + NasmRegister newReg = newRegister(); + this.sectionText.add(new NasmMov(inst.label, newReg, inst.destination, inst.comment)); + this.sectionText.add(new NasmCmp(null, newReg, inst.source, "on passe par un registre temporaire")); + return; + } + + this.sectionText.add(inst); + } + + public NasmRegister newRegister(){ + return new NasmRegister(tempCounter++); + } + + public void populateSectionBss(Ts tableGlobale){ + ajoutePseudoInst(new NasmResb(new NasmLabel("sinput"), 255, "reserve a 255 byte space in memory for the users input string")); + Set< Map.Entry< String, TsItemVar> > st = tableGlobale.variables.entrySet(); + for (Map.Entry< String, TsItemVar> me:st){ + TsItemVar tsItem = me.getValue(); + String identif = me.getKey(); + if(tsItem instanceof TsItemVarSimple) + ajoutePseudoInst(new NasmResd(new NasmLabel(identif), tsItem.type.taille(), "variable globale")); + if(tsItem instanceof TsItemVarTab) + ajoutePseudoInst(new NasmResd(new NasmLabel(identif), tsItem.type.taille() * ((TsItemVarTab)tsItem).taille, "variable globale")); + // ajoutePseudoInst(new NasmResd(new NasmLabel(identif), tsItem.taille*4, "variable globale")); + } + } + + + public void affichePreNasm(String baseFileName){ + String fileName; + PrintStream out = System.out; + + if (baseFileName != null){ + try { + baseFileName = baseFileName; + fileName = baseFileName + ".pre-nasm"; + out = new PrintStream(fileName); + } + + catch (IOException e) { + System.err.println("Error: " + e.getMessage()); + } + } + affiche(out); + } + + public void afficheNasm(String baseFileName){ + String fileName; + PrintStream out = System.out; + + if (baseFileName != null){ + try { + baseFileName = baseFileName; + fileName = baseFileName + ".nasm"; + out = new PrintStream(fileName); + } + + catch (IOException e) { + System.err.println("Error: " + e.getMessage()); + } + } + affiche(out); + } + + public void affiche(PrintStream out){ + out.println("%include\t'io.asm'\n"); + out.println("section\t.bss"); + Iterator<NasmPseudoInst> iter = this.sectionBss.iterator(); + while(iter.hasNext()){ + out.println(iter.next()); + } + + out.println("\nsection\t.text"); + out.println("global _start"); + out.println("_start:"); + Iterator<NasmInst> iter2 = this.sectionText.iterator(); + while(iter2.hasNext()){ + out.println(iter2.next()); + } + } +} +/* + public void affichePreambule(PrintStream out) + { + out.println("%include\t'io.asm'\n"); + out.println("section\t.bss"); + out.println("sinput:\tresb\t255\t;reserve a 255 byte space in memory for the users input string"); + + + Set< Map.Entry< String, TsItemVar> > st = tableGlobale.variables.entrySet(); + for (Map.Entry< String, TsItemVar> me:st){ + TsItemVar tsItem = me.getValue(); + String identif = me.getKey(); + out.println(identif + " :\tresd\t" + tsItem.taille * 4); + } + out.println("\nsection\t.text"); + out.println("global _start"); + out.println("_start:"); + } + + + */ diff --git a/src/nasm/NasmAdd.java b/src/nasm/NasmAdd.java new file mode 100644 index 0000000..340d0df --- /dev/null +++ b/src/nasm/NasmAdd.java @@ -0,0 +1,25 @@ +package nasm; + +public class NasmAdd extends NasmInst { + + public NasmAdd(NasmOperand label, NasmOperand destination, NasmOperand source, String comment){ + + destUse = true; + destDef = true; + srcUse = true; + this.label = label; + this.destination = destination; + this.source = source; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "add", this.destination, this.source, this.comment); + } + + +} diff --git a/src/nasm/NasmAddress.java b/src/nasm/NasmAddress.java new file mode 100644 index 0000000..f81e92a --- /dev/null +++ b/src/nasm/NasmAddress.java @@ -0,0 +1,26 @@ +package nasm; + +public class NasmAddress extends NasmOperand { + + public NasmExp val; + public NasmSize size; + + public NasmAddress(NasmExp val, NasmSize size){ + this.val = val; + this.size = size; + } + + public String toString(){ + return this.size.toString() + " [" + this.val.toString() + "]"; + } + + public boolean isGeneralRegister(){ + return false; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + +} diff --git a/src/nasm/NasmAnd.java b/src/nasm/NasmAnd.java new file mode 100644 index 0000000..c4c32e3 --- /dev/null +++ b/src/nasm/NasmAnd.java @@ -0,0 +1,24 @@ +package nasm; + +public class NasmAnd extends NasmInst { + + public NasmAnd(NasmOperand label, NasmOperand destination, NasmOperand source, String comment){ + destUse = true; + destDef = true; + srcUse = true; + this.label = label; + this.destination = destination; + this.source = source; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "and", this.destination, this.source, this.comment); + } + + +} diff --git a/src/nasm/NasmCall.java b/src/nasm/NasmCall.java new file mode 100644 index 0000000..d7a43e1 --- /dev/null +++ b/src/nasm/NasmCall.java @@ -0,0 +1,19 @@ +package nasm; + +public class NasmCall extends NasmInst { + + public NasmCall(NasmOperand label, NasmOperand address, String comment){ + this.label = label; + this.address = address; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "call", this.address, null, this.comment); + } + +} diff --git a/src/nasm/NasmCmp.java b/src/nasm/NasmCmp.java new file mode 100644 index 0000000..6926d8f --- /dev/null +++ b/src/nasm/NasmCmp.java @@ -0,0 +1,23 @@ +package nasm; + +public class NasmCmp extends NasmInst { + + public NasmCmp(NasmOperand label, NasmOperand destination, NasmOperand source, String comment){ + destUse = true; + srcUse= true; + this.label = label; + this.destination = destination; + this.source = source; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "cmp", this.destination, this.source, this.comment); + } + + +} diff --git a/src/nasm/NasmConstant.java b/src/nasm/NasmConstant.java new file mode 100644 index 0000000..9f6a749 --- /dev/null +++ b/src/nasm/NasmConstant.java @@ -0,0 +1,28 @@ +package nasm; +import java.util.ArrayList; + +public class NasmConstant extends NasmOperand implements NasmExp{ + public int val; + public NasmConstant(int val){ + this.val = val; + } + + public String toString(){ + return Integer.toString(this.val); + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public ArrayList<NasmRegister> getRegisters() + { + ArrayList<NasmRegister> registerList = new ArrayList<NasmRegister>(); + this.getRegisters(registerList); + return registerList; + } + public ArrayList<NasmRegister> getRegisters(ArrayList<NasmRegister> registerList) + { + return registerList; + } +} diff --git a/src/nasm/NasmDiv.java b/src/nasm/NasmDiv.java new file mode 100644 index 0000000..c3cc45f --- /dev/null +++ b/src/nasm/NasmDiv.java @@ -0,0 +1,19 @@ +package nasm; + +public class NasmDiv extends NasmInst { + + public NasmDiv(NasmOperand label, NasmOperand source, String comment){ + srcUse = true; + this.label = label; + this.source = source; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "idiv", this.source, null, this.comment); + } +} diff --git a/src/nasm/NasmEmpty.java b/src/nasm/NasmEmpty.java new file mode 100644 index 0000000..808f690 --- /dev/null +++ b/src/nasm/NasmEmpty.java @@ -0,0 +1,18 @@ +package nasm; + +public class NasmEmpty extends NasmInst { + + public NasmEmpty(NasmOperand label, String comment){ + this.label = label; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "", null, null, this.comment); + } + +} diff --git a/src/nasm/NasmEval.java b/src/nasm/NasmEval.java new file mode 100644 index 0000000..3178a3c --- /dev/null +++ b/src/nasm/NasmEval.java @@ -0,0 +1,410 @@ +package nasm; +import java.io.FileNotFoundException; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.HashMap; +import util.Memory; + +/* +This class emulates pre-nasm and nasm code for x86-64 architecture. +It handles only integers on 4 bytes and have unlimited register. + */ + +public class NasmEval implements NasmVisitor<Integer>{ + private Nasm code; + private int dataSize = 0; + + private int regNb; + private HashMap<String, Integer> labelToAddress; + private Memory memory; + private boolean stop; + private ArrayList<Integer> output; + + // registers + private int[] registers; + + private int ebp; + private int eip = 0; + private int eax = 0; + private int ebx = 0; + private int ecx = 0; + private int edx = 0; + + //flags + // Carry Flag -> not used + private boolean CF = false; + // Parity Flag -> not used + private boolean PF = false; + // Zero Flag + private boolean ZF = false; + // Sign Flag + private boolean SF = false; + // Overflow Flag -> not used + private boolean OF = false; + + private int verboseLevel; + + public NasmEval(Nasm code, int stackSize, int verboseLevel){ + this.code = code; + this.verboseLevel = verboseLevel; + regNb = this.code.getTempCounter(); + registers = new int[regNb+1]; + eip = 0; + stop = false; + + output = new ArrayList<>(); + labelToAddress = new HashMap<>(); + + associateLabelToAddress(); + memory = new Memory(dataSize, stackSize); + + while(!stop && eip < code.sectionText.size()){ + NasmInst inst = this.code.sectionText.get(eip); + if(verboseLevel > 0){ + System.out.println("--------------------------------------"); + + PrintGlobalVariables(); + // System.out.println("eip = " + eip + "\tesp = " + memory.getTopInt() + "\t ebp = " + ebp); + System.out.println("eip = " + eip + "\tesp = " + memory.esp + "\t ebp = " + ebp); + System.out.println("eax = " + eax + "\tebx = " + ebx + "\tecx = " + ecx + "\tedx = " + edx); + System.out.println("CF = " + CF + "\tPF = " + PF + "\tZF = " + ZF + "\tSF = " + SF + "\tOF = " + OF); + printRegisters(); + System.out.print("PILE : \t"); + memory.printStack(); + System.out.println(inst); + } + eip = inst.accept(this); + } + // displayOutput(); + } + + public void PrintGlobalVariables(){ + for (HashMap.Entry<String, Integer> e : labelToAddress.entrySet()) + + // System.out.println("[" + e.getValue() + "]\t" + e.getKey() + " = " + memory.readInt(e.getValue())); + System.out.println(e.getKey() + " = " + memory.readInt(e.getValue()) + " adr: " + e.getValue()); + + } + + public void printRegisters(){ + for(int i=0; i < regNb; i++){ + System.out.print("r" + i + ":" + registers[i] + "\t"); + } + // System.out.println(); + } + + public void displayOutput(){ + for(var val : output) + System.out.println(val); + } + + public void displayOutput(String outputFile) throws FileNotFoundException { + var out = new PrintStream(outputFile); + for(var val : output) + out.println(val); + } + + private void associateLabelToAddress(){ + var instructions = code.sectionText; + // associate labels to line numbers + for(int lineNb = 0; lineNb <instructions.size(); lineNb++){ + if(instructions.get(lineNb).label != null) { + var label = (NasmLabel)instructions.get(lineNb).label; + labelToAddress.put(label.val, lineNb); + } + } + // compute addresses of global variables and associate them to labels + for(int i = 0; i < code.sectionBss.size(); i++){ + NasmPseudoInst pseudoInst = this.code.sectionBss.get(i); + labelToAddress.put(pseudoInst.label.val, dataSize); + // System.out.println("var :" + pseudoInst.label.val + " address = " + dataSize); + dataSize += pseudoInst.nb * pseudoInst.sizeInBytes; + } + } + + /*------------------------------------------*/ + private void copy(NasmOperand dest, int value){ + if(dest instanceof NasmAddress) + copy((NasmAddress) dest, value); + else if(dest instanceof NasmRegister) + copy((NasmRegister) dest, value); + } + + private void copy(NasmAddress dest, int value){ + int address = dest.val.accept(this); + memory.writeInt(address, value); + } + + + private void copy(NasmRegister dest, int value){ + writeToRegister(dest, value); + } + + /*------------------------------------------*/ + + // return value stored in regiter + private int readFromRegister(NasmRegister reg){ + if(reg.color == Nasm.REG_EAX) + return eax; + if (reg.color == Nasm.REG_EBX) + return ebx; + if (reg.color == Nasm.REG_ECX) + return ecx; + if (reg.color == Nasm.REG_EDX) + return edx; + if (reg.color == Nasm.REG_ESP) + return memory.esp; + if (reg.color == Nasm.REG_EBP) + return ebp; + else + return registers[reg.val]; + + } + // write in a register + + private void writeToRegister(NasmRegister reg, int value){ + if(reg.color == Nasm.REG_EAX) + eax = value; + else if (reg.color == Nasm.REG_EBX) + ebx = value; + else if (reg.color == Nasm.REG_ECX) + ecx = value; + else if (reg.color == Nasm.REG_EDX) + edx = value; + else if (reg.color == Nasm.REG_ESP) + memory.esp = value; + else if (reg.color == Nasm.REG_EBP) + ebp = value; + else + registers[reg.val] = value; + } + + /* visit address -> return the value stored at this address */ + @Override + public Integer visit(NasmAddress adr) { + return memory.readInt(adr.val.accept(this)); + } + + /* visit register -> return the value stored in the register */ + @Override + public Integer visit(NasmRegister operand) { + if(operand.color == Nasm.REG_EAX) + return eax; + if (operand.color == Nasm.REG_EBX) + return ebx; + if (operand.color == Nasm.REG_ECX) + return ecx; + if (operand.color == Nasm.REG_EDX) + return edx; + if (operand.color == Nasm.REG_ESP) + return memory.esp; + if (operand.color == Nasm.REG_EBP) + return ebp; + else + return registers[operand.val]; + } + + /* visit constant -> return value of the constant */ + @Override + public Integer visit(NasmConstant operand) { + return operand.val; + } + + /* visit label -> return address corresponding to the label */ + @Override + public Integer visit(NasmLabel operand) { + if(labelToAddress.containsKey(operand.val)) + return labelToAddress.get(operand.val); + else + throw new RuntimeException("label " + operand.val + "does not correspond to address"); + } + + + /* visiting an instruction returns new value of eip */ + /* arithmetic operations */ + + @Override + public Integer visit(NasmAdd inst) { + copy(inst.destination, inst.source.accept(this) + inst.destination.accept(this)); + return eip + 1; + } + + @Override + public Integer visit(NasmSub inst) { + copy(inst.destination, inst.destination.accept(this) - inst.source.accept(this)); + return eip + 1; + } + + @Override + public Integer visit(NasmMul inst) { + copy(inst.destination, inst.source.accept(this) * inst.destination.accept(this)); + return eip + 1; + } + + @Override + public Integer visit(NasmDiv inst) { + var divisor = inst.source.accept(this); + var temp = eax; + eax = temp / divisor; + edx = temp % divisor; + return eip + 1; + } + + /* logical operations */ + @Override + public Integer visit(NasmOr inst) { + copy(inst.destination, inst.source.accept(this) | inst.destination.accept(this)); + return eip + 1; + } + + @Override + public Integer visit(NasmNot inst) { + copy(inst.destination, ~ inst.destination.accept(this)); + return eip + 1; + } + + @Override + public Integer visit(NasmXor inst) { + copy(inst.destination, inst.source.accept(this) ^ inst.destination.accept(this)); + return eip + 1; + } + + @Override + public Integer visit(NasmAnd inst) { + copy(inst.destination, inst.source.accept(this) & inst.destination.accept(this)); + return eip + 1; + } + + /* function call */ + @Override + public Integer visit(NasmCall inst) { + if(inst.address instanceof NasmLabel && ((NasmLabel)inst.address).val.equals("iprintLF")){ + output.add(eax); + return eip + 1; + } + memory.pushInt(eip); + return inst.address.accept(this); + } + + /* comparison */ + @Override + public Integer visit(NasmCmp inst) { + int valSrc = inst.source.accept(this); + int valDest = inst.destination.accept(this); + ZF = (valDest == valSrc)? true : false; + SF = (valDest < valSrc)? true : false; + return eip + 1; + } + + /* jumps */ + @Override + public Integer visit(NasmJe inst) { + return (ZF)? inst.address.accept(this) : eip + 1; + } + + @Override + public Integer visit(NasmJle inst) { + return (ZF || SF)? inst.address.accept(this) : eip + 1; + } + + @Override + public Integer visit(NasmJne inst) { + return (!ZF)? inst.address.accept(this) : eip + 1; + } + + @Override + public Integer visit(NasmJge inst) { + return (ZF || !SF)? inst.address.accept(this) : eip + 1; + } + + @Override + public Integer visit(NasmJl inst) { + return (!ZF && SF)? inst.address.accept(this) : eip + 1; + } + + @Override + public Integer visit(NasmJg inst) { + return (!ZF || SF)? inst.address.accept(this) : eip + 1; + } + + @Override + public Integer visit(NasmJmp inst) { + return inst.address.accept(this); + } + + @Override + public Integer visit(NasmPop inst) { + copy(inst.destination, memory.popInt()); + return eip + 1; + } + + @Override + public Integer visit(NasmPush inst) { + memory.pushInt(inst.source.accept(this)); + return eip + 1; + } + + @Override + public Integer visit(NasmRet inst) { + return memory.popInt() + 1; + } + + @Override + public Integer visit(NasmMov inst) { + copy(inst.destination, inst.source.accept(this)); + return eip + 1; + } + + @Override + public Integer visit(NasmInt inst) { + if(eax == 1) + stop = true; + return eip + 1; + } + + @Override + public Integer visit(NasmInst inst) { + return 0; + } + + @Override + public Integer visit(NasmEmpty inst) { + return eip + 1; + } + + public Integer visit(NasmResb pseudoInst){return 0;} + public Integer visit(NasmResw pseudoInst){return 0;} + public Integer visit(NasmResd pseudoInst){return 0;} + public Integer visit(NasmResq pseudoInst){return 0;} + public Integer visit(NasmRest pseudoInst){return 0;} + + /* visit expression -> returns an address */ + + public Integer visit(NasmExp exp) { /* c'est moche, il faudrait modifier ça !! */ + if(exp instanceof NasmLabel) + return ((NasmLabel)exp).accept(this); + + if(exp instanceof NasmRegister) + return ((NasmRegister)exp).accept(this); + + if(exp instanceof NasmLabel) + return ((NasmLabel)exp).accept(this); + + if(exp instanceof NasmConstant) + return ((NasmConstant)exp).accept(this); + + if(exp instanceof NasmExpPlus) + return ((NasmExpPlus)exp).accept(this); + + if(exp instanceof NasmExpMinus) + return ((NasmExpMinus)exp).accept(this); + + // if(exp instanceof NasmExpTimes) + return ((NasmExpTimes)exp).accept(this); + } + public Integer visit(NasmExpPlus exp) {return exp.op1.accept(this) + exp.op2.accept(this);} + public Integer visit(NasmExpMinus exp){return exp.op1.accept(this) - exp.op2.accept(this);} + public Integer visit(NasmExpTimes exp){return exp.op1.accept(this) * exp.op2.accept(this);} + + +} diff --git a/src/nasm/NasmExp.java b/src/nasm/NasmExp.java new file mode 100644 index 0000000..6e51c1d --- /dev/null +++ b/src/nasm/NasmExp.java @@ -0,0 +1,11 @@ +package nasm; +import java.util.ArrayList; + +public interface NasmExp { + // public boolean isStackAddress(); + public ArrayList<NasmRegister> getRegisters(); + public ArrayList<NasmRegister> getRegisters(ArrayList<NasmRegister> registerList); + + + public <T> T accept(NasmVisitor <T> visitor); +} diff --git a/src/nasm/NasmExpMinus.java b/src/nasm/NasmExpMinus.java new file mode 100644 index 0000000..419c1c1 --- /dev/null +++ b/src/nasm/NasmExpMinus.java @@ -0,0 +1,34 @@ +package nasm; +import java.util.ArrayList; + +public class NasmExpMinus implements NasmExp{ + public NasmExp op1; + public NasmExp op2; + + public NasmExpMinus(NasmExp op1, NasmExp op2){ + this.op1 = op1; + this.op2 = op2; + } + + @Override + public String toString() { + return op1.toString() + "-" + op2.toString(); + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public ArrayList<NasmRegister> getRegisters() + { + ArrayList<NasmRegister> registerList = new ArrayList<NasmRegister>(); + this.getRegisters(registerList); + return registerList; + } + public ArrayList<NasmRegister> getRegisters(ArrayList<NasmRegister> registerList) + { + this.op1.getRegisters(registerList); + this.op2.getRegisters(registerList); + return registerList; + } +} diff --git a/src/nasm/NasmExpPlus.java b/src/nasm/NasmExpPlus.java new file mode 100644 index 0000000..440d310 --- /dev/null +++ b/src/nasm/NasmExpPlus.java @@ -0,0 +1,34 @@ +package nasm; +import java.util.ArrayList; + +public class NasmExpPlus implements NasmExp{ + public NasmExp op1; + public NasmExp op2; + + public NasmExpPlus(NasmExp op1, NasmExp op2){ + this.op1 = op1; + this.op2 = op2; + } + + @Override + public String toString() { + return op1.toString() + "+" + op2.toString(); + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public ArrayList<NasmRegister> getRegisters() + { + ArrayList<NasmRegister> registerList = new ArrayList<NasmRegister>(); + this.getRegisters(registerList); + return registerList; + } + public ArrayList<NasmRegister> getRegisters(ArrayList<NasmRegister> registerList) + { + this.op1.getRegisters(registerList); + this.op2.getRegisters(registerList); + return registerList; + } +} diff --git a/src/nasm/NasmExpTimes.java b/src/nasm/NasmExpTimes.java new file mode 100644 index 0000000..efc07f3 --- /dev/null +++ b/src/nasm/NasmExpTimes.java @@ -0,0 +1,34 @@ +package nasm; +import java.util.ArrayList; + +public class NasmExpTimes implements NasmExp{ + public NasmExp op1; + public NasmExp op2; + + public NasmExpTimes(NasmExp op1, NasmExp op2){ + this.op1 = op1; + this.op2 = op2; + } + + @Override + public String toString() { + return op1.toString() + "+" + op2.toString(); + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public ArrayList<NasmRegister> getRegisters() + { + ArrayList<NasmRegister> registerList = new ArrayList<NasmRegister>(); + this.getRegisters(registerList); + return registerList; + } + public ArrayList<NasmRegister> getRegisters(ArrayList<NasmRegister> registerList) + { + this.op1.getRegisters(registerList); + this.op2.getRegisters(registerList); + return registerList; + } +} diff --git a/src/nasm/NasmInst.java b/src/nasm/NasmInst.java new file mode 100644 index 0000000..5d81f8f --- /dev/null +++ b/src/nasm/NasmInst.java @@ -0,0 +1,36 @@ +package nasm; + +public abstract class NasmInst{ + public NasmOperand label = null; + public NasmOperand destination = null; + public NasmOperand source = null; + public NasmOperand address = null; + public boolean destUse = false; + public boolean destDef = false; + public boolean srcUse = false; + public boolean srcDef = false; + String comment; + + void addLabel(String formatInst, NasmOperand label){ + formatInst += label; + } + + public String formatInst(NasmOperand label, String opcode, NasmOperand arg1, NasmOperand arg2, String comment){ + String s = ""; + if(label != null) + s = s + label + " :"; + s = s + "\t" + opcode; + if(arg1 != null) + s = s + "\t" + arg1; + if(arg2 != null) + s = s + ",\t" + arg2; + if(comment != null & comment != "") + s = s + "\t;" + comment; + return s; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + +} diff --git a/src/nasm/NasmInt.java b/src/nasm/NasmInt.java new file mode 100644 index 0000000..3e6a5b5 --- /dev/null +++ b/src/nasm/NasmInt.java @@ -0,0 +1,18 @@ +package nasm; + +public class NasmInt extends NasmInst { + + public NasmInt(NasmOperand label, String comment){ + this.label = label; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "int 0x80", null, null, this.comment); + } + +} diff --git a/src/nasm/NasmJe.java b/src/nasm/NasmJe.java new file mode 100644 index 0000000..e40ab6c --- /dev/null +++ b/src/nasm/NasmJe.java @@ -0,0 +1,19 @@ +package nasm; + +public class NasmJe extends NasmInst { + + public NasmJe(NasmOperand label, NasmOperand address, String comment){ + this.label = label; + this.address = address; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "je", this.address, null, this.comment); + } + +} diff --git a/src/nasm/NasmJg.java b/src/nasm/NasmJg.java new file mode 100644 index 0000000..1f6881c --- /dev/null +++ b/src/nasm/NasmJg.java @@ -0,0 +1,19 @@ +package nasm; + +public class NasmJg extends NasmInst { + + public NasmJg(NasmOperand label, NasmOperand address, String comment){ + this.label = label; + this.address = address; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "jg", this.address, null, this.comment); + } + +} diff --git a/src/nasm/NasmJge.java b/src/nasm/NasmJge.java new file mode 100644 index 0000000..d5091cb --- /dev/null +++ b/src/nasm/NasmJge.java @@ -0,0 +1,19 @@ +package nasm; + +public class NasmJge extends NasmInst { + + public NasmJge(NasmOperand label, NasmOperand address, String comment){ + this.label = label; + this.address = address; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "jge", this.address, null, this.comment); + } + +} diff --git a/src/nasm/NasmJl.java b/src/nasm/NasmJl.java new file mode 100644 index 0000000..5216ba3 --- /dev/null +++ b/src/nasm/NasmJl.java @@ -0,0 +1,19 @@ +package nasm; + +public class NasmJl extends NasmInst { + + public NasmJl(NasmOperand label, NasmOperand address, String comment){ + this.label = label; + this.address = address; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "jl", this.address, null, this.comment); + } + +} diff --git a/src/nasm/NasmJle.java b/src/nasm/NasmJle.java new file mode 100644 index 0000000..ac84e86 --- /dev/null +++ b/src/nasm/NasmJle.java @@ -0,0 +1,25 @@ +package nasm; + +public class NasmJle extends NasmInst { + + public NasmJle(NasmOperand label, NasmOperand address, String comment){ + this.label = label; + this.address = address; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + // String formatInst + // addLabel(label); + + //return formatInst; + + + return super.formatInst(this.label, "jle", this.address, null, this.comment); + } + +} diff --git a/src/nasm/NasmJmp.java b/src/nasm/NasmJmp.java new file mode 100644 index 0000000..62377f1 --- /dev/null +++ b/src/nasm/NasmJmp.java @@ -0,0 +1,19 @@ +package nasm; + +public class NasmJmp extends NasmInst { + + public NasmJmp(NasmOperand label, NasmOperand address, String comment){ + this.label = label; + this.address = address; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "jmp", this.address, null, this.comment); + } + +} diff --git a/src/nasm/NasmJne.java b/src/nasm/NasmJne.java new file mode 100644 index 0000000..06531c8 --- /dev/null +++ b/src/nasm/NasmJne.java @@ -0,0 +1,19 @@ +package nasm; + +public class NasmJne extends NasmInst { + + public NasmJne(NasmOperand label, NasmOperand address, String comment){ + this.label = label; + this.address = address; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "jne", this.address, null, this.comment); + } + +} diff --git a/src/nasm/NasmLabel.java b/src/nasm/NasmLabel.java new file mode 100644 index 0000000..85d4909 --- /dev/null +++ b/src/nasm/NasmLabel.java @@ -0,0 +1,28 @@ +package nasm; +import java.util.ArrayList; + +public class NasmLabel extends NasmOperand implements NasmExp { + public String val; + + public NasmLabel(String val){ + this.val = val; + } + public String toString(){ + return this.val; + } + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + public boolean isStackAddress(){return false;} + + public ArrayList<NasmRegister> getRegisters() + { + ArrayList<NasmRegister> registerList = new ArrayList<NasmRegister>(); + this.getRegisters(registerList); + return registerList; + } + public ArrayList<NasmRegister> getRegisters(ArrayList<NasmRegister> registerList) + { + return registerList; + } +} diff --git a/src/nasm/NasmMov.java b/src/nasm/NasmMov.java new file mode 100644 index 0000000..8d3d743 --- /dev/null +++ b/src/nasm/NasmMov.java @@ -0,0 +1,22 @@ +package nasm; + +public class NasmMov extends NasmInst { + + public NasmMov(NasmOperand label, NasmOperand destination, NasmOperand source, String comment){ + destDef = true; + srcUse = true; + this.label = label; + this.destination = destination; + this.source = source; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "mov", this.destination, this.source, this.comment); + } + +} diff --git a/src/nasm/NasmMul.java b/src/nasm/NasmMul.java new file mode 100644 index 0000000..3be1297 --- /dev/null +++ b/src/nasm/NasmMul.java @@ -0,0 +1,26 @@ +package nasm; + +public class NasmMul extends NasmInst { + public NasmMul(NasmOperand label, NasmOperand destination, NasmOperand source, String comment){ + destUse = true; + destDef = true; + srcUse = true; + this.label = label; + this.destination = destination; + this.source = source; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + /* public String toString(){ + return super.formatInst(this.label, "imul", this.source, null, this.comment); + }*/ + + public String toString(){ + return super.formatInst(this.label, "imul", this.destination, this.source, this.comment); + } + +} diff --git a/src/nasm/NasmNot.java b/src/nasm/NasmNot.java new file mode 100644 index 0000000..c43ddf2 --- /dev/null +++ b/src/nasm/NasmNot.java @@ -0,0 +1,21 @@ +package nasm; + +public class NasmNot extends NasmInst { + + public NasmNot(NasmOperand label, NasmOperand destination, String comment){ + destUse = true; + destDef = true; + this.label = label; + this.destination = destination; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "not", this.destination, null, this.comment); + } + +} diff --git a/src/nasm/NasmOperand.java b/src/nasm/NasmOperand.java new file mode 100644 index 0000000..5fb05ba --- /dev/null +++ b/src/nasm/NasmOperand.java @@ -0,0 +1,8 @@ +package nasm; + +public abstract class NasmOperand { + public boolean isGeneralRegister(){ + return false; + } + public abstract <T> T accept(NasmVisitor <T> visitor); +} diff --git a/src/nasm/NasmOr.java b/src/nasm/NasmOr.java new file mode 100644 index 0000000..3dd09f3 --- /dev/null +++ b/src/nasm/NasmOr.java @@ -0,0 +1,24 @@ +package nasm; + +public class NasmOr extends NasmInst { + + public NasmOr(NasmOperand label, NasmOperand destination, NasmOperand source, String comment){ + destUse = true; + destDef = true; + srcUse = true; + this.label = label; + this.destination = destination; + this.source = source; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "or", this.destination, this.source, this.comment); + } + + +} diff --git a/src/nasm/NasmPop.java b/src/nasm/NasmPop.java new file mode 100644 index 0000000..88c46bf --- /dev/null +++ b/src/nasm/NasmPop.java @@ -0,0 +1,20 @@ +package nasm; + +public class NasmPop extends NasmInst { + + public NasmPop(NasmOperand label, NasmOperand destination, String comment){ + destDef = true; + this.label = label; + this.destination = destination; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "pop", this.destination, null, this.comment); + } + +} diff --git a/src/nasm/NasmPseudoInst.java b/src/nasm/NasmPseudoInst.java new file mode 100644 index 0000000..27e14c7 --- /dev/null +++ b/src/nasm/NasmPseudoInst.java @@ -0,0 +1,28 @@ +package nasm; + +public abstract class NasmPseudoInst{ + public NasmLabel label = null; + public int nb = 1; + public int sizeInBytes; + String comment; + + void addLabel(String formatInst, NasmOperand label){ + formatInst += label; + } + + public String formatInst(NasmOperand label, String opcode, int nb, String comment){ + String s = ""; + if(label != null) + s = s + label + " :"; + s = s + "\t" + opcode; + s = s + "\t" + nb; + if(comment != null) + s = s + "\t;" + comment; + return s; + } + + /* public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + }*/ + +} diff --git a/src/nasm/NasmPush.java b/src/nasm/NasmPush.java new file mode 100644 index 0000000..a663634 --- /dev/null +++ b/src/nasm/NasmPush.java @@ -0,0 +1,20 @@ +package nasm; + +public class NasmPush extends NasmInst { + + public NasmPush(NasmOperand label, NasmOperand source, String comment){ + // srcUse = true; + this.label = label; + this.source = source; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "push", this.source, null, this.comment); + } + +} diff --git a/src/nasm/NasmRegister.java b/src/nasm/NasmRegister.java new file mode 100644 index 0000000..9f00453 --- /dev/null +++ b/src/nasm/NasmRegister.java @@ -0,0 +1,57 @@ +package nasm; +import java.util.ArrayList; + +public class NasmRegister extends NasmOperand implements NasmExp{ + public int val; + public int color = Nasm.REG_UNK; + + public NasmRegister(int val){ + this.val = val; + } + + public void colorRegister(int color){ + this.color = color; + } + + public String toString(){ + if(this.color == Nasm.REG_ESP) return "esp"; + if(this.color == Nasm.REG_EBP) return "ebp"; + if(this.color == Nasm.REG_EAX) return "eax"; + if(this.color == Nasm.REG_EBX) return "ebx"; + if(this.color == Nasm.REG_ECX) return "ecx"; + if(this.color == Nasm.REG_EDX) return "edx"; + else + return "@" + this.val; + } + + public boolean isEbp(){ + if(this.color == Nasm.REG_EBP) return true; + return false; + } + + public boolean isGeneralRegister(){ + if(this.color == Nasm.REG_EAX) return true; + if(this.color == Nasm.REG_EBX) return true; + if(this.color == Nasm.REG_ECX) return true; + if(this.color == Nasm.REG_EDX) return true; + if(this.color == Nasm.REG_UNK) return true; + return false; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public ArrayList<NasmRegister> getRegisters() + { + ArrayList<NasmRegister> registerList = new ArrayList<NasmRegister>(); + this.getRegisters(registerList); + return registerList; + } + public ArrayList<NasmRegister> getRegisters(ArrayList<NasmRegister> registerList) + { + registerList.add(this); + return registerList; + } + +} diff --git a/src/nasm/NasmResb.java b/src/nasm/NasmResb.java new file mode 100644 index 0000000..c58418c --- /dev/null +++ b/src/nasm/NasmResb.java @@ -0,0 +1,21 @@ +package nasm; + +public class NasmResb extends NasmPseudoInst { + + public NasmResb(NasmLabel label, int nb, String comment){ + this.label = label; + this.nb = nb; + this.sizeInBytes = 1; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "resb", this.nb, this.comment); + } + + +} diff --git a/src/nasm/NasmResd.java b/src/nasm/NasmResd.java new file mode 100644 index 0000000..5b4e73f --- /dev/null +++ b/src/nasm/NasmResd.java @@ -0,0 +1,21 @@ +package nasm; + +public class NasmResd extends NasmPseudoInst { + + public NasmResd(NasmLabel label, int nb, String comment){ + this.label = label; + this.nb = nb; + this.sizeInBytes = 4; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "resd", this.nb, this.comment); + } + + +} diff --git a/src/nasm/NasmResq.java b/src/nasm/NasmResq.java new file mode 100644 index 0000000..671bbfa --- /dev/null +++ b/src/nasm/NasmResq.java @@ -0,0 +1,21 @@ +package nasm; + +public class NasmResq extends NasmPseudoInst { + + public NasmResq(NasmLabel label, int nb, String comment){ + this.label = label; + this.nb = nb; + this.sizeInBytes = 8; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "resq", this.nb, this.comment); + } + + +} diff --git a/src/nasm/NasmRest.java b/src/nasm/NasmRest.java new file mode 100644 index 0000000..6b1c2c0 --- /dev/null +++ b/src/nasm/NasmRest.java @@ -0,0 +1,21 @@ +package nasm; + +public class NasmRest extends NasmPseudoInst { + + public NasmRest(NasmLabel label, int nb, String comment){ + this.label = label; + this.nb = nb; + this.sizeInBytes = 10; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "rest", this.nb, this.comment); + } + + +} diff --git a/src/nasm/NasmResw.java b/src/nasm/NasmResw.java new file mode 100644 index 0000000..47bedc9 --- /dev/null +++ b/src/nasm/NasmResw.java @@ -0,0 +1,21 @@ +package nasm; + +public class NasmResw extends NasmPseudoInst { + + public NasmResw(NasmLabel label, int nb, String comment){ + this.label = label; + this.nb = nb; + this.sizeInBytes = 2; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "resw", this.nb, this.comment); + } + + +} diff --git a/src/nasm/NasmRet.java b/src/nasm/NasmRet.java new file mode 100644 index 0000000..0c95b98 --- /dev/null +++ b/src/nasm/NasmRet.java @@ -0,0 +1,18 @@ +package nasm; + +public class NasmRet extends NasmInst { + + public NasmRet(NasmOperand label, String comment){ + this.label = label; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "ret", null, null, this.comment); + } + +} diff --git a/src/nasm/NasmSize.java b/src/nasm/NasmSize.java new file mode 100644 index 0000000..3812007 --- /dev/null +++ b/src/nasm/NasmSize.java @@ -0,0 +1,20 @@ +package nasm; + +public enum NasmSize { + + BYTE(1, "byte"), + WORD(2, "word"), + DWORD(4, "dword"), + UNDEFINED(0, ""); + private final String name; + private final int value; + + NasmSize(int value, String name) { + this.value = value; + this.name = name; + } + + public String toString(){return name;} + public String getName(){return this.name;} + public int getValue(){return value;} +} \ No newline at end of file diff --git a/src/nasm/NasmSub.java b/src/nasm/NasmSub.java new file mode 100644 index 0000000..5162718 --- /dev/null +++ b/src/nasm/NasmSub.java @@ -0,0 +1,22 @@ +package nasm; + +public class NasmSub extends NasmInst { + + public NasmSub(NasmOperand label, NasmOperand destination, NasmOperand source, String comment){ + destUse = true; + destDef = true; + srcUse = true; + this.label = label; + this.destination = destination; + this.source = source; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "sub", this.destination, this.source, this.comment); + } +} diff --git a/src/nasm/NasmVisitor.java b/src/nasm/NasmVisitor.java new file mode 100644 index 0000000..091f20e --- /dev/null +++ b/src/nasm/NasmVisitor.java @@ -0,0 +1,47 @@ +package nasm; + +public interface NasmVisitor <T> { + public T visit(NasmAdd inst); + public T visit(NasmCall inst); + public T visit(NasmDiv inst); + public T visit(NasmJe inst); + public T visit(NasmJle inst); + public T visit(NasmJne inst); + public T visit(NasmMul inst); + public T visit(NasmOr inst); + public T visit(NasmCmp inst); + public T visit(NasmInst inst); + public T visit(NasmJge inst); + public T visit(NasmJl inst); + public T visit(NasmNot inst); + public T visit(NasmPop inst); + public T visit(NasmRet inst); + public T visit(NasmXor inst); + public T visit(NasmAnd inst); + public T visit(NasmJg inst); + public T visit(NasmJmp inst); + public T visit(NasmMov inst); + public T visit(NasmPush inst); + public T visit(NasmSub inst); + public T visit(NasmEmpty inst); + public T visit(NasmInt inst); + + public T visit(NasmAddress operand); + public T visit(NasmConstant operand); + public T visit(NasmLabel operand); + public T visit(NasmRegister operand); + + public T visit(NasmResb pseudoInst); + public T visit(NasmResw pseudoInst); + public T visit(NasmResd pseudoInst); + public T visit(NasmResq pseudoInst); + public T visit(NasmRest pseudoInst); + + public T visit(NasmExp exp); + public T visit(NasmExpPlus exp); + public T visit(NasmExpMinus exp); + public T visit(NasmExpTimes exp); + +} + + diff --git a/src/nasm/NasmXor.java b/src/nasm/NasmXor.java new file mode 100644 index 0000000..28a0803 --- /dev/null +++ b/src/nasm/NasmXor.java @@ -0,0 +1,24 @@ +package nasm; + +public class NasmXor extends NasmInst { + + public NasmXor(NasmOperand label, NasmOperand destination, NasmOperand source, String comment){ + destUse = true; + destDef = true; + srcUse = true; + this.label = label; + this.destination = destination; + this.source = source; + this.comment = comment; + } + + public <T> T accept(NasmVisitor <T> visitor) { + return visitor.visit(this); + } + + public String toString(){ + return super.formatInst(this.label, "xor", this.destination, this.source, this.comment); + } + + +} diff --git a/src/sa.cfg b/src/sa.cfg new file mode 100644 index 0000000..60ff9b8 --- /dev/null +++ b/src/sa.cfg @@ -0,0 +1,127 @@ +Package saParser; + +Helpers + +lettre = [['a' .. 'z'] + ['A' .. 'Z']]; +chiffre = ['0' .. '9']; +alpha = [lettre + ['_' + '$']]; +alphanum = [lettre + chiffre]; + +Tokens + +espaces = (' ' | 13 | 10 | 9)+; +commentaire= '#' [[0 .. 0xffff] - [10 + 13]]* (10 | 13 | 10 13); + + +po = '('; +pf = ')'; +saappel = 'SaAppel'; +sadecfonc = 'SaDecFonc'; +sadectab = 'SaDecTab'; +sadecvar = 'SaDecVar'; +sadecvarsimple = 'SaDecVarSimple'; +saexpadd = 'SaExpAdd'; +saexpand = 'SaExpAnd'; +saexpappel = 'SaExpAppel'; +saexpdiv = 'SaExpDiv'; +saexpequal = 'SaExpEqual'; +saexpfaux = 'SaExpFaux'; +saexpinf = 'SaExpInf'; +saexpint = 'SaExpInt'; +saexplire = 'SaExpLire'; +saexpmult = 'SaExpMult'; +saexpnot = 'SaExpNot'; +saexpor = 'SaExpOr'; +saexpsub = 'SaExpSub'; +saexpvar = 'SaExpVar'; +saexpvrai = 'SaExpVrai'; +sainstaffect = 'SaInstAffect'; +sainstbloc = 'SaInstBloc'; +sainstecriture = 'SaInstEcriture'; +sainstretour = 'SaInstRetour'; +sainstsi = 'SaInstSi'; +sainsttantque = 'SaInstTantQue'; +saldecfonc = 'SaLDecFonc'; +saldecvar = 'SaLDecVar'; +salexp = 'SaLExp'; +salinst = 'SaLInst'; +saprog = 'SaProg'; +savarindicee = 'SaVarIndicee'; +savarsimple = 'SaVarSimple'; +faux = 'faux'; +vrai = 'vrai'; +lire = 'lire'; +null = 'null'; +entier = 'entier'; +bool = 'bool'; +nul = 'nul'; +integer = chiffre+; +id = alpha alphanum*; + +Ignored Tokens + +espaces, commentaire; + +Productions + +prog = po saprog ldecvar ldecfonc pf; + + +exp = {add} po saexpadd [op1]:exp [op2]:exp pf + | {and} po saexpand [op1]:exp [op2]:exp pf + | {div} po saexpdiv [op1]:exp [op2]:exp pf + | {equal} po saexpequal [op1]:exp [op2]:exp pf + | {inf} po saexpinf [op1]:exp [op2]:exp pf + | {mult} po saexpmult [op1]:exp [op2]:exp pf + | {or} po saexpor [op1]:exp [op2]:exp pf + | {sub} po saexpsub [op1]:exp [op2]:exp pf + | {not} po saexpnot exp pf + | {appel} po saexpappel appel pf + | {var} po saexpvar var pf + | {faux} faux + | {vrai} vrai + | {int} integer + | {lire} lire + ; + +inst = {affect} po sainstaffect var exp pf + | {bloc} po sainstbloc linst pf + | {ecriture} po sainstecriture exp pf + | {retour} po sainstretour exp pf + | {si} po sainstsi exp [alors]:inst [sinon]:inst pf + | {si2} po sainstsi exp [alors]:inst null pf + | {tantque} po sainsttantque exp inst pf + | {appel} appel + ; + +ldecfonc = {rec} po saldecfonc decfonc ldecfonc pf + | {fin} null + ; + +ldecvar = {rec} po saldecvar decvar ldecvar pf + | {fin} null + ; + +lexp = {rec} po salexp exp lexp pf + | {fin} null + ; + +linst = {rec} po salinst inst linst pf + | {fin} null + ; + +decfonc = po sadecfonc id type [param]:ldecvar [variables]:ldecvar inst pf; + +decvar = {tab} po sadectab id type integer pf + | {simple} po sadecvarsimple id type pf + ; + +var = {indicee} po savarindicee id exp pf + | {simple} po savarsimple id pf; + +appel = po saappel id lexp pf; + +type = {entier} entier + | {bool} bool + | {null} nul + ; \ No newline at end of file diff --git a/src/sa/ErrorException.java b/src/sa/ErrorException.java new file mode 100644 index 0000000..61963e6 --- /dev/null +++ b/src/sa/ErrorException.java @@ -0,0 +1,23 @@ +package sa; +import util.Error; + +public class ErrorException extends Exception{ + private Error error; + private String message; + + + public ErrorException(Error error, String message){ + this.error = error; + this.message = message; + } + + public String getMessage(){ + return message; + } + + public int getCode(){ + return error.code(); + } + + +} diff --git a/src/sa/LoadSa.java b/src/sa/LoadSa.java new file mode 100644 index 0000000..209de9c --- /dev/null +++ b/src/sa/LoadSa.java @@ -0,0 +1,547 @@ +package sa; +import saParser.analysis.DepthFirstAdapter; +import saParser.lexer.Lexer; +import saParser.lexer.LexerException; +import saParser.node.*; +import saParser.parser.Parser; +import saParser.parser.ParserException; +import util.Error; +import util.Type; + +import java.io.FileReader; +import java.io.IOException; +import java.io.PushbackReader; + +public class LoadSa extends DepthFirstAdapter { + private SaProg root; + private SaNode returnValue; + private Type returnType; + + public LoadSa(String saFileName) { + PushbackReader fileReader = null; + Parser parser = null; + Start root = null; + try { + fileReader = new PushbackReader(new FileReader(saFileName)); + } catch (IOException e) { + System.err.println("cannot open input file"); + e.printStackTrace(); + } + try { + parser = new Parser(new Lexer(fileReader)); + root = parser.parse(); + } catch (ParserException e) { + System.err.println("syntax error"); + e.printStackTrace(); + System.exit(Error.SYNT.code()); + } catch (LexerException e) { + System.err.println("lexical error"); + e.printStackTrace(); + System.exit(Error.LEX.code()); + } catch (IOException e) { + e.printStackTrace(); + } + root.apply(this); + } + + public void defaultIn(Node node) + { + //System.out.println("<" + node.getClass().getSimpleName() + ">"); + } + + public void defaultOut(Node node) + { + //System.out.println("</" + node.getClass().getSimpleName() + ">"); + } + + public SaProg getRoot(){return root;} + + + + + +// prog = po saprog ldecvar ldecfonc pf + @Override + public void caseAProg(AProg node) + { + inAProg(node); + SaLDecVar ldecVar = null; + SaLDecFonc ldecFonc = null; + if(node.getLdecvar() != null) + { + node.getLdecvar().apply(this); + ldecVar = (SaLDecVar) returnValue; + } + if(node.getLdecfonc() != null) + { + node.getLdecfonc().apply(this); + ldecFonc = (SaLDecFonc) returnValue; + } + root = new SaProg(ldecVar, ldecFonc); + outAProg(node); + } + +// exp = {add} po saexpadd [op1]:exp [op2]:exp pf + @Override + public void caseAAddExp(AAddExp node) + { + inAAddExp(node); + node.getOp1().apply(this); + SaExp op1 = (SaExp) returnValue; + node.getOp2().apply(this); + SaExp op2 = (SaExp) returnValue; + returnValue = new SaExpAdd(op1,op2); + outAAddExp(node); + } + +// exp = {and} po saexpand [op1]:exp [op2]:exp pf + @Override + public void caseAAndExp(AAndExp node) + { + inAAndExp(node); + node.getOp1().apply(this); + SaExp op1 = (SaExp) returnValue; + node.getOp2().apply(this); + SaExp op2 = (SaExp) returnValue; + returnValue = new SaExpAnd(op1,op2); + outAAndExp(node); + } + +// exp = {div} po saexpdiv [op1]:exp [op2]:exp pf + @Override + public void caseADivExp(ADivExp node) + { + inADivExp(node); + node.getOp1().apply(this); + SaExp op1 = (SaExp) returnValue; + node.getOp2().apply(this); + SaExp op2 = (SaExp) returnValue; + returnValue = new SaExpDiv(op1,op2); + outADivExp(node); + } + +// exp = {equal} po saexpequal [op1]:exp [op2]:exp pf + @Override + public void caseAEqualExp(AEqualExp node) + { + inAEqualExp(node); + node.getOp1().apply(this); + SaExp op1 = (SaExp) returnValue; + node.getOp2().apply(this); + SaExp op2 = (SaExp) returnValue; + returnValue = new SaExpEqual(op1,op2); + outAEqualExp(node); + } + +// exp = {inf} po saexpinf [op1]:exp [op2]:exp pf + @Override + public void caseAInfExp(AInfExp node) + { + inAInfExp(node); + node.getOp1().apply(this); + SaExp op1 = (SaExp) returnValue; + node.getOp2().apply(this); + SaExp op2 = (SaExp) returnValue; + returnValue = new SaExpInf(op1,op2); + outAInfExp(node); + } + +// exp = {mult} po saexpmult [op1]:exp [op2]:exp pf + @Override + public void caseAMultExp(AMultExp node) + { + inAMultExp(node); + node.getOp1().apply(this); + SaExp op1 = (SaExp) returnValue; + node.getOp2().apply(this); + SaExp op2 = (SaExp) returnValue; + returnValue = new SaExpMult(op1,op2); + outAMultExp(node); + } + +// exp = {or} po saexpor [op1]:exp [op2]:exp pf + @Override + public void caseAOrExp(AOrExp node) + { + inAOrExp(node); + node.getOp1().apply(this); + SaExp op1 = (SaExp) returnValue; + node.getOp2().apply(this); + SaExp op2 = (SaExp) returnValue; + returnValue = new SaExpOr(op1,op2); + } + +// exp = {sub} po saexpsub [op1]:exp [op2]:exp pf + @Override + public void caseASubExp(ASubExp node) + { + inASubExp(node); + node.getOp1().apply(this); + SaExp op1 = (SaExp) returnValue; + node.getOp2().apply(this); + SaExp op2 = (SaExp) returnValue; + returnValue = new SaExpSub(op1,op2); + outASubExp(node); + } + +// exp = {not} po saexpnot exp pf + @Override + public void caseANotExp(ANotExp node) + { + inANotExp(node); + node.getExp().apply(this); + SaExp exp = (SaExp) returnValue; + returnValue = new SaExpNot(exp); + outANotExp(node); + } + +// exp = {appel} po saexpappel appel pf + @Override + public void caseAAppelExp(AAppelExp node) + { + inAAppelExp(node); + node.getAppel().apply(this); + SaAppel appel = (SaAppel) returnValue; + returnValue = new SaExpAppel(appel); + outAAppelExp(node); + } + +// exp = {var} po saexpvar var pf + @Override + public void caseAVarExp(AVarExp node) + { + inAVarExp(node); + node.getVar().apply(this); + SaVar var = (SaVar) returnValue; + returnValue = new SaExpVar(var); + outAVarExp(node); + } + +// exp = {faux} faux + @Override + public void caseAFauxExp(AFauxExp node) + { + inAFauxExp(node); + returnValue = new SaExpFaux(); + outAFauxExp(node); + } + +// exp = {vrai} vrai + @Override + public void caseAVraiExp(AVraiExp node) + { + inAVraiExp(node); + returnValue = new SaExpVrai(); + outAVraiExp(node); + } + +// exp = {int} integer + @Override + public void caseAIntExp(AIntExp node) + { + inAIntExp(node); + int value = Integer.parseInt(node.getInteger().getText()); + returnValue = new SaExpInt(value); + outAIntExp(node); + } + +// exp = {lire} lire + @Override + public void caseALireExp(ALireExp node) + { + inALireExp(node); + returnValue = new SaExpLire(); + outALireExp(node); + } + +// inst = {affect} po sainstaffect var exp pf + @Override + public void caseAAffectInst(AAffectInst node) + { + inAAffectInst(node); + node.getVar().apply(this); + SaVar var = (SaVar) returnValue; + node.getExp().apply(this); + SaExp exp = (SaExp) returnValue; + returnValue = new SaInstAffect(var, exp); + outAAffectInst(node); + } + +// inst = {bloc} po sainstbloc linst pf + @Override + public void caseABlocInst(ABlocInst node) + { + inABlocInst(node); + node.getLinst().apply(this); + SaLInst linst = (SaLInst) returnValue; + returnValue = new SaInstBloc(linst); + outABlocInst(node); + } + +// inst = {ecriture} po sainstecriture exp pf + @Override + public void caseAEcritureInst(AEcritureInst node) + { + inAEcritureInst(node); + node.getExp().apply(this); + SaExp exp = (SaExp) returnValue; + returnValue = new SaInstEcriture(exp); + outAEcritureInst(node); + } + +// inst = {retour} po sainstretour exp pf + @Override + public void caseARetourInst(ARetourInst node) + { + inARetourInst(node); + node.getExp().apply(this); + SaExp exp = (SaExp) returnValue; + returnValue = new SaInstRetour(exp); + outARetourInst(node); + } + +// inst = {si} po sainstsi exp [alors]:inst [sinon]:inst pf + @Override + public void caseASiInst(ASiInst node) + { + inASiInst(node); + node.getExp().apply(this); + SaExp si = (SaExp) returnValue; + node.getAlors().apply(this); + SaInst alors = (SaInst) returnValue; + SaInst sinon = null; + if(node.getSinon() != null) + { + node.getSinon().apply(this); + sinon = (SaInst) returnValue; + } + returnValue = new SaInstSi(si, alors, sinon); + outASiInst(node); + } + + // inst = {si2} po sainstsi exp [alors]:inst null pf + + @Override + public void caseASi2Inst(ASi2Inst node) + { + inASi2Inst(node); + node.getExp().apply(this); + SaExp si = (SaExp) returnValue; + node.getAlors().apply(this); + SaInst alors = (SaInst) returnValue; + returnValue = new SaInstSi(si, alors, null); + outASi2Inst(node); + } + + + // inst = {tantque} po sainsttantque exp inst pf + @Override + public void caseATantqueInst(ATantqueInst node) + { + inATantqueInst(node); + node.getExp().apply(this); + SaExp test = (SaExp) returnValue; + node.getInst().apply(this); + SaInst bloc = (SaInst) returnValue; + returnValue = new SaInstTantQue(test, bloc); + outATantqueInst(node); + } + +// ldecfonc = {rec} po saldecfonc decfonc ldecfonc pf + @Override + public void caseARecLdecfonc(ARecLdecfonc node) + { + inARecLdecfonc(node); + node.getDecfonc().apply(this); + SaDecFonc dec = (SaDecFonc) returnValue; + node.getLdecfonc().apply(this); + SaLDecFonc ldec = (SaLDecFonc) returnValue; + returnValue = new SaLDecFonc(dec, ldec); + outARecLdecfonc(node); + } + +// ldecfonc = {fin} null + @Override + public void caseAFinLdecfonc(AFinLdecfonc node) + { + inAFinLdecfonc(node); + returnValue = null; + outAFinLdecfonc(node); + } + +// ldecvar = {rec} po saldecvar decvar ldecvar pf + @Override + public void caseARecLdecvar(ARecLdecvar node) + { + inARecLdecvar(node); + node.getDecvar().apply(this); + SaDecVar dec = (SaDecVar) returnValue; + node.getLdecvar().apply(this); + SaLDecVar ldec = (SaLDecVar) returnValue; + returnValue = new SaLDecVar(dec, ldec); + outARecLdecvar(node); + } + +// ldecvar = {fin} null + @Override + public void caseAFinLdecvar(AFinLdecvar node) + { + inAFinLdecvar(node); + returnValue = null; + outAFinLdecvar(node); + } + +// lexp = {rec} po salexp exp lexp pf + @Override + public void caseARecLexp(ARecLexp node) + { + inARecLexp(node); + node.getExp().apply(this); + SaExp exp = (SaExp) returnValue; + node.getLexp().apply(this); + SaLExp lexp = (SaLExp) returnValue; + returnValue = new SaLExp(exp, lexp); + outARecLexp(node); + } + +// lexp = {fin} null + @Override + public void caseAFinLexp(AFinLexp node) + { + inAFinLexp(node); + returnValue = null; + outAFinLexp(node); + } + +// linst = {rec} po salinst inst linst pf + @Override + public void caseARecLinst(ARecLinst node) + { + inARecLinst(node); + node.getInst().apply(this); + SaInst inst = (SaInst) returnValue; + node.getLinst().apply(this); + SaLInst linst = (SaLInst) returnValue; + returnValue = new SaLInst(inst, linst); + outARecLinst(node); + } + +// linst = {fin} null + @Override + public void caseAFinLinst(AFinLinst node) + { + inAFinLinst(node); + returnValue = null; + outAFinLinst(node); + } + +// decfonc = po sadecfonc id [param]:ldecvar [variables]:ldecvar inst type pf + @Override + public void caseADecfonc(ADecfonc node) + { + inADecfonc(node); + String foncName = node.getId().getText(); + node.getParam().apply(this); + SaLDecVar params = (SaLDecVar) returnValue; + node.getVariables().apply(this); + SaLDecVar variables = (SaLDecVar) returnValue; + node.getInst().apply(this); + SaInst corps = (SaInst) returnValue; + node.getType().apply(this); + Type type = returnType; + returnValue = new SaDecFonc(foncName, type, params, variables, corps); + outADecfonc(node); + } + +// decvar = {tab} po sadectab id integer type pf + @Override + public void caseATabDecvar(ATabDecvar node) + { + inATabDecvar(node); + String nom = node.getId().getText(); + int taille = Integer.parseInt(node.getInteger().getText()); + node.getType().apply(this); + Type type = returnType; + returnValue = new SaDecTab(nom, type, taille); + outATabDecvar(node); + } + +// decvar = {simple} po sadecvarsimple id type pf + @Override + public void caseASimpleDecvar(ASimpleDecvar node) + { + inASimpleDecvar(node); + String nom = node.getId().getText(); + node.getType().apply(this); + Type type = returnType; + returnValue = new SaDecVarSimple(nom, type); + outASimpleDecvar(node); + } + + // var = {indicee} po savarindicee id exp pf + @Override + public void caseAIndiceeVar(AIndiceeVar node) + { + inAIndiceeVar(node); + String nom = node.getId().getText(); + node.getExp().apply(this); + SaExp indice = (SaExp) returnValue; + returnValue = new SaVarIndicee(nom, indice); + outAIndiceeVar(node); + } + + // var = {simple} po savarsimple id pf + @Override + public void caseASimpleVar(ASimpleVar node) + { + inASimpleVar(node); + String nom = node.getId().getText(); + returnValue = new SaVarSimple(nom); + outASimpleVar(node); + } + +// appel = po saappel id lexp pf + @Override + public void caseAAppel(AAppel node) + { + inAAppel(node); + String nom = node.getId().getText(); + node.getLexp().apply(this); + SaLExp arguments = (SaLExp) returnValue; + returnValue = new SaAppel(nom, arguments); + outAAppel(node); + } + +// type = {entier} entier + @Override + public void caseAEntierType(AEntierType node) + { + inAEntierType(node); + returnType = Type.ENTIER; + outAEntierType(node); + } + +// type = {bool} bool + @Override + public void caseABoolType(ABoolType node) + { + inABoolType(node); + returnType = Type.BOOL; + outABoolType(node); + } + +// type = {null} nul + @Override + public void caseANullType(ANullType node) + { + inANullType(node); + returnType = Type.NUL; + outANullType(node); + } +} + + + + + + diff --git a/src/sa/SaAppel.java b/src/sa/SaAppel.java new file mode 100644 index 0000000..84a3f77 --- /dev/null +++ b/src/sa/SaAppel.java @@ -0,0 +1,33 @@ +package sa; +import ts.*; +import util.Type; + + +public class SaAppel implements SaExp, SaInst{ + private String nom; + private SaLExp arguments; + public TsItemFct tsItem; + + public SaAppel(String nom, SaLExp arguments){ + this.nom = nom; + this.arguments = arguments; + this.tsItem = null; + } + + public String getNom(){return this.nom;} + public SaLExp getArguments(){return this.arguments;} + + + public Type getType(){ + return tsItem.typeRetour; + } + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName()+ " " + nom + " " + arguments + ")"; + } +} diff --git a/src/sa/SaCheckLinkage.java b/src/sa/SaCheckLinkage.java new file mode 100644 index 0000000..f25f017 --- /dev/null +++ b/src/sa/SaCheckLinkage.java @@ -0,0 +1,42 @@ +package sa; + +import util.Error; + +public class SaCheckLinkage extends SaDepthFirstVisitor <Void>{ + + public Void visit(SaDecFonc node) throws Exception { + defaultIn(node); + if (node.tsItem == null) throw new ErrorException(Error.TS, "linkage error in SaDecFonc"); + if(node.getParametres() != null) node.getParametres().accept(this); + if(node.getVariable() != null) node.getVariable().accept(this); + if(node.getCorps() != null) node.getCorps().accept(this); + defaultOut(node); + return null; + + } + + public Void visit(SaDecVarSimple node) throws ErrorException { + if (node.tsItem == null) throw new ErrorException(Error.TS, "linkage error in SaDecVarSimple"); + return null; + } + + public Void visit(SaDecTab node) throws ErrorException { + if(node.tsItem == null) throw new ErrorException(Error.TS, "linkage error in SaDecTab"); + return null; + } + + public Void visit(SaAppel node) throws ErrorException{ + if(node.tsItem == null) throw new ErrorException(Error.TS, "linkage error in SaAppel"); + return null; + } + + public Void visit(SaVarSimple node) throws ErrorException{ + if(node.tsItem == null) throw new ErrorException(Error.TS, "linkage error in SaVarSimple"); + return null; + } + public Void visit(SaVarIndicee node) throws ErrorException{ + if(node.tsItem == null) throw new ErrorException(Error.TS, "linkage error in SaVarIndicee"); + return null; + } +} + diff --git a/src/sa/SaDec.java b/src/sa/SaDec.java new file mode 100644 index 0000000..275b4b6 --- /dev/null +++ b/src/sa/SaDec.java @@ -0,0 +1,5 @@ +package sa; + +public interface SaDec extends SaNode { + public String getNom(); +} diff --git a/src/sa/SaDecFonc.java b/src/sa/SaDecFonc.java new file mode 100644 index 0000000..7f4b817 --- /dev/null +++ b/src/sa/SaDecFonc.java @@ -0,0 +1,34 @@ +package sa; +import ts.*; +import util.Type; + +public class SaDecFonc implements SaDec{ + private String nom; + private SaLDecVar parametres; + private SaLDecVar variables; + private SaInst corps; + private Type typeRetour; + public TsItemFct tsItem; + + public SaDecFonc(String nom, Type typeRetour, SaLDecVar parametres, SaLDecVar variables, SaInst corps){ + this.nom = nom; + this.typeRetour = typeRetour; + this.parametres = parametres; + this.variables = variables; + this.corps = corps; + this.tsItem = null; + } + + public String getNom(){return this.nom;} + public Type getTypeRetour(){return this.typeRetour;} + public SaLDecVar getParametres(){return this.parametres;} + public SaLDecVar getVariable(){return this.variables;} + public SaInst getCorps(){return this.corps;} + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + public String toString(){ + return "(" + this.getClass().getSimpleName() + " " + nom + " " + typeRetour + " " + parametres + " " + variables + " " + corps + ")"; + } +} diff --git a/src/sa/SaDecTab.java b/src/sa/SaDecTab.java new file mode 100644 index 0000000..8eaf209 --- /dev/null +++ b/src/sa/SaDecTab.java @@ -0,0 +1,31 @@ +package sa; +import ts.*; +import util.Type; + +public class SaDecTab implements SaDecVar{ + private String nom; + private int taille; + private Type type; + public TsItemVar tsItem; + + public SaDecTab(String nom, Type type, int taille){ + this.nom = nom; + this.type = type; + this.taille = taille; + this.tsItem = null; + } + + public String getNom(){return this.nom;} + public int getTaille(){return this.taille;} + public Type getType(){return this.type;} + public TsItemVar getTsItem(){return this.tsItem;} + public void setTsItem(TsItemVar tsItem){this.tsItem = tsItem;} + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + nom + " " + type + " " + taille + ")"; + } +} diff --git a/src/sa/SaDecVar.java b/src/sa/SaDecVar.java new file mode 100644 index 0000000..9cc6f02 --- /dev/null +++ b/src/sa/SaDecVar.java @@ -0,0 +1,11 @@ +package sa; +import util.Type; +import ts.*; + +public interface SaDecVar extends SaNode { + public String getNom(); + public Type getType(); + public TsItemVar getTsItem(); + public void setTsItem(TsItemVar tsItem); + +} diff --git a/src/sa/SaDecVarSimple.java b/src/sa/SaDecVarSimple.java new file mode 100644 index 0000000..557cf28 --- /dev/null +++ b/src/sa/SaDecVarSimple.java @@ -0,0 +1,29 @@ +package sa; +import ts.*; +import util.Type; + +public class SaDecVarSimple implements SaDecVar{ + private String nom; + private Type type; + public TsItemVar tsItem; + + public SaDecVarSimple(String nom, Type type){ + this.nom = nom; + this.type = type; + this.tsItem = null; + } + + public String getNom(){return this.nom;} + public Type getType(){return this.type;} + public TsItemVar getTsItem(){return this.tsItem;} + public void setTsItem(TsItemVar tsItem){this.tsItem = tsItem;} + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + nom + " " + type + ")"; + } +} diff --git a/src/sa/SaDepthFirstVisitor.java b/src/sa/SaDepthFirstVisitor.java new file mode 100644 index 0000000..ded93ad --- /dev/null +++ b/src/sa/SaDepthFirstVisitor.java @@ -0,0 +1,386 @@ +package sa; + + +// P -> LDEC LDEC + +// DEC -> var id taille +// DEC -> fct id LDEC LDEC LINST +// DEC -> var id + +// LDEC -> DEC LDEC +// LDEC -> null + +// VAR ->simple id +// VAR ->indicee id EXP + +// LINST -> INST LINST +// LINST -> null + +// INST -> aff VAR EXP +// INST -> si EXP LINST LINST +// INST -> tq EXP LINST +// INST -> app APP +// INST -> ret EXP +// INST -> ecr EXP + +// APP -> id LEXP + +// LEXP -> EXP LEXP +// LEXP -> null + +// EXP -> op2 EXP EXP +// EXP -> op1 EXP +// EXP -> VAR +// EXP -> entier +// EXP -> APP +// EXP -> lire + + +//********** + +// VAR ->simple id +// VAR ->indicee id EXP + +// LINST -> INST LINST +// LINST -> null + +// INST -> aff VAR EXP +// INST -> si EXP LINST LINST +// INST -> tq EXP LINST +// INST -> app APP +// INST -> ecr EXP + +// APP -> id LEXP + +// LEXP -> EXP LEXP +// LEXP -> null + + +// EXP -> op1 EXP +// EXP -> VAR + +// EXP -> lire + + +public class SaDepthFirstVisitor <T> implements SaVisitor <T>{ + + // private NouvelleClasse x; + public void defaultIn(SaNode node) + { + } + + public void defaultOut(SaNode node) + { + } + + // P -> LDEC LDEC + public T visit(SaProg node) throws Exception + { + defaultIn(node); + if(node.getVariables() != null) + node.getVariables().accept(this); + if(node.getFonctions() != null) + node.getFonctions().accept(this); + defaultOut(node); + return null; + } + + // DEC -> var id taille + public T visit(SaDecTab node) throws Exception{ + defaultIn(node); + defaultOut(node); + return null; + } + + public T visit(SaExp node) throws Exception + { + defaultIn(node); + defaultOut(node); + return null; + } + + // EXP -> entier + public T visit(SaExpInt node) throws Exception + { + defaultIn(node); + defaultOut(node); + return null; + } + + // EXP -> vrai + public T visit(SaExpVrai node) throws Exception + { + defaultIn(node); + defaultOut(node); + return null; + } + + // EXP -> faux + public T visit(SaExpFaux node) throws Exception + { + defaultIn(node); + defaultOut(node); + return null; + } + + public T visit(SaExpVar node) throws Exception + { + defaultIn(node); + node.getVar().accept(this); + defaultOut(node); + return null; + } + + public T visit(SaInstEcriture node) throws Exception + { + defaultIn(node); + node.getArg().accept(this); + defaultOut(node); + return null; + } + + public T visit(SaInstTantQue node) throws Exception + { + defaultIn(node); + node.getTest().accept(this); + if (node.getFaire() != null) + node.getFaire().accept(this); + defaultOut(node); + return null; + } + public T visit(SaLInst node) throws Exception + { + defaultIn(node); + if(node != null){ + if(node.getTete() != null)node.getTete().accept(this); + if(node.getQueue() != null) node.getQueue().accept(this); + } + defaultOut(node); + return null; + } + + // DEC -> fct id LDEC LDEC LINST + public T visit(SaDecFonc node) throws Exception + { + defaultIn(node); + if(node.getParametres() != null) node.getParametres().accept(this); + if(node.getVariable() != null) node.getVariable().accept(this); + if(node.getCorps() != null) node.getCorps().accept(this); + defaultOut(node); + return null; + } + + // DEC -> var id + public T visit(SaDecVar node) throws Exception + { + defaultIn(node); + defaultOut(node); + return null; + } + + public T visit(SaInstAffect node) throws Exception + { + defaultIn(node); + node.getLhs().accept(this); + node.getRhs().accept(this); + defaultOut(node); + return null; + } + + // LDEC -> DEC LDEC + // LDEC -> null + /* public T visit(SaLDec node) throws Exception + { + defaultIn(node); + node.getTete().accept(this); + if(node.getQueue() != null) node.getQueue().accept(this); + defaultOut(node); + return null; + }*/ + + public T visit(SaLDecVar node) throws Exception + { + defaultIn(node); + node.getTete().accept(this); + if(node.getQueue() != null) node.getQueue().accept(this); + defaultOut(node); + return null; + } + + public T visit(SaLDecFonc node) throws Exception + { + defaultIn(node); + node.getTete().accept(this); + if(node.getQueue() != null) node.getQueue().accept(this); + defaultOut(node); + return null; + } + + public T visit(SaVarSimple node) throws Exception + { + defaultIn(node); + defaultOut(node); + return null; + } + + public T visit(SaAppel node) throws Exception + { + defaultIn(node); + if(node.getArguments() != null) node.getArguments().accept(this); + defaultOut(node); + return null; + } + + public T visit(SaExpAppel node) throws Exception + { + defaultIn(node); + node.getVal().accept(this); + defaultOut(node); + return null; + } + + // EXP -> add EXP EXP + public T visit(SaExpAdd node) throws Exception + { + defaultIn(node); + node.getOp1().accept(this); + node.getOp2().accept(this); + defaultOut(node); + return null; + } + + // EXP -> sub EXP EXP + public T visit(SaExpSub node) throws Exception + { + defaultIn(node); + node.getOp1().accept(this); + node.getOp2().accept(this); + defaultOut(node); + return null; + } + + // EXP -> mult EXP EXP + public T visit(SaExpMult node) throws Exception + { + defaultIn(node); + node.getOp1().accept(this); + node.getOp2().accept(this); + defaultOut(node); + return null; + } + + // EXP -> div EXP EXP + public T visit(SaExpDiv node) throws Exception + { + defaultIn(node); + node.getOp1().accept(this); + node.getOp2().accept(this); + defaultOut(node); + return null; + } + + // EXP -> inf EXP EXP + public T visit(SaExpInf node) throws Exception + { + defaultIn(node); + node.getOp1().accept(this); + node.getOp2().accept(this); + defaultOut(node); + return null; + } + + // EXP -> eq EXP EXP + public T visit(SaExpEqual node) throws Exception + { + defaultIn(node); + node.getOp1().accept(this); + node.getOp2().accept(this); + defaultOut(node); + return null; + } + + // EXP -> and EXP EXP + public T visit(SaExpAnd node) throws Exception + { + defaultIn(node); + node.getOp1().accept(this); + node.getOp2().accept(this); + defaultOut(node); + return null; + } + + + // EXP -> or EXP EXP + public T visit(SaExpOr node) throws Exception + { + defaultIn(node); + node.getOp1().accept(this); + node.getOp2().accept(this); + defaultOut(node); + return null; + } + + // EXP -> not EXP + public T visit(SaExpNot node) throws Exception + { + defaultIn(node); + node.getOp1().accept(this); + defaultOut(node); + return null; + } + + + public T visit(SaExpLire node) throws Exception + { + defaultIn(node); + defaultOut(node); + return null; + } + + public T visit(SaInstBloc node) throws Exception + { + defaultIn(node); + node.getVal().accept(this); + defaultOut(node); + return null; + } + + public T visit(SaInstSi node) throws Exception + { + defaultIn(node); + node.getTest().accept(this); + if (node.getAlors() != null) + node.getAlors().accept(this); + if(node.getSinon() != null) node.getSinon().accept(this); + defaultOut(node); + return null; + } + +// INST -> ret EXP + public T visit(SaInstRetour node) throws Exception + { + defaultIn(node); + node.getVal().accept(this); + defaultOut(node); + return null; + } + + + public T visit(SaLExp node) throws Exception + { + defaultIn(node); + node.getTete().accept(this); + if(node.getQueue() != null) + node.getQueue().accept(this); + defaultOut(node); + return null; + } + public T visit(SaVarIndicee node) throws Exception + { + defaultIn(node); + node.getIndice().accept(this); + defaultOut(node); + return null; + } + +} diff --git a/src/sa/SaEnvironment.java b/src/sa/SaEnvironment.java new file mode 100644 index 0000000..1c85759 --- /dev/null +++ b/src/sa/SaEnvironment.java @@ -0,0 +1,33 @@ +package sa; +import java.util.*; +import ts.*; +import util.Memory; + +public class SaEnvironment { + public Memory vars; + public Memory args; + public TypeVal returnValue; + + public SaEnvironment (TsItemFct fct) + { + SaLExp lArgs = null; + Ts localTable = fct.getTable(); + int i = 0; + + args = new Memory(localTable.getAdrArgCourante(), 0); + vars = new Memory(localTable.getAdrVarCourante(), 0); + + // args = new Memory(200, 0); + // vars = new Memory(200, 0); + + returnValue = null; + // System.out.println("allocation d'un nouvel environnement, fonction " + fct.getIdentif()); + // System.out.println("dim var = " + localTable.getAdrVarCourante()); + // System.out.println("dim arg = " + localTable.getAdrArgCourante()); + + } + + + public TypeVal getReturnValue(){return returnValue;} + public void setReturnValue(TypeVal typeVal){returnValue = typeVal;} +} diff --git a/src/sa/SaEval.java b/src/sa/SaEval.java new file mode 100644 index 0000000..b66416e --- /dev/null +++ b/src/sa/SaEval.java @@ -0,0 +1,465 @@ +package sa; +import java.util.*; +import java.io.*; +import ts.*; +import util.Memory; +import util.Type; + + +public class SaEval extends SaDepthFirstVisitor <TypeVal> { + private Ts tableGlobale; + private SaEnvironment curEnv; + private Memory varGlob; + private ArrayList<String> programOutput = new ArrayList<String>(); + private boolean stop; + + public SaEval(SaNode root, Ts tableGlobale){ + this.tableGlobale = tableGlobale; + curEnv = null; + varGlob = new Memory(tableGlobale.getAdrVarCourante(), 0); + stop = false; + SaAppel appelMain = new SaAppel("main", null); + appelMain.tsItem = tableGlobale.getFct("main"); + + try{ + appelMain.accept(this); + } catch(Exception e){} + } + + public TypeVal getVar(SaVarSimple saVar){ + TsItemVarSimple tsItem = saVar.getTsItem(); + return getVar(tsItem); + } + + public TypeVal getVar(TsItemVarSimple tsItem){ + Memory container = null; + if(tsItem.portee == this.tableGlobale) // variable globale + container = varGlob; + else + container = (tsItem.isParam)? curEnv.args : curEnv.vars; + if(tsItem.type == Type.ENTIER) + return new TypeVal(container.readInt(tsItem.adresse)); + // if(tsItem.type == Type.BOOL) + return new TypeVal(container.readBoolean(tsItem.adresse)); + } + + public void setVar(SaVarSimple saVar, TypeVal typeVal){ + TsItemVarSimple tsItem = saVar.getTsItem(); + setVar(tsItem, typeVal); + } + + + public void setVar(TsItemVarSimple tsItem, TypeVal typeVal){ + Memory container = null; + // trois cas possibles : une variable locale, une variable globale ou un argument + if(tsItem.portee == this.tableGlobale) // variable globale + container = varGlob; + else if (tsItem.isParam) + container = curEnv.args; + else + container = curEnv.vars; + + if(tsItem.type == Type.ENTIER) + container.writeInt(tsItem.adresse, typeVal.valInt); + if(tsItem.type == Type.BOOL) + container.writeBoolean(tsItem.adresse, typeVal.valBool); + } + + private TypeVal getVarGlobIndicee(SaVarIndicee saVarIndicee, TypeVal indice){ + TsItemVar tsItem = saVarIndicee.getTsItem(); + if(tsItem.type == Type.ENTIER) + return new TypeVal(varGlob.readInt(tsItem.adresse + tsItem.type.taille() * indice.valInt)); + // if(tsItem.type == Type.BOOL) + return new TypeVal(varGlob.readBoolean(tsItem.adresse + tsItem.type.taille() * indice.valInt)); + } + + private void setVarGlobIndicee(SaVarIndicee saVarIndicee, TypeVal indice, TypeVal typeVal){ + TsItemVar tsItem = saVarIndicee.getTsItem(); + if(tsItem.type == Type.ENTIER) + varGlob.writeInt(tsItem.adresse + tsItem.type.taille() * indice.valInt, typeVal.valInt); + if(tsItem.type == Type.BOOL) + varGlob.writeBoolean(tsItem.adresse + tsItem.type.taille() * indice.valInt , typeVal.valBool); + } + + + public void affiche(String baseFileName){ + String fileName; + PrintStream out = System.out; + + if (baseFileName != null){ + try { + baseFileName = baseFileName; + fileName = baseFileName + ".saout"; + out = new PrintStream(fileName); + } catch (IOException e) { + System.err.println("Error: " + e.getMessage()); + } + } + for (String line : programOutput) + out.println(line); + } + + + + public void defaultIn(SaNode node) + { + } + + public void defaultOut(SaNode node) + { + } + + // P -> LDEC LDEC + public TypeVal visit(SaProg node) throws Exception + { + defaultIn(node); + System.out.println("dans prog"); + if(node.getVariables() != null) + node.getVariables().accept(this); + if(node.getFonctions() != null) + node.getFonctions().accept(this); + defaultOut(node); + return null; + } + + // DEC -> var id taille + public TypeVal visit(SaDecTab node) throws Exception{ + defaultIn(node); + defaultOut(node); + return null; + } + + public TypeVal visit(SaExp node) throws Exception + { + defaultIn(node); + defaultOut(node); + return null; + } + + // EXP -> entier + public TypeVal visit(SaExpInt node) throws Exception + { + defaultIn(node); + defaultOut(node); + return new TypeVal(node.getVal()); + } + + + // EXP -> vrai + public TypeVal visit(SaExpVrai node) throws Exception + { + defaultIn(node); + defaultOut(node); + return new TypeVal(true); + } + + // EXP -> faux + public TypeVal visit(SaExpFaux node) throws Exception + { + defaultIn(node); + defaultOut(node); + return new TypeVal(false); + } + + public TypeVal visit(SaExpVar node) throws Exception + { + defaultIn(node); + TypeVal typeVal = node.getVar().accept(this); + defaultOut(node); + return typeVal; + } + + public TypeVal visit(SaInstEcriture node) throws Exception + { + defaultIn(node); + TypeVal arg = node.getArg().accept(this); + if(arg.type == Type.ENTIER) + programOutput.add(String.valueOf(arg.valInt)); + else if(arg.type == Type.BOOL){ + if(arg.valBool == true) + programOutput.add(String.valueOf(1)); + else + programOutput.add(String.valueOf(0)); + } + defaultOut(node); + return null; + } + + public TypeVal visit(SaInstTantQue node) throws Exception + { + defaultIn(node); + TypeVal test = node.getTest().accept(this); + while (test.valBool == true){ + if (node.getFaire() != null) + node.getFaire().accept(this); + else{ + System.out.println("Infinite loop detected, breaking out"); + break; + } + test = node.getTest().accept(this); + } + defaultOut(node); + return null; + } + + public TypeVal visit(SaLInst node) throws Exception + { + defaultIn(node); + stop = false; + TypeVal valRet = node.getTete().accept(this); + if(!stop && node.getQueue() != null) node.getQueue().accept(this); + defaultOut(node); + return null; + } + + // DEC -> fct id LDEC LDEC LINST + public TypeVal visit(SaDecFonc node) throws Exception + { + defaultIn(node); + if(node.getParametres() != null) node.getParametres().accept(this); + if(node.getVariable() != null) node.getVariable().accept(this); + node.getCorps().accept(this); + defaultOut(node); + return null; + } + + // DEC -> var id + public TypeVal visit(SaDecVar node) throws Exception + { + defaultIn(node); + defaultOut(node); + return null; + } + + public TypeVal visit(SaInstAffect node) throws Exception + { + defaultIn(node); + TypeVal typeVal = node.getRhs().accept(this); + if(node.getLhs() instanceof SaVarIndicee){ // c'est une case de tableau, donc forcément globale + SaVarIndicee lhsIndicee = (SaVarIndicee) node.getLhs(); + TypeVal indice = lhsIndicee.getIndice().accept(this); + setVarGlobIndicee(lhsIndicee, indice, typeVal); + } else{ + setVar((SaVarSimple) node.getLhs(), typeVal); + } + + defaultOut(node); + return null; + } + + // LDEC -> DEC LDEC + // LDEC -> null + /* public TypeVal visit(SaLDec node) throws Exception + { + defaultIn(node); + node.getTete().accept(this); + if(node.getQueue() != null) node.getQueue().accept(this); + defaultOut(node); + return null; + }*/ + + public TypeVal visit(SaVarSimple node) throws Exception + { + defaultIn(node); + TypeVal typeVal = getVar(node); + defaultOut(node); + return typeVal; + } + + public TypeVal visit(SaAppel node) throws Exception + { + defaultIn(node); + TsItemFct fct = node.tsItem; + SaLExp lArgs = null; + SaLDecVar lParam = null; + Ts localTable = fct.getTable(); + // on construit la liste des arguments d'appel de la fonction + ArrayList<TypeVal> listeArguments = new ArrayList<TypeVal>(); + for(lArgs = node.getArguments(); lArgs != null; lArgs = lArgs.getQueue()){ + listeArguments.add(lArgs.getTete().accept(this)); + } + + //on sauvegarde de l'environnement courant pour le restaurer après l'appel + SaEnvironment oldEnv = curEnv; + // on crée un nouvel environnement pour la fonction appelée + // le nouvel environnement est l'environnement courant + curEnv = new SaEnvironment(fct); + + // on stocke les valeurs des arguments dans l'environnement + int n = 0; + for(lParam = fct.saDecFonc.getParametres(); lParam != null; lParam = lParam.getQueue()){ + setVar((TsItemVarSimple)((SaDecVar)lParam.getTete()).getTsItem(), listeArguments.get(n)); + n++; + } + // on exécute le corps de la fonction + if(fct.saDecFonc.getCorps() != null) + fct.saDecFonc.getCorps().accept(this); + + // on récupère la valeur de retour + TypeVal returnValue = curEnv.getReturnValue(); + + //restauration de l'environnement d'avant appel + curEnv = oldEnv; + defaultOut(node); + return returnValue; + } + + public TypeVal visit(SaExpAppel node) throws Exception + { + defaultIn(node); + TypeVal typeVal = node.getVal().accept(this); + defaultOut(node); + return typeVal; + } + + // EXP -> add EXP EXP + public TypeVal visit(SaExpAdd node) throws Exception + { + defaultIn(node); + TypeVal op1 = node.getOp1().accept(this); + TypeVal op2 = node.getOp2().accept(this); + defaultOut(node); + return new TypeVal(op1.valInt + op2.valInt); + } + + // EXP -> sub EXP EXP + public TypeVal visit(SaExpSub node) throws Exception + { + defaultIn(node); + TypeVal op1 = node.getOp1().accept(this); + TypeVal op2 = node.getOp2().accept(this); + defaultOut(node); + return new TypeVal(op1.valInt - op2.valInt); + } + + // EXP -> mult EXP EXP + public TypeVal visit(SaExpMult node) throws Exception + { + defaultIn(node); + TypeVal op1 = node.getOp1().accept(this); + TypeVal op2 = node.getOp2().accept(this); + defaultOut(node); + return new TypeVal(op1.valInt * op2.valInt); + } + + // EXP -> div EXP EXP + public TypeVal visit(SaExpDiv node) throws Exception + { + defaultIn(node); + TypeVal op1 = node.getOp1().accept(this); + TypeVal op2 = node.getOp2().accept(this); + defaultOut(node); + return new TypeVal((int) op1.valInt / op2.valInt); + } + + // EXP -> inf EXP EXP + public TypeVal visit(SaExpInf node) throws Exception + { + defaultIn(node); + TypeVal op1 = node.getOp1().accept(this); + TypeVal op2 = node.getOp2().accept(this); + defaultOut(node); + return new TypeVal((op1.valInt < op2.valInt)? true : false); + } + + // EXP -> eq EXP EXP + public TypeVal visit(SaExpEqual node) throws Exception + { + defaultIn(node); + TypeVal op1 = node.getOp1().accept(this); + TypeVal op2 = node.getOp2().accept(this); + defaultOut(node); + if(op1.type == Type.ENTIER) + return new TypeVal((op1.valInt == op2.valInt)? true : false); + else + return new TypeVal((op1.valBool == op2.valBool)? true : false); + } + + // EXP -> and EXP EXP + public TypeVal visit(SaExpAnd node) throws Exception + { + defaultIn(node); + TypeVal op1 = node.getOp1().accept(this); + TypeVal op2 = node.getOp2().accept(this); + defaultOut(node); + return new TypeVal(op1.valBool && op2.valBool); + } + + // EXP -> or EXP EXP + public TypeVal visit(SaExpOr node) throws Exception + { + defaultIn(node); + TypeVal op1 = node.getOp1().accept(this); + TypeVal op2 = node.getOp2().accept(this); + defaultOut(node); + return new TypeVal(op1.valBool || op2.valBool); + } + + // EXP -> not EXP + public TypeVal visit(SaExpNot node) throws Exception + { + defaultIn(node); + TypeVal op1 = node.getOp1().accept(this); + defaultOut(node); + return new TypeVal(!op1.valBool); + } + + + public TypeVal visit(SaExpLire node) throws Exception + { + defaultIn(node); + defaultOut(node); + return null; + } + + public TypeVal visit(SaInstBloc node) throws Exception + { + defaultIn(node); + node.getVal().accept(this); + defaultOut(node); + return null; + } + + public TypeVal visit(SaInstSi node) throws Exception + { + defaultIn(node); + TypeVal test = node.getTest().accept(this); + if(test.valBool && node.getAlors() != null) + node.getAlors().accept(this); + if(!test.valBool && node.getSinon() != null) + node.getSinon().accept(this); + defaultOut(node); + return null; + } + +// INST -> ret EXP + public TypeVal visit(SaInstRetour node) throws Exception + { + defaultIn(node); + curEnv.setReturnValue(node.getVal().accept(this)); + stop = true; + defaultOut(node); + return null; + } + + + public TypeVal visit(SaLExp node) throws Exception + { + defaultIn(node); + node.getTete().accept(this); + if(node.getQueue() != null) + node.getQueue().accept(this); + defaultOut(node); + return null; + } + + public TypeVal visit(SaVarIndicee node) throws Exception + { + defaultIn(node); + node.getIndice().accept(this); + TypeVal indice = node.getIndice().accept(this); + defaultOut(node); + return getVarGlobIndicee(node, indice); + } + +} diff --git a/src/sa/SaExp.java b/src/sa/SaExp.java new file mode 100644 index 0000000..81cbf3c --- /dev/null +++ b/src/sa/SaExp.java @@ -0,0 +1,6 @@ +package sa; +import util.Type; + +public interface SaExp extends SaNode { + public Type getType(); +} diff --git a/src/sa/SaExpAdd.java b/src/sa/SaExpAdd.java new file mode 100644 index 0000000..0041eed --- /dev/null +++ b/src/sa/SaExpAdd.java @@ -0,0 +1,26 @@ +package sa; +import util.Type; + +public class SaExpAdd implements SaExp{ + private SaExp op1; + private SaExp op2; + + public SaExpAdd(SaExp op1, SaExp op2){ + this.op1 = op1; + this.op2 = op2; + } + + public SaExp getOp1(){return this.op1;} + public SaExp getOp2(){return this.op2;} + + public Type getType(){ + return Type.ENTIER; + } + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + public String toString(){ + return "(" + this.getClass().getSimpleName() + " " + op1 + " " + op2 + ")"; + } +} diff --git a/src/sa/SaExpAnd.java b/src/sa/SaExpAnd.java new file mode 100644 index 0000000..df94c5b --- /dev/null +++ b/src/sa/SaExpAnd.java @@ -0,0 +1,26 @@ +package sa; +import util.Type; + +public class SaExpAnd implements SaExp{ + private SaExp op1; + private SaExp op2; + + public SaExpAnd(SaExp op1, SaExp op2){ + this.op1 = op1; + this.op2 = op2; + } + + public SaExp getOp1(){return this.op1;} + public SaExp getOp2(){return this.op2;} + + public Type getType(){ + return Type.BOOL; + } + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + op1 + " " + op2 + ")"; + } +} diff --git a/src/sa/SaExpAppel.java b/src/sa/SaExpAppel.java new file mode 100644 index 0000000..611aa6a --- /dev/null +++ b/src/sa/SaExpAppel.java @@ -0,0 +1,25 @@ +package sa; +import util.Type; + +public class SaExpAppel implements SaExp{ + private SaAppel val; + + public SaExpAppel(SaAppel val){ + this.val = val; + } + + public SaAppel getVal(){return this.val;} + + public Type getType(){ + return val.getType(); + } + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + val + ")"; + } +} diff --git a/src/sa/SaExpDiv.java b/src/sa/SaExpDiv.java new file mode 100644 index 0000000..cc2db6e --- /dev/null +++ b/src/sa/SaExpDiv.java @@ -0,0 +1,27 @@ +package sa; +import util.Type; + +public class SaExpDiv implements SaExp{ + private SaExp op1; + private SaExp op2; + + public SaExpDiv(SaExp op1, SaExp op2){ + this.op1 = op1; + this.op2 = op2; + } + + public SaExp getOp1(){return this.op1;} + public SaExp getOp2(){return this.op2;} + + public Type getType(){ + return Type.ENTIER; + } + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + op1 + " " + op2 + ")"; + } +} diff --git a/src/sa/SaExpEqual.java b/src/sa/SaExpEqual.java new file mode 100644 index 0000000..01eeb01 --- /dev/null +++ b/src/sa/SaExpEqual.java @@ -0,0 +1,27 @@ +package sa; +import util.Type; + +public class SaExpEqual implements SaExp{ + private SaExp op1; + private SaExp op2; + + public SaExpEqual(SaExp op1, SaExp op2){ + this.op1 = op1; + this.op2 = op2; + } + + public SaExp getOp1(){return this.op1;} + public SaExp getOp2(){return this.op2;} + + public Type getType(){ + return Type.BOOL; + } + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + op1 + " " + op2 + ")"; + } +} diff --git a/src/sa/SaExpFaux.java b/src/sa/SaExpFaux.java new file mode 100644 index 0000000..125956f --- /dev/null +++ b/src/sa/SaExpFaux.java @@ -0,0 +1,28 @@ +package sa; +import util.Type; + +public class SaExpFaux implements SaExp{ + private final boolean val; + + public SaExpFaux(){ + this.val = false; + } + + public boolean getVal(){ + return this.val; + } + + public Type getType(){ + return Type.BOOL; + } + + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "faux"; + } +} diff --git a/src/sa/SaExpInf.java b/src/sa/SaExpInf.java new file mode 100644 index 0000000..1f7c54a --- /dev/null +++ b/src/sa/SaExpInf.java @@ -0,0 +1,28 @@ +package sa; +import util.Type; + +public class SaExpInf implements SaExp{ + private SaExp op1; + private SaExp op2; + + public SaExpInf(SaExp op1, SaExp op2){ + this.op1 = op1; + this.op2 = op2; + } + + public SaExp getOp1(){return this.op1;} + public SaExp getOp2(){return this.op2;} + + public Type getType(){ + return Type.BOOL; + } + + public <T> T accept(SaVisitor <T> visitor) throws Exception { + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + op1 + " " + op2 + ")"; + } +} diff --git a/src/sa/SaExpInt.java b/src/sa/SaExpInt.java new file mode 100644 index 0000000..10bd6d6 --- /dev/null +++ b/src/sa/SaExpInt.java @@ -0,0 +1,26 @@ +package sa; +import util.Type; + +public class SaExpInt implements SaExp{ + private int val; + + public SaExpInt(int val){ + this.val = val; + } + + public int getVal(){ + return this.val; + } + + public Type getType(){ + return Type.ENTIER; + } + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return Integer.toString(val); + } +} diff --git a/src/sa/SaExpLire.java b/src/sa/SaExpLire.java new file mode 100644 index 0000000..53d8520 --- /dev/null +++ b/src/sa/SaExpLire.java @@ -0,0 +1,21 @@ +package sa; +import util.Type; + +public class SaExpLire implements SaExp{ + + public SaExpLire(){ + } + + public Type getType(){ + return Type.ENTIER; + } + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return this.getClass().getSimpleName(); + } +} diff --git a/src/sa/SaExpMult.java b/src/sa/SaExpMult.java new file mode 100644 index 0000000..597038d --- /dev/null +++ b/src/sa/SaExpMult.java @@ -0,0 +1,27 @@ +package sa; +import util.Type; + +public class SaExpMult implements SaExp{ + private SaExp op1; + private SaExp op2; + + public SaExpMult(SaExp op1, SaExp op2){ + this.op1 = op1; + this.op2 = op2; + } + + public SaExp getOp1(){return this.op1;} + public SaExp getOp2(){return this.op2;} + + public Type getType(){ + return Type.ENTIER; + } + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + op1 + " " + op2 + ")"; + } +} diff --git a/src/sa/SaExpNot.java b/src/sa/SaExpNot.java new file mode 100644 index 0000000..60a1c08 --- /dev/null +++ b/src/sa/SaExpNot.java @@ -0,0 +1,26 @@ +package sa; +import util.Type; + +public class SaExpNot implements SaExp{ + private SaExp op1; + + public SaExpNot(SaExp op1){ + this.op1 = op1; + } + + public SaExp getOp1(){return this.op1;} + public SaExp getOp2(){return null;} + + public Type getType(){ + return Type.BOOL; + } + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + op1 + ")"; + } +} diff --git a/src/sa/SaExpOr.java b/src/sa/SaExpOr.java new file mode 100644 index 0000000..ec9807d --- /dev/null +++ b/src/sa/SaExpOr.java @@ -0,0 +1,28 @@ +package sa; +import util.Type; + +public class SaExpOr implements SaExp{ + private SaExp op1; + private SaExp op2; + + public SaExpOr(SaExp op1, SaExp op2){ + this.op1 = op1; + this.op2 = op2; + } + + public SaExp getOp1(){return this.op1;} + public SaExp getOp2(){return this.op2;} + + public Type getType(){ + return Type.BOOL; + } + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + op1 + " " + op2 + ")"; + } +} diff --git a/src/sa/SaExpSub.java b/src/sa/SaExpSub.java new file mode 100644 index 0000000..bf02733 --- /dev/null +++ b/src/sa/SaExpSub.java @@ -0,0 +1,28 @@ +package sa; +import util.Type; + +public class SaExpSub implements SaExp{ + private SaExp op1; + private SaExp op2; + + public SaExpSub(SaExp op1, SaExp op2){ + this.op1 = op1; + this.op2 = op2; + } + + public SaExp getOp1(){return this.op1;} + public SaExp getOp2(){return this.op2;} + + public Type getType(){ + return Type.ENTIER; + } + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + op1 + " " + op2 + ")"; + } +} diff --git a/src/sa/SaExpVar.java b/src/sa/SaExpVar.java new file mode 100644 index 0000000..f983c1f --- /dev/null +++ b/src/sa/SaExpVar.java @@ -0,0 +1,24 @@ +package sa; +import util.Type; + +public class SaExpVar implements SaExp{ + private SaVar var; + + public SaExpVar(SaVar var){ + this.var = var; + } + + public SaVar getVar(){return this.var;} + + public Type getType(){ + return this.var.getTsItem().getType(); + } + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + var + ")"; + } +} diff --git a/src/sa/SaExpVrai.java b/src/sa/SaExpVrai.java new file mode 100644 index 0000000..ef99211 --- /dev/null +++ b/src/sa/SaExpVrai.java @@ -0,0 +1,27 @@ +package sa; +import util.Type; + +public class SaExpVrai implements SaExp{ + private final boolean val; + + public SaExpVrai(){ + this.val = true; + } + + public boolean getVal(){ + return this.val; + } + + public Type getType(){ + return Type.BOOL; + } + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "vrai"; + } +} diff --git a/src/sa/SaInst.java b/src/sa/SaInst.java new file mode 100644 index 0000000..409ef53 --- /dev/null +++ b/src/sa/SaInst.java @@ -0,0 +1,5 @@ +package sa; + +public interface SaInst extends SaNode { + +} diff --git a/src/sa/SaInstAffect.java b/src/sa/SaInstAffect.java new file mode 100644 index 0000000..126f741 --- /dev/null +++ b/src/sa/SaInstAffect.java @@ -0,0 +1,22 @@ +package sa; + +public class SaInstAffect implements SaInst{ + private SaVar lhs; + private SaExp rhs; + + public SaInstAffect(SaVar lhs, SaExp rhs){ + this.lhs = lhs; + this.rhs = rhs; + } + public SaVar getLhs(){return this.lhs;} + public SaExp getRhs(){return this.rhs;} + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName()+ " " + lhs + " " + rhs + ")"; + } +} diff --git a/src/sa/SaInstBloc.java b/src/sa/SaInstBloc.java new file mode 100644 index 0000000..8f13f49 --- /dev/null +++ b/src/sa/SaInstBloc.java @@ -0,0 +1,19 @@ +package sa; + +public class SaInstBloc implements SaInst{ + private SaLInst val; + + public SaInstBloc(SaLInst val){ + this.val = val; + } + + public SaLInst getVal(){return this.val;} + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + val + ")"; + } +} diff --git a/src/sa/SaInstEcriture.java b/src/sa/SaInstEcriture.java new file mode 100644 index 0000000..4ba2af3 --- /dev/null +++ b/src/sa/SaInstEcriture.java @@ -0,0 +1,20 @@ +package sa; + +public class SaInstEcriture implements SaInst{ + private SaExp arg; + + public SaInstEcriture(SaExp arg){ + this.arg = arg; + } + + public SaExp getArg(){return this.arg;} + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + arg + ")"; + } +} diff --git a/src/sa/SaInstRetour.java b/src/sa/SaInstRetour.java new file mode 100644 index 0000000..c3993e8 --- /dev/null +++ b/src/sa/SaInstRetour.java @@ -0,0 +1,24 @@ +package sa; +import util.Type; + +public class SaInstRetour implements SaInst{ + private SaExp val; + + public SaInstRetour(SaExp val){ + this.val = val; + } + + public Type getType(){ + return val.getType(); + } + public SaExp getVal(){return this.val;} + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + val + ")"; + } +} diff --git a/src/sa/SaInstSi.java b/src/sa/SaInstSi.java new file mode 100644 index 0000000..fc8c1d7 --- /dev/null +++ b/src/sa/SaInstSi.java @@ -0,0 +1,26 @@ +package sa; + +public class SaInstSi implements SaInst{ + private SaExp test; + private SaInst alors; + private SaInst sinon; + + public SaInstSi(SaExp test, SaInst alors, SaInst sinon){ + this.test = test; + this.alors = alors; + this.sinon = sinon; + } + + public SaExp getTest(){return this.test;} + public SaInst getAlors(){return this.alors;} + public SaInst getSinon(){return this.sinon;} + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + test + " " + alors + " " + sinon + ")"; + } +} diff --git a/src/sa/SaInstTantQue.java b/src/sa/SaInstTantQue.java new file mode 100644 index 0000000..dfc87e1 --- /dev/null +++ b/src/sa/SaInstTantQue.java @@ -0,0 +1,23 @@ +package sa; + +public class SaInstTantQue implements SaInst{ + private SaExp test; + private SaInst faire; + + public SaInstTantQue(SaExp test, SaInst faire){ + this.test = test; + this.faire = faire; + } + + public SaExp getTest(){return this.test;} + public SaInst getFaire(){return this.faire;} + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + test + " " + faire + ")"; + } +} diff --git a/src/sa/SaLDecFonc.java b/src/sa/SaLDecFonc.java new file mode 100644 index 0000000..73135ae --- /dev/null +++ b/src/sa/SaLDecFonc.java @@ -0,0 +1,28 @@ +package sa; + +public class SaLDecFonc implements SaNode{ + private SaDecFonc tete; + private SaLDecFonc queue; + + public SaLDecFonc(SaDecFonc tete, SaLDecFonc queue){ + this.tete = tete; + this.queue = queue; + } + + public SaDecFonc getTete(){return this.tete;} + public SaLDecFonc getQueue(){return this.queue;} + + public int length(){ + if(this.queue == null) return 1; + return 1 + this.queue.length() ; + } + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + tete + " " + queue + ")"; + } + +} diff --git a/src/sa/SaLDecVar.java b/src/sa/SaLDecVar.java new file mode 100644 index 0000000..9f69dc3 --- /dev/null +++ b/src/sa/SaLDecVar.java @@ -0,0 +1,27 @@ +package sa; + +public class SaLDecVar implements SaNode{ + private SaDecVar tete; + private SaLDecVar queue; + + public SaLDecVar(SaDecVar tete, SaLDecVar queue){ + this.tete = tete; + this.queue = queue; + } + + public SaDecVar getTete(){return this.tete;} + public SaLDecVar getQueue(){return this.queue;} + + public int length(){ + if(this.queue == null) return 1; + return 1 + this.queue.length() ; + } + + public <T> T accept(SaVisitor <T> visitor) throws Exception { + return visitor.visit(this); + } + public String toString(){ + return "(" + this.getClass().getSimpleName() + " " + tete + " " + queue + ")"; + } + +} diff --git a/src/sa/SaLExp.java b/src/sa/SaLExp.java new file mode 100644 index 0000000..a6e489f --- /dev/null +++ b/src/sa/SaLExp.java @@ -0,0 +1,30 @@ +package sa; + +public class SaLExp implements SaNode{ + private SaExp tete; + private SaLExp queue; + + public SaLExp(SaExp tete, SaLExp queue){ + this.tete = tete; + this.queue = queue; + } + + public SaExp getTete(){return this.tete;} + public SaLExp getQueue(){return this.queue;} + + public int length(){ + if(this.queue == null) return 1; + return 1 + this.queue.length() ; + } + + + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + tete + " " + queue + ")"; + } +} diff --git a/src/sa/SaLInst.java b/src/sa/SaLInst.java new file mode 100644 index 0000000..29c7cd0 --- /dev/null +++ b/src/sa/SaLInst.java @@ -0,0 +1,23 @@ +package sa; + +public class SaLInst implements SaNode{ + private SaInst tete; + private SaLInst queue; + + public SaLInst(SaInst tete, SaLInst queue){ + this.tete = tete; + this.queue = queue; + } + + public SaInst getTete(){return this.tete;} + public SaLInst getQueue(){return this.queue;} + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + public String toString(){ + return "(" + this.getClass().getSimpleName() + " " + tete + " " + queue +")"; + } + +} diff --git a/src/sa/SaNode.java b/src/sa/SaNode.java new file mode 100644 index 0000000..cd65a01 --- /dev/null +++ b/src/sa/SaNode.java @@ -0,0 +1,6 @@ +package sa; + +public interface SaNode{ + public <T> T accept(SaVisitor <T> visitor) throws Exception; +} + diff --git a/src/sa/SaProg.java b/src/sa/SaProg.java new file mode 100644 index 0000000..f0081db --- /dev/null +++ b/src/sa/SaProg.java @@ -0,0 +1,21 @@ +package sa; + +public class SaProg implements SaNode{ + private SaLDecVar variables; + private SaLDecFonc fonctions; + + public SaProg(SaLDecVar variables, SaLDecFonc fonctions){ + this.variables = variables; + this.fonctions = fonctions; + } + + public SaLDecVar getVariables(){return this.variables;} + public SaLDecFonc getFonctions(){return this.fonctions;} + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + public String toString(){ + return "(" + this.getClass().getSimpleName() + " " + variables + " " + fonctions +")"; + } +} diff --git a/src/sa/SaTypeCheck.java b/src/sa/SaTypeCheck.java new file mode 100644 index 0000000..60e71ef --- /dev/null +++ b/src/sa/SaTypeCheck.java @@ -0,0 +1,32 @@ +package sa; +import util.Type; +import util.Error; +import ts.*; + +public class SaTypeCheck extends SaDepthFirstVisitor <Void>{ + private TsItemFct fonctionCourante; + + public SaTypeCheck(SaNode root) + { + try{ + root.accept(this); + } catch(ErrorException e){ + System.err.print("ERREUR DE TYPAGE : "); + System.err.println(e.getMessage()); + System.exit(e.getCode()); + } catch(Exception e){} + } + + public void defaultIn(SaNode node) + { + // System.out.println("<" + node.getClass().getSimpleName() + ">"); + } + + public void defaultOut(SaNode node) + { + // System.out.println("</" + node.getClass().getSimpleName() + ">"); + } + + + +} diff --git a/src/sa/SaVar.java b/src/sa/SaVar.java new file mode 100644 index 0000000..8e5536e --- /dev/null +++ b/src/sa/SaVar.java @@ -0,0 +1,6 @@ +package sa; +import ts.*; + +public interface SaVar extends SaNode { + TsItemVar getTsItem(); +} diff --git a/src/sa/SaVarIndicee.java b/src/sa/SaVarIndicee.java new file mode 100644 index 0000000..d125b11 --- /dev/null +++ b/src/sa/SaVarIndicee.java @@ -0,0 +1,27 @@ +package sa; +import ts.*; + +public class SaVarIndicee implements SaVar{ + private String nom; + private SaExp indice; + public TsItemVar tsItem; + + public SaVarIndicee(String nom, SaExp indice){ + this.nom = nom; + this.indice = indice; + this.tsItem = null; + } + + public TsItemVar getTsItem(){return this.tsItem;} + public String getNom(){return this.nom;} + public SaExp getIndice(){return this.indice;} + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName() + " " + nom + " " + indice +")"; + } +} diff --git a/src/sa/SaVarSimple.java b/src/sa/SaVarSimple.java new file mode 100644 index 0000000..d496e74 --- /dev/null +++ b/src/sa/SaVarSimple.java @@ -0,0 +1,24 @@ +package sa; +import ts.*; + +public class SaVarSimple implements SaVar{ + public String nom; + public TsItemVarSimple tsItem; + + public SaVarSimple(String nom){ + this.nom = nom; + this.tsItem = null; + } + + public String getNom(){return this.nom;} + public TsItemVarSimple getTsItem(){return this.tsItem;} + + public <T> T accept(SaVisitor <T> visitor) throws Exception{ + return visitor.visit(this); + } + + @Override + public String toString() { + return "(" + this.getClass().getSimpleName()+ " " + nom + ")"; + } +} diff --git a/src/sa/SaVisitor.java b/src/sa/SaVisitor.java new file mode 100644 index 0000000..3d28bb7 --- /dev/null +++ b/src/sa/SaVisitor.java @@ -0,0 +1,38 @@ +package sa; + +interface SaVisitor <T> { + public T visit(SaProg node) throws Exception; + public T visit(SaInstEcriture node) throws Exception; + public T visit(SaInstTantQue node) throws Exception; + public T visit(SaInstBloc node) throws Exception; + public T visit(SaInstSi node) throws Exception; + public T visit(SaInstAffect node) throws Exception; + public T visit(SaInstRetour node) throws Exception; + public T visit(SaLInst node) throws Exception; + public T visit(SaDecFonc node) throws Exception; + public T visit(SaDecVar node) throws Exception; + public T visit(SaDecTab node) throws Exception; + // public T visit(SaLDec node) throws Exception; + public T visit(SaLDecVar node) throws Exception; + public T visit(SaLDecFonc node) throws Exception; + public T visit(SaVarSimple node) throws Exception; + public T visit(SaVarIndicee node) throws Exception; + public T visit(SaAppel node) throws Exception; + public T visit(SaExp node) throws Exception; + public T visit(SaExpLire node) throws Exception; + public T visit(SaExpInt node) throws Exception; + public T visit(SaExpVrai node) throws Exception; + public T visit(SaExpFaux node) throws Exception; + public T visit(SaExpVar node) throws Exception; + public T visit(SaExpAppel node) throws Exception; + public T visit(SaExpAdd node) throws Exception; + public T visit(SaExpSub node) throws Exception; + public T visit(SaExpMult node) throws Exception; + public T visit(SaExpDiv node) throws Exception; + public T visit(SaExpInf node) throws Exception; + public T visit(SaExpEqual node) throws Exception; + public T visit(SaExpAnd node) throws Exception; + public T visit(SaExpOr node) throws Exception; + public T visit(SaExpNot node) throws Exception; + public T visit(SaLExp node) throws Exception; +} diff --git a/src/sa/Sc2sa.java b/src/sa/Sc2sa.java new file mode 100644 index 0000000..0bc4abd --- /dev/null +++ b/src/sa/Sc2sa.java @@ -0,0 +1,43 @@ +package sa; +import lParser.analysis.*; +import lParser.node.*; +import util.Type; + +public class Sc2sa extends DepthFirstAdapter +{ + private SaNode returnValue; + private Type returnType; + private SaProg saRoot = null; + + public void defaultIn(@SuppressWarnings("unused") Node node) + { + //System.out.println("<" + node.getClass().getSimpleName() + ">"); + } + + public void defaultOut(@SuppressWarnings("unused") Node node) + { + //System.out.println("</" + node.getClass().getSimpleName() + ">"); + } + + public SaProg getRoot() + { + return this.saRoot; + } + + + // exp3 = {plus} exp3 plus exp4 + /* @Override + public void caseAPlusExp3(APlusExp3 node) + { + SaExp op1 = null; + SaExp op2 = null; + inAPlusExp3(node); + node.getExp3().apply(this); + op1 = (SaExp) this.returnValue; + node.getExp4().apply(this); + op2 = (SaExp) this.returnValue; + this.returnValue = new SaExpAdd(op1, op2); + outAPlusExp3(node); + }*/ +} + diff --git a/src/sa/TypeVal.java b/src/sa/TypeVal.java new file mode 100644 index 0000000..54cf58b --- /dev/null +++ b/src/sa/TypeVal.java @@ -0,0 +1,31 @@ +package sa; +import util.Type; + +public class TypeVal{ + public Type type; + public boolean valBool; + public int valInt; + + public TypeVal(int val) + { + type = Type.ENTIER; + valInt = val; + } + + public TypeVal(boolean val) + { + type = Type.BOOL; + valBool = val; + } + + public String toString(){ + if(type == Type.BOOL){ + return (valBool == true)? String.valueOf(1): String.valueOf(0); + } + else{ + return String.valueOf(valInt); + } + } + + +} diff --git a/src/sc/Sc2Xml.java b/src/sc/Sc2Xml.java new file mode 100644 index 0000000..a70781c --- /dev/null +++ b/src/sc/Sc2Xml.java @@ -0,0 +1,48 @@ +package sc; +import java.io.*; +import lParser.analysis.*; +import lParser.node.*; + +public class Sc2Xml extends DepthFirstAdapter +{ + private int indentation; + private String baseFileName; + private String fileName; + private PrintStream out; + + public Sc2Xml(String baseFileName) + { + + if (baseFileName == null){ + this.out = System.out; + + } + else{ + try { + this.baseFileName = baseFileName; + this.fileName = baseFileName + ".sc"; + this.out = new PrintStream(this.fileName); + } + + catch (IOException e) { + System.err.println("Error: " + e.getMessage()); + } + } + } + + + public void defaultIn(@SuppressWarnings("unused") Node node) + { + for(int i = 0; i < this.indentation; i++){this.out.print(" ");} + this.indentation++; + this.out.println("<" + node.getClass().getSimpleName() + ">"); + } + + public void defaultOut(@SuppressWarnings("unused") Node node) + { + this.indentation--; + for(int i = 0; i < this.indentation; i++){this.out.print(" ");} + this.out.println("</" + node.getClass().getSimpleName() + ">"); + } + +} diff --git a/src/ts/Sa2ts.java b/src/ts/Sa2ts.java new file mode 100644 index 0000000..50a80a6 --- /dev/null +++ b/src/ts/Sa2ts.java @@ -0,0 +1,36 @@ +package ts; +import sa.*; +import util.Error; + +public class Sa2ts extends SaDepthFirstVisitor <Void> { + enum Context { + LOCAL, + GLOBAL, + PARAM + } + + private Ts tableGlobale; + private Ts tableLocaleCourante; + private Context context; + + public Ts getTableGlobale(){return this.tableGlobale;} + + public Sa2ts() + { + tableGlobale = new Ts(); + tableLocaleCourante = null; + context = Context.GLOBAL; + } + + public void defaultIn(SaNode node) + { + // System.out.println("<" + node.getClass().getSimpleName() + ">"); + } + + public void defaultOut(SaNode node) + { + // System.out.println("</" + node.getClass().getSimpleName() + ">"); + } + + +} diff --git a/src/ts/Ts.java b/src/ts/Ts.java new file mode 100644 index 0000000..d95fb75 --- /dev/null +++ b/src/ts/Ts.java @@ -0,0 +1,147 @@ +package ts; +import java.io.*; +import java.util.*; +import sa.*; +import util.Type; + +public class Ts +{ + public Map< String, TsItemFct> fonctions; + public Map< String, TsItemVar> variables; + private int adrVarCourante; + private int adrArgCourante; + + public int getAdrVarCourante(){return adrVarCourante;} + public int getAdrArgCourante(){return adrArgCourante;} + + public Ts(){ + this.fonctions = new HashMap< String, TsItemFct>(); + this.variables = new HashMap< String, TsItemVar>(); + this.adrVarCourante = 0; + this.adrArgCourante = 0; + } + + public TsItemVar addVar(String identif, Type type) + { + TsItemVar item = new TsItemVarSimple(identif, type); + item.portee = this; + item.adresse = this.adrVarCourante; + item.isParam = false; + this.adrVarCourante += type.taille(); + this.variables.put(identif, item); + return item; + } + + public TsItemVar addParam(String identif, Type type) + { + TsItemVar item = new TsItemVarSimple(identif, type); + item.portee = this; + item.adresse = this.adrArgCourante; + item.isParam = true; + this.adrArgCourante += type.taille(); + this.variables.put(identif, item); + return item; + } + + public TsItemVar addTab(String identif, Type type, int taille) + { + TsItemVar item = new TsItemVarTab(identif, type, taille); + item.portee = this; + item.adresse = this.adrVarCourante; + this.adrVarCourante += taille * type.taille(); + this.variables.put(identif, item); + return item; + } + + public TsItemFct addFct(String identif, Type typeRetour, int nbArgs, Ts table, SaDecFonc saDecFonc) + { + TsItemFct item = new TsItemFct(identif, typeRetour, nbArgs, table, saDecFonc); + this.fonctions.put(identif, item); + return item; + } + + public TsItemVar getVar(String identif) + { + return variables.get(identif); + } + + public TsItemFct getFct(String identif) + { + return fonctions.get(identif); + } + + public Ts getTableLocale(String identif){ + TsItemFct item = this.fonctions.get(identif); + if(item == null) + return null; + else + return item.getTable(); + } + + + public void affiche(PrintStream out){ + ArrayList< Map.Entry< String, TsItemVar> > stVar = new ArrayList<Map.Entry< String, TsItemVar>>(this.variables.entrySet()); + Collections.sort(stVar, new Comparator<Map.Entry< String, TsItemVar>>() { + @Override + public int compare(Map.Entry< String, TsItemVar> entry1, Map.Entry< String, TsItemVar> entry2) + { + return entry1.getKey().compareTo(entry2.getKey()); + } + }); + for (Map.Entry< String, TsItemVar> me:stVar){ + out.println(me.getValue()); + // out.println(me.getKey() + ":\t" + me.getValue()); + } + + ArrayList< Map.Entry< String, TsItemFct> > stFct = new ArrayList<Map.Entry< String, TsItemFct>>(this.fonctions.entrySet()); + Collections.sort(stFct, new Comparator<Map.Entry< String, TsItemFct>>() { + @Override + public int compare(Map.Entry< String, TsItemFct> entry1, Map.Entry< String, TsItemFct> entry2) + { + return entry1.getKey().compareTo(entry2.getKey()); + } + }); + for (Map.Entry< String, TsItemFct> me:stFct){ + out.println(me.getValue()); + // out.println(me.getKey() + ":\t" + me.getValue()); + } + } + + public void afficheTablesLocales(PrintStream out){ + ArrayList< Map.Entry< String, TsItemFct> > st = new ArrayList<Map.Entry< String, TsItemFct>>(this.fonctions.entrySet()); + Collections.sort(st, new Comparator<Map.Entry< String, TsItemFct>>() { + @Override + public int compare(Map.Entry< String, TsItemFct> entry1, Map.Entry< String, TsItemFct> entry2) + { + return entry1.getKey().compareTo(entry2.getKey()); + } + }); + for (Map.Entry< String, TsItemFct> me:st){ + if(me.getValue().getTable() != null){ + out.println("TABLE LOCALE : " + me.getKey()); + me.getValue().getTable().affiche(out); + } + } + } + + public void afficheTout(String baseFileName){ + String fileName; + PrintStream out = System.out; + + if (baseFileName != null){ + try { + baseFileName = baseFileName; + fileName = baseFileName + ".ts"; + out = new PrintStream(fileName); + } + + catch (IOException e) { + System.err.println("Error: " + e.getMessage()); + } + } + out.println("TABLE GLOBALE"); + this.affiche(out); + this.afficheTablesLocales(out); + } + +} diff --git a/src/ts/TsItemFct.java b/src/ts/TsItemFct.java new file mode 100644 index 0000000..03e87f6 --- /dev/null +++ b/src/ts/TsItemFct.java @@ -0,0 +1,30 @@ +package ts; +import sa.*; +import util.Type; + + +public class TsItemFct { + public String identif; + public int nbArgs; + public Ts table; + public SaDecFonc saDecFonc; + public Type typeRetour; + + public TsItemFct(String identif, Type typeRetour, int nbArgs, Ts table, SaDecFonc saDecFonc){ + this.identif = identif; + this.nbArgs = nbArgs; + this.table = table; + this.saDecFonc = saDecFonc; + this.typeRetour = typeRetour; + } + + public int getNbArgs(){return this.nbArgs;} + public Ts getTable(){return this.table;} + public Type getTypeRetour(){return this.typeRetour;} + public String getIdentif(){return this.identif;} + public String toString(){ + return this.identif + "\tFCT\t" + typeRetour + "\t" + this.nbArgs; + } + +} + diff --git a/src/ts/TsItemVar.java b/src/ts/TsItemVar.java new file mode 100644 index 0000000..7dae2bb --- /dev/null +++ b/src/ts/TsItemVar.java @@ -0,0 +1,20 @@ +package ts; +import util.Type; + +public abstract class TsItemVar { + public Ts portee; + public int adresse; + public String identif; + public int taille; + public boolean isParam; + public Type type; + + public int getAdresse(){return this.adresse;} + public String getIdentif(){return this.identif;} + public Ts getPortee() {return this.portee;} + public Type getType() {return this.type;} + public int getTaille(){return this.taille;} + + +} + diff --git a/src/ts/TsItemVarSimple.java b/src/ts/TsItemVarSimple.java new file mode 100644 index 0000000..ae2a555 --- /dev/null +++ b/src/ts/TsItemVarSimple.java @@ -0,0 +1,22 @@ +package ts; +import util.Type; + +public class TsItemVarSimple extends TsItemVar{ + public TsItemVarSimple(String identif, Type type){ + this.identif = identif; + this.adresse = 0; + this.portee = null; + this.taille = 1; + this.isParam = false; + this.type = type; + } + + public String toString(){ + if(this.isParam) + return this.identif + "\tPARAM\t" + this.type + "\t" + this.adresse; + else + return this.identif + "\tVAR \t" + this.type + "\t" + this.adresse; + } + +} + diff --git a/src/ts/TsItemVarTab.java b/src/ts/TsItemVarTab.java new file mode 100644 index 0000000..56c0a11 --- /dev/null +++ b/src/ts/TsItemVarTab.java @@ -0,0 +1,19 @@ +package ts; +import util.Type; + +public class TsItemVarTab extends TsItemVar{ + public TsItemVarTab(String identif, Type type, int taille){ + this.identif = identif; + this.adresse = 0; + this.portee = null; + this.taille = taille; + this.isParam = false; + this.type = type; + } + + public String toString(){ + return this.identif + "\tTAB \t" + this.type + "\t" + this.adresse + "\t" + this.taille; + } + +} + diff --git a/src/ts/TsParser.java b/src/ts/TsParser.java new file mode 100644 index 0000000..509bff6 --- /dev/null +++ b/src/ts/TsParser.java @@ -0,0 +1,71 @@ +package ts; + +import ts.Ts; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import util.Type; + +public class TsParser { + private Ts tableCourante = null; + private Ts tableGlobale = null; + + public TsParser(){ + + } + + public Ts parse(String filePath){ + try { + Files.lines(Paths.get(filePath)).forEachOrdered(this::processLine);; + } catch(IOException e){ + e.printStackTrace(); + } + return tableGlobale; + } + + private void processLine(String line){ +// System.out.println(line); + var tokens = line.split("([ ]|[\t])+"); + if(tokens[1].equals("GLOBALE")){ + tableGlobale = new Ts(); + tableCourante = tableGlobale; + return; + } + if(tokens[1].equals("LOCALE")){ + tableCourante = tableGlobale.getFct(tokens[3]).getTable(); + return; + } + if(tokens[1].equals("VAR")){ + tableCourante.addVar(tokens[0], Type.fromString(tokens[2])); + return; + } + if(tokens[1].equals("PARAM")){ + tableCourante.addParam(tokens[0], Type.fromString(tokens[2])); + return; + } + if(tokens[1].equals("TAB")){ + tableCourante.addTab(tokens[0], Type.fromString(tokens[2]), Integer.parseInt(tokens[4])); + return; + } + if(tokens[1].equals("FCT")){ + tableGlobale.addFct(tokens[0], Type.fromString(tokens[2]), Integer.parseInt(tokens[3]), new Ts(), null); + return; + } + } + /* + public static void main(String args[]){ + var parser = new SymbolsTableParser(); + var r = parser.parse("function.ts"); + System.out.println("---Table Globale---"); + r.affiche(System.out); + System.out.println("---Tables Locales---"); + r.afficheTablesLocales(System.out); + }*/ +} diff --git a/src/util/Error.java b/src/util/Error.java new file mode 100644 index 0000000..4a75000 --- /dev/null +++ b/src/util/Error.java @@ -0,0 +1,21 @@ +package util; + +public enum Error{ + NOERROR(0, "sortie normale"), + TYPE(3, "erreur de types"), + TS(4, "table des symboles"), + SYNT(5,"erreur de syntaxe"), + LEX(6, "lexical error"); + + private final String message; + private final int code; + + Error(int code, String message){ + this.code = code; + this.message = message; + } + + public String toString(){return message;} + public String message(){return message;} + public int code(){return code;} +} diff --git a/src/util/Memory.java b/src/util/Memory.java new file mode 100644 index 0000000..688a9da --- /dev/null +++ b/src/util/Memory.java @@ -0,0 +1,224 @@ +package util; + +/* Big Endian */ + +public class Memory{ + /* stack segment */ + private int ss; + + /* data segment */ + private int ds; + + public int esp; // adresse du sommet de la pile en octets + private int memSize; + private int dataSize; + private int stackSize; + private byte[] mem; + + public Memory(int dataSize, int stackSize){ + this.dataSize = dataSize; + this.stackSize = stackSize; + this.memSize = dataSize + stackSize; + mem = new byte[memSize]; + ss = memSize - 1; + esp = ss; + ds = 0; + } + + public void printStack(){ + for(int adr = ss - 3; adr > esp; adr = adr - 4){ + System.out.print(readInt(adr) + "\t"); + } + System.out.println(); + } + + public int readInt(int address){ + if((address < 0) || (address + 3 > ss)) + throw new RuntimeException("segmentation fault"); + return bytesToInt(mem[address], mem[address + 1], mem[address + 2], mem[address + 3]); + } + + + public boolean readBoolean(int address){ + if((address < 0) || (address > ss)) + throw new RuntimeException("segmentation fault"); + return byteToBoolean(mem[address]); + } + + public byte readByte(int address){ + if((address < 0) || (address > ss)) + throw new RuntimeException("segmentation fault"); + return mem[address]; + } + + public void writeInt(int address, int value){ + if((address < 0) || (address + 3 > ss)) + throw new RuntimeException("segmentation fault"); + + byte[] fourBytes = intToBytes(value); + mem[address] = fourBytes[0]; + mem[address + 1] = fourBytes[1]; + mem[address + 2] = fourBytes[2]; + mem[address + 3] = fourBytes[3]; + } + + public void writeToMemory(int address, int value){ + if((address < 0) || (address + 3 > ss)) + throw new RuntimeException("segmentation fault"); + + byte[] fourBytes = intToBytes(value); + mem[address] = fourBytes[0]; + mem[address + 1] = fourBytes[1]; + mem[address + 2] = fourBytes[2]; + mem[address + 3] = fourBytes[3]; + } + + /* public void writeToMemory(int address, boolean value) + { + if((address < 0) || (address > ss)) + throw new RuntimeException("segmentation fault"); + mem[address] = booleanToByte(value); + }*/ + + + /* revoir c'est quoi cette affaire */ + public int readNBytes(int address, int n){ + // System.out.println("read memory at address " + address); + if((address < 0) || (address + n - 1 > ss)) + throw new RuntimeException("segmentation fault"); + if(n == 1) + return (int)mem[address]; + // if(n == 4) revoir pourquoi c'est commenté !! + return bytesToInt(mem[address], mem[address + 1], mem[address + 2], mem[address + 3]); + + } + + /* public void writeNBytes(int address, int value){ + if((address < 0) || (address + n - 1 > ss)) + throw new RuntimeException("segmentation fault"); + + byte[] fourBytes = intToBytes(value); + mem[address] = fourBytes[0]; + mem[address + 1] = fourBytes[1]; + mem[address + 2] = fourBytes[2]; + mem[address + 3] = fourBytes[3]; + }*/ + + + + public void writeBoolean(int address, boolean value) + { + if((address < 0) || (address > ss)) + throw new RuntimeException("segmentation fault"); + mem[address] = booleanToByte(value); + } + + public void pushInt(int value){ + if(esp - 3 < dataSize) + throw new RuntimeException("stack overflow"); + + byte[] fourBytes = intToBytes(value); + mem[--esp] = fourBytes[3]; + mem[--esp] = fourBytes[2]; + mem[--esp] = fourBytes[1]; + mem[--esp] = fourBytes[0]; + + + } + /* + public void pushBoolean(boolean value){ + if(esp == dataSize) + throw new RuntimeException("stack overflow"); + mem[esp] = booleanToByte(value); + esp--; + + }*/ + + public int getTopInt(){ + // if(esp == ss) + // throw new RuntimeException("empty stack"); + byte byte0 = mem[esp]; + byte byte1 = mem[esp-1]; + byte byte2 = mem[esp-2]; + byte byte3 = mem[esp-3]; + return bytesToInt(byte0, byte1, byte2, byte3); + } + + public int popInt(){ + if(esp + 3 >= ss) + throw new RuntimeException("stack underflow"); + byte byte0 = mem[esp++]; + byte byte1 = mem[esp++]; + byte byte2 = mem[esp++]; + byte byte3 = mem[esp++]; + + return bytesToInt(byte0, byte1, byte2, byte3); + } + + /* public boolean popBoolean() + { + if(esp == ss) + throw new RuntimeException("stack underflow"); + byte byte0 = mem[esp]; + esp++; + return byteToBoolean(byte0); + }*/ + + public int bytesToInt(byte byte0, byte byte1, byte byte2, byte byte3){ + return ((byte0 & 0xFF) << 24) | + ((byte1 & 0xFF) << 16) | + ((byte2 & 0xFF) << 8) | + ((byte3 & 0xFF) << 0); + } + + public byte[] intToBytes2( int data ) { + byte[] result = new byte[4]; + result[0] = (byte) ((data & 0xFF000000) >> 24); + result[1] = (byte) ((data & 0x00FF0000) >> 16); + result[2] = (byte) ((data & 0x0000FF00) >> 8); + result[3] = (byte) ((data & 0x000000FF) >> 0); + return result; +} + public byte[] intToBytes(int i) + { + byte[] result = new byte[4]; + + result[0] = (byte) (i >> 24); + result[1] = (byte) (i >> 16); + result[2] = (byte) (i >> 8); + result[3] = (byte) (i /*>> 0*/); + + return result; + } + + public byte booleanToByte(boolean value) + { + return (value == true)? (byte) 1 : (byte) 0; + } + + public boolean byteToBoolean(byte value) + { + return (value == 1)? true : false; + } + + + /* public static void main(String[] args){ + Memory mem = new Memory(100, 100); + mem.pushInt(3467); + int v = mem.popInt(); + System.out.println("val =" + v); + mem.pushInt(3468); + v = mem.popInt(); + System.out.println("val =" + v); + + mem.writeInt(96, 234); + int val = mem.readInt(96); + System.out.println("val =" + val); + + mem.writeInt(150, 23); + val = mem.readInt(250); + System.out.println("val =" + val); + + }*/ + +} diff --git a/src/util/Type.java b/src/util/Type.java new file mode 100644 index 0000000..89e5574 --- /dev/null +++ b/src/util/Type.java @@ -0,0 +1,30 @@ +package util; + +public enum Type{ + NUL("nul", 0), + ENTIER("entier", 4), + BOOL("bool", 1); + + private final String nom; + private final int taille; // taille en octets + + Type(String nom, int taille){ + this.nom = nom; + this.taille = taille; + } + + public String toString(){return nom;} + public static Type fromString(String nom){ + if(nom.equals("entier")){return Type.ENTIER;} + if(nom.equals("ENTIER")){return Type.ENTIER;} + if(nom.equals("bool")){return Type.BOOL;} + if(nom.equals("BOOL")){return Type.BOOL;} + if(nom.equals("nul")){return Type.NUL;} + if(nom.equals("NUL")){return Type.NUL;} + return null; + } + + public String nom(){return nom;} + public int taille(){return taille;} + public static boolean checkCompatibility(Type t1, Type t2){return t1 == t2;} +} diff --git a/src/util/graph/ColorGraph.java b/src/util/graph/ColorGraph.java new file mode 100644 index 0000000..55b867e --- /dev/null +++ b/src/util/graph/ColorGraph.java @@ -0,0 +1,38 @@ +package util.graph; + +import util.graph.*; +import util.intset.*; +import java.util.*; +import java.io.*; + +public class ColorGraph { + public Graph graph; + public int vertexNb; + private Stack<Integer> stack; + public IntSet removed; + public IntSet spill; + public int[] color; + public int colorNb; + public Node[] int2Node; + static int NOCOLOR = -1; + + public ColorGraph(Graph graph, int colorNb, int[] preColoredVertices){ + this.graph = graph; + this.colorNb = colorNb; + stack = new Stack<Integer>(); + vertexNb = graph.nodeCount(); + color = new int[vertexNb]; + removed = new IntSet(vertexNb); + spill = new IntSet(vertexNb); + int2Node = graph.nodeArray(); + for(int v=0; v < vertexNb; v++){ + int preColor = preColoredVertices[v]; + if(preColor >= 0 && preColor < colorNb) + color[v] = preColoredVertices[v]; + else + color[v] = NOCOLOR; + } + } + + +} diff --git a/src/util/graph/Graph.java b/src/util/graph/Graph.java new file mode 100644 index 0000000..d62bdb0 --- /dev/null +++ b/src/util/graph/Graph.java @@ -0,0 +1,83 @@ +package util.graph; + +public class Graph { + + int nodecount=0; + NodeList mynodes, mylast; + public NodeList nodes() { return mynodes;} + + public Node newNode() { + return new Node(this); + } + + void check(Node n) { + if (n.mygraph != this) + throw new Error("Graph.addEdge using nodes from the wrong graph"); + } + + public int nodeCount(){ + return nodecount; + } + + static boolean inList(Node a, NodeList l) { + for(NodeList p=l; p!=null; p=p.tail) + if (p.head==a) return true; + return false; + } + + public Node[] nodeArray(){ + Node[] array = new Node[nodecount]; + for(NodeList q=mynodes; q!=null; q=q.tail) { + array[q.head.mykey] = q.head; + } + return array; + } + + + public void addNOEdge(Node from, Node to) { + check(from); check(to); + if (! from.goesTo(to)){ + to.preds=new NodeList(from, to.preds); + from.succs=new NodeList(to, from.succs); + } + if (! to.goesTo(from)){ + from.preds=new NodeList(to, from.preds); + to.succs=new NodeList(from, to.succs); + } + } + + public void addEdge(Node from, Node to) { + check(from); check(to); + if (from.goesTo(to)) return; + to.preds=new NodeList(from, to.preds); + from.succs=new NodeList(to, from.succs); + } + + NodeList delete(Node a, NodeList l) { + if (l==null) throw new Error("Graph.rmEdge: edge nonexistent"); + else if (a==l.head) return l.tail; + else return new NodeList(l.head, delete(a, l.tail)); + } + + public void rmEdge(Node from, Node to) { + to.preds=delete(from,to.preds); + from.succs=delete(to,from.succs); + } + + /** + * Print a human-readable dump for debugging. + */ + public void show(java.io.PrintStream out) { + for (NodeList p=nodes(); p!=null; p=p.tail) { + Node n = p.head; + out.print(n.toString()); + out.print(": "); + for(NodeList q=n.succ(); q!=null; q=q.tail) { + out.print(q.head.toString()); + out.print(" "); + } + out.println(); + } + } + +} diff --git a/src/util/graph/Node.java b/src/util/graph/Node.java new file mode 100644 index 0000000..040f118 --- /dev/null +++ b/src/util/graph/Node.java @@ -0,0 +1,55 @@ +package util.graph; + +public class Node { + Graph mygraph; + int mykey; + NodeList succs; + NodeList preds; + + private Node(){} + public Node(Graph g) { + mygraph=g; + mykey= g.nodecount++; + NodeList p = new NodeList(this, null); + if (g.mylast==null) + g.mynodes=g.mylast=p; + else g.mylast = g.mylast.tail = p; + } + + public NodeList succ() {return succs;} + public NodeList pred() {return preds;} + + public int label() {return mykey;} + + + NodeList cat(NodeList a, NodeList b) { + if (a==null) return b; + else return new NodeList(a.head, cat(a.tail,b)); + } + public NodeList adj() {return cat(succ(), pred());} + + int len(NodeList l) { + int i=0; + for(NodeList p=l; p!=null; p=p.tail) i++; + return i; + } + + public int inDegree() {return len(pred());} + public int outDegree() {return len(succ());} + public int degree() {return inDegree()+outDegree();} + + public boolean goesTo(Node n) { + return Graph.inList(n, succ()); + } + + public boolean comesFrom(Node n) { + return Graph.inList(n, pred()); + } + + public boolean adj(Node n) { + return goesTo(n) || comesFrom(n); + } + + public String toString() {return String.valueOf(mykey);} + +} diff --git a/src/util/graph/NodeList.java b/src/util/graph/NodeList.java new file mode 100644 index 0000000..4493b7f --- /dev/null +++ b/src/util/graph/NodeList.java @@ -0,0 +1,10 @@ +package util.graph; + +public class NodeList { + public Node head; + public NodeList tail; + public NodeList(Node h, NodeList t) {head=h; tail=t;} +} + + + diff --git a/src/util/graph/TestColorGraph.java b/src/util/graph/TestColorGraph.java new file mode 100644 index 0000000..c496fae --- /dev/null +++ b/src/util/graph/TestColorGraph.java @@ -0,0 +1,77 @@ +package util.graph; +import util.graph.*; +import util.intset.*; +import java.util.*; +import java.io.*; + +public class TestColorGraph +{ + public static void main(String[] args) + { + Graph g = new Graph(); + /* + Node n0 = g.newNode(); + Node n1 = g.newNode(); + Node n2 = g.newNode(); + Node n3 = g.newNode(); + Node n4 = g.newNode(); + + g.addNOEdge(n0, n1); + g.addNOEdge(n0, n2); + g.addNOEdge(n0, n3); + g.addNOEdge(n0, n4); + + g.addNOEdge(n1, n2); + g.addNOEdge(n1, n3); + g.addNOEdge(n1, n4); + + g.addNOEdge(n2, n3); + g.addNOEdge(n2, n4); + + g.addNOEdge(n3, n4); + */ + + + Node n1 = g.newNode(); + Node n2 = g.newNode(); + Node n3 = g.newNode(); + Node n4 = g.newNode(); + Node n5 = g.newNode(); + Node n6 = g.newNode(); + Node n7 = g.newNode(); + Node n8 = g.newNode(); + Node n9 = g.newNode(); + Node n10 = g.newNode(); + + g.addNOEdge(n1, n2); + g.addNOEdge(n1, n4); + g.addNOEdge(n1, n9); + + g.addNOEdge(n2, n10); + + g.addNOEdge(n3, n8); + g.addNOEdge(n3, n9); + g.addNOEdge(n3, n10); + + g.addNOEdge(n4, n5); + g.addNOEdge(n4, n8); + g.addNOEdge(n4, n10); + + g.addNOEdge(n5, n8); + g.addNOEdge(n5, n10); + + g.addNOEdge(n6, n7); + g.addNOEdge(n6, n8); + g.addNOEdge(n6, n9); + + g.addNOEdge(n7, n8); + + g.addNOEdge(n8, n9); + + g.show(System.out); + int[] colors = new int[]{ -3,-3,-3,0,-3,2,1,-3,-3,-3}; + ColorGraph cg = new ColorGraph(g, 3, colors); + cg.color(); + cg.affiche(); + } +} diff --git a/src/util/intset/IntSet.java b/src/util/intset/IntSet.java new file mode 100644 index 0000000..3d0d5f4 --- /dev/null +++ b/src/util/intset/IntSet.java @@ -0,0 +1,94 @@ +package util.intset; + +public class IntSet{ + private int size; + private boolean array[]; + + public IntSet(int size){ + this.size = size; + array = new boolean[size]; + for (int i = 0; i < size; i++) + array[i] = false; + } + + public int getSize(){ + return size; + } + + public void empty(){ + for (int i = 0; i < size; i++) + array[i] = false; + } + + public boolean isMember(int elt){ + if(elt >= size) return false; + return array[elt]; + } + + public boolean isEmpty(){ + for (int i = 0; i < size; i++) + if(array[i] == true) + return false; + return true; + } + + + public void add(int elt){ + if(elt >= size){ + System.err.println("ERROR : set is too small !!!!"); + } + array[elt] = true; + } + + public void remove(int elt){ + if(elt >= size){ + System.err.println("ERROR : set is too small !!!!"); + } + array[elt] = false; + } + + public IntSet minus(IntSet s){ + for (int i = 0; i < s.size; i++) + if(s.array[i]) + array[i] = false; + return this; + } + + public IntSet copy(){ + IntSet c = new IntSet(size); + for (int i = 0; i < size; i++) + c.array[i] = array[i]; + return c; + } + + public IntSet inter(IntSet s){ + for (int i = 0; i < s.size; i++) + array[i] = array[i] && s.array[i]; + return this; + } + + public IntSet union(IntSet s){ + for (int i = 0; i < s.size; i++) + array[i] = array[i] || s.array[i]; + return this; + } + + public boolean equal(IntSet s){ + for (int i = 0; i < s.size; i++) + if(array[i] != s.array[i]) + return false; + return true; + } + + public String toString(){ + String s = "("; + for (int i = 0; i < size; i++) + if(array[i] == true){ + s += i; + s += " "; + } + s+= ")"; + return s; + } + +} diff --git a/test/c3a-ref/add1.c3a b/test/c3a-ref/add1.c3a new file mode 100644 index 0000000..380ea2a --- /dev/null +++ b/test/c3a-ref/add1.c3a @@ -0,0 +1,6 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 3 + 10 + write @1 + fend diff --git a/test/c3a-ref/add2.c3a b/test/c3a-ref/add2.c3a new file mode 100644 index 0000000..0b62ecf --- /dev/null +++ b/test/c3a-ref/add2.c3a @@ -0,0 +1,7 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 2 + 4 + @2 = @1 + 8 + write @2 + fend diff --git a/test/c3a-ref/affect1.c3a b/test/c3a-ref/affect1.c3a new file mode 100644 index 0000000..6745f48 --- /dev/null +++ b/test/c3a-ref/affect1.c3a @@ -0,0 +1,6 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + a = 1 + write a + fend diff --git a/test/c3a-ref/affect2.c3a b/test/c3a-ref/affect2.c3a new file mode 100644 index 0000000..6745f48 --- /dev/null +++ b/test/c3a-ref/affect2.c3a @@ -0,0 +1,6 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + a = 1 + write a + fend diff --git a/test/c3a-ref/affect3.c3a b/test/c3a-ref/affect3.c3a new file mode 100644 index 0000000..5b21472 --- /dev/null +++ b/test/c3a-ref/affect3.c3a @@ -0,0 +1,10 @@ + @0 = call main + stop @0 +f fbegin #entree fonction + a = 1 + write a + fend +main fbegin #entree fonction + param 3 + @1 = call f + fend diff --git a/test/c3a-ref/and1.c3a b/test/c3a-ref/and1.c3a new file mode 100644 index 0000000..6b1e7f6 --- /dev/null +++ b/test/c3a-ref/and1.c3a @@ -0,0 +1,10 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 1 == 0 goto 1 + if 1 == 0 goto 1 + @1 = 1 + goto 0 +1 @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/and2.c3a b/test/c3a-ref/and2.c3a new file mode 100644 index 0000000..86ec350 --- /dev/null +++ b/test/c3a-ref/and2.c3a @@ -0,0 +1,10 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 1 == 0 goto 1 + if 0 == 0 goto 1 + @1 = 1 + goto 0 +1 @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/and3.c3a b/test/c3a-ref/and3.c3a new file mode 100644 index 0000000..6495068 --- /dev/null +++ b/test/c3a-ref/and3.c3a @@ -0,0 +1,10 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 0 == 0 goto 1 + if 1 == 0 goto 1 + @1 = 1 + goto 0 +1 @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/and4.c3a b/test/c3a-ref/and4.c3a new file mode 100644 index 0000000..e86a090 --- /dev/null +++ b/test/c3a-ref/and4.c3a @@ -0,0 +1,10 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 0 == 0 goto 1 + if 0 == 0 goto 1 + @1 = 1 + goto 0 +1 @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/and5.c3a b/test/c3a-ref/and5.c3a new file mode 100644 index 0000000..df33a00 --- /dev/null +++ b/test/c3a-ref/and5.c3a @@ -0,0 +1,15 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 1 == 0 goto 3 + if 0 == 0 goto 3 + @2 = 1 + goto 2 +3 @2 = 0 +2 if @2 == 0 goto 1 + if 1 == 0 goto 1 + @1 = 1 + goto 0 +1 @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/appel-param1.c3a b/test/c3a-ref/appel-param1.c3a new file mode 100644 index 0000000..f7a67d8 --- /dev/null +++ b/test/c3a-ref/appel-param1.c3a @@ -0,0 +1,9 @@ + @0 = call main + stop @0 +f fbegin #entree fonction + write a + fend +main fbegin #entree fonction + param 1 + @1 = call f + fend diff --git a/test/c3a-ref/appel-param2.c3a b/test/c3a-ref/appel-param2.c3a new file mode 100644 index 0000000..280c4b9 --- /dev/null +++ b/test/c3a-ref/appel-param2.c3a @@ -0,0 +1,11 @@ + @0 = call main + stop @0 +f fbegin #entree fonction + write a + write b + fend +main fbegin #entree fonction + param 1 + param 456 + @1 = call f + fend diff --git a/test/c3a-ref/appel-param3.c3a b/test/c3a-ref/appel-param3.c3a new file mode 100644 index 0000000..68a53cf --- /dev/null +++ b/test/c3a-ref/appel-param3.c3a @@ -0,0 +1,17 @@ + @0 = call main + stop @0 +f fbegin #entree fonction + write a + write b + write c + write d + write e + fend +main fbegin #entree fonction + param 1 + param 2 + param 3 + param 4 + param 5 + @1 = call f + fend diff --git a/test/c3a-ref/appel-retour1.c3a b/test/c3a-ref/appel-retour1.c3a new file mode 100644 index 0000000..7aac5ea --- /dev/null +++ b/test/c3a-ref/appel-retour1.c3a @@ -0,0 +1,11 @@ + @0 = call main + stop @0 +f fbegin #entree fonction + ret a + fend + fend +main fbegin #entree fonction + param 3712 + @1 = call f + write @1 + fend diff --git a/test/c3a-ref/appel1.c3a b/test/c3a-ref/appel1.c3a new file mode 100644 index 0000000..1b31ff0 --- /dev/null +++ b/test/c3a-ref/appel1.c3a @@ -0,0 +1,8 @@ + @0 = call main + stop @0 +f fbegin #entree fonction + write 1 + fend +main fbegin #entree fonction + @1 = call f + fend diff --git a/test/c3a-ref/appel2.c3a b/test/c3a-ref/appel2.c3a new file mode 100644 index 0000000..5431ed3 --- /dev/null +++ b/test/c3a-ref/appel2.c3a @@ -0,0 +1,12 @@ + @0 = call main + stop @0 +g fbegin #entree fonction + write 2 + fend +f fbegin #entree fonction + write 1 + @1 = call g + fend +main fbegin #entree fonction + @2 = call f + fend diff --git a/test/c3a-ref/appel3.c3a b/test/c3a-ref/appel3.c3a new file mode 100644 index 0000000..cf066d8 --- /dev/null +++ b/test/c3a-ref/appel3.c3a @@ -0,0 +1,12 @@ + @0 = call main + stop @0 +g fbegin #entree fonction + write 2 + fend +f fbegin #entree fonction + write 1 + fend +main fbegin #entree fonction + @1 = call f + @2 = call g + fend diff --git a/test/c3a-ref/div1.c3a b/test/c3a-ref/div1.c3a new file mode 100644 index 0000000..240d4f4 --- /dev/null +++ b/test/c3a-ref/div1.c3a @@ -0,0 +1,6 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 4 / 2 + write @1 + fend diff --git a/test/c3a-ref/div2.c3a b/test/c3a-ref/div2.c3a new file mode 100644 index 0000000..64c4af5 --- /dev/null +++ b/test/c3a-ref/div2.c3a @@ -0,0 +1,6 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 0 / 712 + write @1 + fend diff --git a/test/c3a-ref/div3.c3a b/test/c3a-ref/div3.c3a new file mode 100644 index 0000000..9275013 --- /dev/null +++ b/test/c3a-ref/div3.c3a @@ -0,0 +1,7 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 4 / 2 + @2 = @1 / 2 + write @2 + fend diff --git a/test/c3a-ref/div4.c3a b/test/c3a-ref/div4.c3a new file mode 100644 index 0000000..37d4c26 --- /dev/null +++ b/test/c3a-ref/div4.c3a @@ -0,0 +1,6 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 2 / 3 + write @1 + fend diff --git a/test/c3a-ref/ecrire1.c3a b/test/c3a-ref/ecrire1.c3a new file mode 100644 index 0000000..fa9b045 --- /dev/null +++ b/test/c3a-ref/ecrire1.c3a @@ -0,0 +1,5 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + write 3456 + fend diff --git a/test/c3a-ref/ecrire2.c3a b/test/c3a-ref/ecrire2.c3a new file mode 100644 index 0000000..bab1223 --- /dev/null +++ b/test/c3a-ref/ecrire2.c3a @@ -0,0 +1,5 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + write 0 + fend diff --git a/test/c3a-ref/egal1.c3a b/test/c3a-ref/egal1.c3a new file mode 100644 index 0000000..8284ba6 --- /dev/null +++ b/test/c3a-ref/egal1.c3a @@ -0,0 +1,8 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 1 + if 123 == 123 goto 0 + @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/egal2.c3a b/test/c3a-ref/egal2.c3a new file mode 100644 index 0000000..13efbcd --- /dev/null +++ b/test/c3a-ref/egal2.c3a @@ -0,0 +1,8 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 1 + if 412 == 34 goto 0 + @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/egal3.c3a b/test/c3a-ref/egal3.c3a new file mode 100644 index 0000000..e173597 --- /dev/null +++ b/test/c3a-ref/egal3.c3a @@ -0,0 +1,11 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @2 = 1 + if 2 == 2 goto 1 + @2 = 0 +1 @1 = 1 + if @2 == 1 goto 0 + @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/err5.c3a b/test/c3a-ref/err5.c3a new file mode 100644 index 0000000..4f8b67f --- /dev/null +++ b/test/c3a-ref/err5.c3a @@ -0,0 +1,7 @@ +f fbegin #entree fonction + write 1 + fend +main fbegin #entree fonction + t0 = call f + f = t0 + fend diff --git a/test/c3a-ref/fibo.c3a b/test/c3a-ref/fibo.c3a new file mode 100644 index 0000000..a67a525 --- /dev/null +++ b/test/c3a-ref/fibo.c3a @@ -0,0 +1,25 @@ + @0 = call main + stop @0 +fibo fbegin #entree fonction + @1 = 1 + if n < 2 goto 2 + @1 = 0 +2 if @1 == 0 goto 0 + ret 1 + fend + goto 1 +0 @3 = n - 1 + param @3 + @2 = call fibo + @5 = n - 2 + param @5 + @4 = call fibo + @6 = @2 + @4 + ret @6 + fend +1 fend +main fbegin #entree fonction + param 9 + @7 = call fibo + write @7 + fend diff --git a/test/c3a-ref/inf1.c3a b/test/c3a-ref/inf1.c3a new file mode 100644 index 0000000..2d1a313 --- /dev/null +++ b/test/c3a-ref/inf1.c3a @@ -0,0 +1,8 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 1 + if 3 < 3 goto 0 + @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/inf2.c3a b/test/c3a-ref/inf2.c3a new file mode 100644 index 0000000..de2ab0f --- /dev/null +++ b/test/c3a-ref/inf2.c3a @@ -0,0 +1,8 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 1 + if 4 < 1 goto 0 + @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/inf3.c3a b/test/c3a-ref/inf3.c3a new file mode 100644 index 0000000..83499a0 --- /dev/null +++ b/test/c3a-ref/inf3.c3a @@ -0,0 +1,8 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 1 + if 312 < 475 goto 0 + @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/inf4.c3a b/test/c3a-ref/inf4.c3a new file mode 100644 index 0000000..98e7d23 --- /dev/null +++ b/test/c3a-ref/inf4.c3a @@ -0,0 +1,11 @@ + t0 = call main + stop t0 +main fbegin #entree fonction + t2 = 1 + if 3 < 2 goto l1 + t2 = 0 +l1 t1 = 1 + if t2 < 1 goto l0 + t1 = 0 +l0 write t1 + fend diff --git a/test/c3a-ref/mult1.c3a b/test/c3a-ref/mult1.c3a new file mode 100644 index 0000000..34d20ee --- /dev/null +++ b/test/c3a-ref/mult1.c3a @@ -0,0 +1,6 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 2 * 3 + write @1 + fend diff --git a/test/c3a-ref/mult2.c3a b/test/c3a-ref/mult2.c3a new file mode 100644 index 0000000..78089fe --- /dev/null +++ b/test/c3a-ref/mult2.c3a @@ -0,0 +1,6 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 0 * 321 + write @1 + fend diff --git a/test/c3a-ref/mult3.c3a b/test/c3a-ref/mult3.c3a new file mode 100644 index 0000000..b28dfa9 --- /dev/null +++ b/test/c3a-ref/mult3.c3a @@ -0,0 +1,7 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 3 * 3 + @2 = @1 * 2 + write @2 + fend diff --git a/test/c3a-ref/not1.c3a b/test/c3a-ref/not1.c3a new file mode 100644 index 0000000..991e63e --- /dev/null +++ b/test/c3a-ref/not1.c3a @@ -0,0 +1,8 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 1 + if 1 == 0 goto 0 + @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/not2.c3a b/test/c3a-ref/not2.c3a new file mode 100644 index 0000000..482f3d5 --- /dev/null +++ b/test/c3a-ref/not2.c3a @@ -0,0 +1,8 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 1 + if 0 == 0 goto 0 + @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/not3.c3a b/test/c3a-ref/not3.c3a new file mode 100644 index 0000000..c0800ee --- /dev/null +++ b/test/c3a-ref/not3.c3a @@ -0,0 +1,11 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @2 = 1 + if 0 == 0 goto 1 + @2 = 0 +1 @1 = 1 + if @2 == 0 goto 0 + @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/or1.c3a b/test/c3a-ref/or1.c3a new file mode 100644 index 0000000..844f198 --- /dev/null +++ b/test/c3a-ref/or1.c3a @@ -0,0 +1,10 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 1 != 0 goto 1 + if 1 != 0 goto 1 + @1 = 0 + goto 0 +1 @1 = 1 +0 write @1 + fend diff --git a/test/c3a-ref/or2.c3a b/test/c3a-ref/or2.c3a new file mode 100644 index 0000000..894e598 --- /dev/null +++ b/test/c3a-ref/or2.c3a @@ -0,0 +1,10 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 1 != 0 goto 1 + if 0 != 0 goto 1 + @1 = 0 + goto 0 +1 @1 = 1 +0 write @1 + fend diff --git a/test/c3a-ref/or3.c3a b/test/c3a-ref/or3.c3a new file mode 100644 index 0000000..08ea85a --- /dev/null +++ b/test/c3a-ref/or3.c3a @@ -0,0 +1,10 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 0 != 0 goto 1 + if 1 != 0 goto 1 + @1 = 0 + goto 0 +1 @1 = 1 +0 write @1 + fend diff --git a/test/c3a-ref/or4.c3a b/test/c3a-ref/or4.c3a new file mode 100644 index 0000000..dfe6660 --- /dev/null +++ b/test/c3a-ref/or4.c3a @@ -0,0 +1,10 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 0 != 0 goto 1 + if 0 != 0 goto 1 + @1 = 0 + goto 0 +1 @1 = 1 +0 write @1 + fend diff --git a/test/c3a-ref/or5.c3a b/test/c3a-ref/or5.c3a new file mode 100644 index 0000000..c7fae5b --- /dev/null +++ b/test/c3a-ref/or5.c3a @@ -0,0 +1,15 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 0 != 0 goto 3 + if 1 != 0 goto 3 + @2 = 0 + goto 2 +3 @2 = 1 +2 if @2 != 0 goto 1 + if 0 != 0 goto 1 + @1 = 0 + goto 0 +1 @1 = 1 +0 write @1 + fend diff --git a/test/c3a-ref/parenth1.c3a b/test/c3a-ref/parenth1.c3a new file mode 100644 index 0000000..3cdcdf5 --- /dev/null +++ b/test/c3a-ref/parenth1.c3a @@ -0,0 +1,5 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + write 1 + fend diff --git a/test/c3a-ref/parenth2.c3a b/test/c3a-ref/parenth2.c3a new file mode 100644 index 0000000..ebfa3df --- /dev/null +++ b/test/c3a-ref/parenth2.c3a @@ -0,0 +1,5 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + write 2 + fend diff --git a/test/c3a-ref/prio23-1.c3a b/test/c3a-ref/prio23-1.c3a new file mode 100644 index 0000000..9b257f0 --- /dev/null +++ b/test/c3a-ref/prio23-1.c3a @@ -0,0 +1,9 @@ + t0 = call main + stop t0 +main fbegin #entree fonction + t1 = 1 + if 0 = 0 goto l0 + t1 = 0 +l0 t2 = t1 * 10 + write t2 + fend diff --git a/test/c3a-ref/prio23-2.c3a b/test/c3a-ref/prio23-2.c3a new file mode 100644 index 0000000..c675df7 --- /dev/null +++ b/test/c3a-ref/prio23-2.c3a @@ -0,0 +1,9 @@ + t0 = call main + stop t0 +main fbegin #entree fonction + t1 = 1 + if 10 = 0 goto l0 + t1 = 0 +l0 t2 = 3 * t1 + write t2 + fend diff --git a/test/c3a-ref/prio23-3.c3a b/test/c3a-ref/prio23-3.c3a new file mode 100644 index 0000000..00a6d37 --- /dev/null +++ b/test/c3a-ref/prio23-3.c3a @@ -0,0 +1,9 @@ + t0 = call main + stop t0 +main fbegin #entree fonction + t1 = 1 + if 0 = 0 goto l0 + t1 = 0 +l0 t2 = t1 / 1 + write t2 + fend diff --git a/test/c3a-ref/prio23-4.c3a b/test/c3a-ref/prio23-4.c3a new file mode 100644 index 0000000..ac5ed73 --- /dev/null +++ b/test/c3a-ref/prio23-4.c3a @@ -0,0 +1,12 @@ + t0 = call main + stop t0 +main fbegin #entree fonction + t1 = 1 + if 1 = 0 goto l0 + t1 = 0 +l0 t2 = 1 + if 0 = 0 goto l1 + t2 = 0 +l1 t3 = t1 / t2 + write t3 + fend diff --git a/test/c3a-ref/prio34-1.c3a b/test/c3a-ref/prio34-1.c3a new file mode 100644 index 0000000..bf1aae0 --- /dev/null +++ b/test/c3a-ref/prio34-1.c3a @@ -0,0 +1,7 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 3 * 4 + @2 = 2 + @1 + write @2 + fend diff --git a/test/c3a-ref/prio34-2.c3a b/test/c3a-ref/prio34-2.c3a new file mode 100644 index 0000000..599e604 --- /dev/null +++ b/test/c3a-ref/prio34-2.c3a @@ -0,0 +1,7 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 2 * 3 + @2 = @1 - 4 + write @2 + fend diff --git a/test/c3a-ref/prio34-3.c3a b/test/c3a-ref/prio34-3.c3a new file mode 100644 index 0000000..21ac788 --- /dev/null +++ b/test/c3a-ref/prio34-3.c3a @@ -0,0 +1,7 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 6 / 3 + @2 = @1 - 72 + write @2 + fend diff --git a/test/c3a-ref/prio34-4.c3a b/test/c3a-ref/prio34-4.c3a new file mode 100644 index 0000000..5b08bc8 --- /dev/null +++ b/test/c3a-ref/prio34-4.c3a @@ -0,0 +1,7 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 20 / 10 + @2 = 6 + @1 + write @2 + fend diff --git a/test/c3a-ref/prio45-1.c3a b/test/c3a-ref/prio45-1.c3a new file mode 100644 index 0000000..66f66e7 --- /dev/null +++ b/test/c3a-ref/prio45-1.c3a @@ -0,0 +1,9 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @2 = 0 + 1 + @1 = 1 + if 2 == @2 goto 0 + @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/prio45-2.c3a b/test/c3a-ref/prio45-2.c3a new file mode 100644 index 0000000..1941178 --- /dev/null +++ b/test/c3a-ref/prio45-2.c3a @@ -0,0 +1,9 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @2 = 1 + 234 + @1 = 1 + if @2 == 1 goto 0 + @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/prio45-3.c3a b/test/c3a-ref/prio45-3.c3a new file mode 100644 index 0000000..71e45e2 --- /dev/null +++ b/test/c3a-ref/prio45-3.c3a @@ -0,0 +1,9 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @2 = 11 + 100 + @1 = 1 + if 12 < @2 goto 0 + @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/prio45-4.c3a b/test/c3a-ref/prio45-4.c3a new file mode 100644 index 0000000..0b01672 --- /dev/null +++ b/test/c3a-ref/prio45-4.c3a @@ -0,0 +1,9 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @2 = 21 - 21 + @1 = 1 + if @2 < 1 goto 0 + @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/prio56-1.c3a b/test/c3a-ref/prio56-1.c3a new file mode 100644 index 0000000..683b54f --- /dev/null +++ b/test/c3a-ref/prio56-1.c3a @@ -0,0 +1,13 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @2 = 1 + if 1 == 2 goto 2 + @2 = 0 +2 if @2 == 0 goto 1 + if 1 == 0 goto 1 + @1 = 1 + goto 0 +1 @1 = 0 +0 write @1 + fend diff --git a/test/c3a-ref/prio56-2.c3a b/test/c3a-ref/prio56-2.c3a new file mode 100644 index 0000000..e9c62a7 --- /dev/null +++ b/test/c3a-ref/prio56-2.c3a @@ -0,0 +1,13 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @2 = 1 + if 0 == 1 goto 2 + @2 = 0 +2 if 1 != 0 goto 1 + if @2 != 0 goto 1 + @1 = 0 + goto 0 +1 @1 = 1 +0 write @1 + fend diff --git a/test/c3a-ref/prio67-1.c3a b/test/c3a-ref/prio67-1.c3a new file mode 100644 index 0000000..ce8a86e --- /dev/null +++ b/test/c3a-ref/prio67-1.c3a @@ -0,0 +1,15 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 0 == 0 goto 3 + if 1 == 0 goto 3 + @2 = 1 + goto 2 +3 @2 = 0 +2 if @2 != 0 goto 1 + if 1 != 0 goto 1 + @1 = 0 + goto 0 +1 @1 = 1 +0 write @1 + fend diff --git a/test/c3a-ref/prio67-2.c3a b/test/c3a-ref/prio67-2.c3a new file mode 100644 index 0000000..684cec0 --- /dev/null +++ b/test/c3a-ref/prio67-2.c3a @@ -0,0 +1,15 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 1 == 0 goto 3 + if 0 == 0 goto 3 + @2 = 1 + goto 2 +3 @2 = 0 +2 if 1 != 0 goto 1 + if @2 != 0 goto 1 + @1 = 0 + goto 0 +1 @1 = 1 +0 write @1 + fend diff --git a/test/c3a-ref/rec1.c3a b/test/c3a-ref/rec1.c3a new file mode 100644 index 0000000..322131a --- /dev/null +++ b/test/c3a-ref/rec1.c3a @@ -0,0 +1,22 @@ + @0 = call main + stop @0 +f fbegin #entree fonction + @1 = 1 + if a == 1 goto 2 + @1 = 0 +2 if @1 == 0 goto 0 + ret 1 + fend + goto 1 +0 @3 = a - 1 + param @3 + @2 = call f + @4 = 1 + @2 + ret @4 + fend +1 fend +main fbegin #entree fonction + param 100 + @5 = call f + write @5 + fend diff --git a/test/c3a-ref/si1.c3a b/test/c3a-ref/si1.c3a new file mode 100644 index 0000000..fc0a927 --- /dev/null +++ b/test/c3a-ref/si1.c3a @@ -0,0 +1,6 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 1 == 0 goto 1 + write 1 +1 fend diff --git a/test/c3a-ref/si2.c3a b/test/c3a-ref/si2.c3a new file mode 100644 index 0000000..3bc635d --- /dev/null +++ b/test/c3a-ref/si2.c3a @@ -0,0 +1,8 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 0 == 0 goto 0 + write 1 + goto 1 +0 write 0 +1 fend diff --git a/test/c3a-ref/si3.c3a b/test/c3a-ref/si3.c3a new file mode 100644 index 0000000..77f57ae --- /dev/null +++ b/test/c3a-ref/si3.c3a @@ -0,0 +1,9 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 1 == 0 goto 0 + write 1 + goto 1 +0 write 0 +1 write 1 + fend diff --git a/test/c3a-ref/si4.c3a b/test/c3a-ref/si4.c3a new file mode 100644 index 0000000..4820034 --- /dev/null +++ b/test/c3a-ref/si4.c3a @@ -0,0 +1,9 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 0 == 0 goto 0 + write 1 + goto 1 +0 write 0 +1 write 1 + fend diff --git a/test/c3a-ref/si5.c3a b/test/c3a-ref/si5.c3a new file mode 100644 index 0000000..0b8d4f2 --- /dev/null +++ b/test/c3a-ref/si5.c3a @@ -0,0 +1,9 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + if 1 == 0 goto 3 + write 1 + if 1 == 0 goto 3 + write 1 +3 write 1 + fend diff --git a/test/c3a-ref/sub1.c3a b/test/c3a-ref/sub1.c3a new file mode 100644 index 0000000..1b0e46f --- /dev/null +++ b/test/c3a-ref/sub1.c3a @@ -0,0 +1,6 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 10 - 5 + write @1 + fend diff --git a/test/c3a-ref/sub2.c3a b/test/c3a-ref/sub2.c3a new file mode 100644 index 0000000..e489973 --- /dev/null +++ b/test/c3a-ref/sub2.c3a @@ -0,0 +1,6 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 7 - 20 + write @1 + fend diff --git a/test/c3a-ref/sub3.c3a b/test/c3a-ref/sub3.c3a new file mode 100644 index 0000000..7ccf2bf --- /dev/null +++ b/test/c3a-ref/sub3.c3a @@ -0,0 +1,7 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + @1 = 2 - 1 + @2 = @1 - 1 + write @2 + fend diff --git a/test/c3a-ref/tab1.c3a b/test/c3a-ref/tab1.c3a new file mode 100644 index 0000000..453f472 --- /dev/null +++ b/test/c3a-ref/tab1.c3a @@ -0,0 +1,10 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + tab[0] = 0 + tab[1] = 1 + tab[2] = 2 + write tab[0] + write tab[1] + write tab[2] + fend diff --git a/test/c3a-ref/tab2.c3a b/test/c3a-ref/tab2.c3a new file mode 100644 index 0000000..db4c77a --- /dev/null +++ b/test/c3a-ref/tab2.c3a @@ -0,0 +1,14 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + base = 2 + @1 = base + 0 + tab[@1] = 34 + @2 = base + 1 + tab[@2] = 74 + @3 = base + 2 + tab[@3] = 16 + write tab[2] + write tab[3] + write tab[4] + fend diff --git a/test/c3a-ref/tab3.c3a b/test/c3a-ref/tab3.c3a new file mode 100644 index 0000000..2483abb --- /dev/null +++ b/test/c3a-ref/tab3.c3a @@ -0,0 +1,17 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + base = 2 + offset = 0 + @1 = base + offset + tab[@1] = 34 + offset = 1 + @2 = base + offset + tab[@2] = 74 + offset = 2 + @3 = base + offset + tab[@3] = 16 + write tab[2] + write tab[3] + write tab[4] + fend diff --git a/test/c3a-ref/tab4.c3a b/test/c3a-ref/tab4.c3a new file mode 100644 index 0000000..1613664 --- /dev/null +++ b/test/c3a-ref/tab4.c3a @@ -0,0 +1,11 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + tab[0] = 1 + tab[tab[0]] = 12 + @1 = tab[0] + 1 + tab[@1] = 13 + write tab[0] + write tab[1] + write tab[2] + fend diff --git a/test/c3a-ref/tantque1.c3a b/test/c3a-ref/tantque1.c3a new file mode 100644 index 0000000..78d3f86 --- /dev/null +++ b/test/c3a-ref/tantque1.c3a @@ -0,0 +1,14 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + a = 10 +0 @1 = 1 + if 0 < a goto 2 + @1 = 0 +2 if @1 == 0 goto 1 + write a + @2 = a - 1 + a = @2 + goto 0 +1 write 0 + fend diff --git a/test/c3a-ref/tantque2.c3a b/test/c3a-ref/tantque2.c3a new file mode 100644 index 0000000..3adbfa4 --- /dev/null +++ b/test/c3a-ref/tantque2.c3a @@ -0,0 +1,22 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + a = 0 +0 @1 = 1 + if a < 4 goto 2 + @1 = 0 +2 if @1 == 0 goto 1 + b = 0 +3 @2 = 1 + if b < 4 goto 5 + @2 = 0 +5 if @2 == 0 goto 4 + write a + write b + @3 = b + 1 + b = @3 + goto 3 +4 @4 = a + 1 + a = @4 + goto 0 +1 fend diff --git a/test/c3a-ref/tri.c3a b/test/c3a-ref/tri.c3a new file mode 100644 index 0000000..f1052ff --- /dev/null +++ b/test/c3a-ref/tri.c3a @@ -0,0 +1,71 @@ + @0 = call main + stop @0 +initialiser fbegin #entree fonction + tab[0] = 8 + tab[1] = 6 + tab[2] = 9 + tab[3] = 9 + tab[4] = 4 + tab[5] = 2 + tab[6] = 3 + tab[7] = 1 + tab[8] = 4 + tab[9] = 5 + fend +afficher fbegin #entree fonction + i = 0 +0 @1 = 1 + if i < n goto 2 + @1 = 0 +2 if @1 == 0 goto 1 + write tab[i] + @2 = i + 1 + i = @2 + goto 0 +1 write 0 + fend +echanger fbegin #entree fonction + temp = tab[j] + tab[j] = tab[i] + tab[i] = temp + fend +trier fbegin #entree fonction + m = n + echange = 1 +3 @3 = 1 + if echange == 1 goto 5 + @3 = 0 +5 if @3 == 0 goto 4 + echange = 0 + j = 0 +6 @5 = m - 1 + @4 = 1 + if j < @5 goto 8 + @4 = 0 +8 if @4 == 0 goto 7 + @7 = j + 1 + @6 = 1 + if tab[@7] < tab[j] goto 11 + @6 = 0 +11 if @6 == 0 goto 10 + param j + @9 = j + 1 + param @9 + @8 = call echanger + echange = 1 +10 @10 = j + 1 + j = @10 + goto 6 +7 @11 = m - 1 + m = @11 + goto 3 +4 fend +main fbegin #entree fonction + @12 = call initialiser + param 10 + @13 = call afficher + param 10 + @14 = call trier + param 10 + @15 = call afficher + fend diff --git a/test/c3a-ref/varglob1.c3a b/test/c3a-ref/varglob1.c3a new file mode 100644 index 0000000..c681ada --- /dev/null +++ b/test/c3a-ref/varglob1.c3a @@ -0,0 +1,6 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + variable = 6834 + write variable + fend diff --git a/test/c3a-ref/varglob2.c3a b/test/c3a-ref/varglob2.c3a new file mode 100644 index 0000000..bdaee50 --- /dev/null +++ b/test/c3a-ref/varglob2.c3a @@ -0,0 +1,7 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + variable = 10 + @1 = variable + 50 + write @1 + fend diff --git a/test/c3a-ref/varglob3.c3a b/test/c3a-ref/varglob3.c3a new file mode 100644 index 0000000..eb8ce56 --- /dev/null +++ b/test/c3a-ref/varglob3.c3a @@ -0,0 +1,8 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + var1 = 10 + var2 = 34 + write var1 + write var2 + fend diff --git a/test/c3a-ref/varglob4.c3a b/test/c3a-ref/varglob4.c3a new file mode 100644 index 0000000..c5b8635 --- /dev/null +++ b/test/c3a-ref/varglob4.c3a @@ -0,0 +1,8 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + var1 = 10 + var2 = 34 + @1 = var1 + var2 + write @1 + fend diff --git a/test/c3a-ref/varloc1.c3a b/test/c3a-ref/varloc1.c3a new file mode 100644 index 0000000..c681ada --- /dev/null +++ b/test/c3a-ref/varloc1.c3a @@ -0,0 +1,6 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + variable = 6834 + write variable + fend diff --git a/test/c3a-ref/varloc2.c3a b/test/c3a-ref/varloc2.c3a new file mode 100644 index 0000000..bdaee50 --- /dev/null +++ b/test/c3a-ref/varloc2.c3a @@ -0,0 +1,7 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + variable = 10 + @1 = variable + 50 + write @1 + fend diff --git a/test/c3a-ref/varloc3.c3a b/test/c3a-ref/varloc3.c3a new file mode 100644 index 0000000..7dbbadb --- /dev/null +++ b/test/c3a-ref/varloc3.c3a @@ -0,0 +1,8 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + var1 = 10 + var2 = 30 + write var1 + write var2 + fend diff --git a/test/c3a-ref/varloc4.c3a b/test/c3a-ref/varloc4.c3a new file mode 100644 index 0000000..71e8be7 --- /dev/null +++ b/test/c3a-ref/varloc4.c3a @@ -0,0 +1,8 @@ + @0 = call main + stop @0 +main fbegin #entree fonction + var1 = 10 + var2 = 30 + @1 = var1 + var2 + write @1 + fend diff --git a/test/c3a-ref/varloc5.c3a b/test/c3a-ref/varloc5.c3a new file mode 100644 index 0000000..3c18306 --- /dev/null +++ b/test/c3a-ref/varloc5.c3a @@ -0,0 +1,11 @@ + @0 = call main + stop @0 +f fbegin #entree fonction + var1 = 10 + write var1 + fend +main fbegin #entree fonction + var1 = 20 + @1 = call f + write var1 + fend diff --git a/test/evaluate.py b/test/evaluate.py new file mode 100755 index 0000000..febaaf2 --- /dev/null +++ b/test/evaluate.py @@ -0,0 +1,473 @@ +#! /usr/bin/python3 -u + +import sys +import os +import subprocess +import inspect +import argparse + +# code de sortie du compilateur + +NOERROR_CODE = 0 +ERR_TYPE_CODE = 3 +ERR_SYMBOL_TABLE_CODE = 4 +ERR_SYNTAX_CODE = 5 +ERR_LEX_CODE = 6 + +# coefficients pour le calcul de la note finale +SC_COEFF = 4 +SA_DIFF_COEFF = 0 +TS_DIFF_COEFF = 0 +SA_COEFF = 3 +C3A_DIFF_COEFF = 0 +C3A_COEFF = 3 +PRE_NASM_DIFF = 0 +PRE_NASM_COEFF = 3 +NASM_DIFF_COEFF = 0 +NASM_COEFF = 3 +EXE_COEFF = 0 +ERR_TS_COEFF = 2 +ERR_TYPE_COEFF = 2 + +# Paths relative to this file (evaluate.py) +inputPath = "./input/" +errInputPathTs = "./input_err_ts/" +errInputPathType = "./input_err_type/" +refPath = "./" +srcPath = "../src/" +# Keep empty +classpath = "" +# Outputs files (don't change this, it's set in the main) +outErr = sys.stderr +outScore = sys.stdout +outVerbose = open(os.devnull,"w") +outputFilename = "result.txt" + +################################################################################ +def compileCompiler() : + global classpath + for file in ["Compiler.java", "SaVM.java", "C3aVM.java", "NasmVM.java"] : + if not os.path.isfile(srcPath+file) : + print("Skipping compilation of %s"%file, file=outVerbose) + continue + package = file.lower().split('.')[0].replace('vm', '') + if package in ["c3a", "nasm"] and not os.path.isdir(srcPath+package) : + print("Skipping compilation of %s"%file, file=outVerbose) + continue + print("Compiling %s..."%file, end="", file=outVerbose) + proc = subprocess.Popen("cd %s && javac %s %s %s"%(srcPath, "-cp " if len(classpath) > 0 else "", classpath, file), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + errMess = proc.stderr.read().decode('utf8') + returnCode = proc.wait() + if returnCode == 0 : + print("Done", file=outVerbose) + else : + print("", file=outVerbose) + print("ERROR !", file=outErr) + print(errMess, file=outErr) + exit(1) + print("", file=outVerbose) + classpath = "../xerces-2_12_1/*:%s"%srcPath + classpath = "" +################################################################################ + +################################################################################ +def deleteClasses() : + + for root, subdirs, files in os.walk("%s.."%srcPath) : + if ".git" in root : + continue + for filename in files : + if os.path.splitext(filename)[1] == ".class" : + os.remove(root+"/"+filename) + + return classpath +################################################################################ + +################################################################################ +def findClasspath() : + global classpath + + if len(classpath) > 0 : + return classpath + + for root, subdirs, files in os.walk("%s.."%srcPath) : + if ".git" in root : + continue + for filename in files : + if os.path.splitext(filename)[1] in [".class", ".jar"] : + classpath += ("" if len(classpath) == 0 else ":") + root + break + + classpath += ("" if len(classpath) == 0 else ":")+"../xerces-2_12_1/*" + return classpath +################################################################################ + +################################################################################ +def compiler(verbose="-v 2") : + return "java -classpath %s Compiler %s"%(findClasspath(), verbose) +################################################################################ + +################################################################################ +def green(string) : + return "\033[92m%s\033[0m"%string +################################################################################ + +################################################################################ +def purple(string) : + return "\033[95m%s\033[0m"%string +################################################################################ + +################################################################################ +def red(string) : + return "\033[91m%s\033[0m"%string +################################################################################ + +################################################################################ +def changeExtension(filename, newExtension) : + return os.path.splitext(filename)[0] + newExtension +################################################################################ + +################################################################################ +def findInputFiles(path) : + inputFiles = [] + for filename in os.listdir(path) : + if os.path.splitext(filename)[1] == ".l" : + inputFiles.append(filename) + inputFiles.sort() + return inputFiles +################################################################################ + +################################################################################ +def deleteCompilationOutputs() : + outputExtensions = [".exe", ".exeout", ".o", ".out", ".sa", ".saout", ".sc", ".ts", ".nasm", ".nasmout", ".pre-nasm", ".pre-nasmout", ".c3a", ".c3aout", ".fg", ".fgs", ".ig"] + for filename in os.listdir(inputPath) : + if os.path.splitext(filename)[1] in outputExtensions : + os.remove(inputPath+filename) +################################################################################ + +################################################################################ +def compileInputFiles(inputFiles) : + evaluation = getNewEvaluationResult(ERR_SYNTAX_CODE) + for inputFile in inputFiles : + lightFilename = inputFile.split("/")[-1] + print("Compiling %s..."%inputFile, file=outVerbose, flush=True, end='') + returnCode = subprocess.Popen("{} {}{}".format(compiler(), inputPath, inputFile), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).wait() + if returnCode == NOERROR_CODE : + evaluation[1]["correct"].append(lightFilename) + print("Done", file=outVerbose) + else : + evaluation[1]["incorrect"].append(lightFilename) + print("ERROR !", file=outErr) + print("", file=outVerbose) + return evaluation +################################################################################ + +################################################################################ +def getNewEvaluationResult(name) : + return [name, {"correct" : [], "incorrect" : [], "notfound" : []}] +################################################################################ + +################################################################################ +def evaluateCompilationErrors(inputFiles, expectedCode, name) : + evaluation = getNewEvaluationResult(name) + + print(file=outVerbose) + + for inputFile in inputFiles : + if not os.path.isfile(inputFile) : + print("ERROR : could not find '%s'"%inputFile, file=outErr) + exit(1) + lightFilename = inputFile.split("/")[-1] + print("Compiling %s..."%lightFilename, end="", file=outVerbose) + returnCode = subprocess.Popen("{} {}".format(compiler(verbose=""), inputFile), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).wait() + print("Done (%d)"%returnCode, file=outVerbose) + if returnCode == expectedCode : + evaluation[1]["correct"].append(lightFilename) + else : + evaluation[1]["incorrect"].append(lightFilename) + print("", file=outVerbose) + + return evaluation +################################################################################ + +################################################################################ +def evaluateDiff(inputFiles, extension, extensionRef, path, name) : + evaluation = getNewEvaluationResult(name) + + for filename in inputFiles : + producedFile = changeExtension(filename, extension) + if not os.path.isfile(inputPath+producedFile) : + evaluation[1]["notfound"].append(producedFile) + continue + + ref = refPath+path+changeExtension(producedFile, extensionRef) + if not os.path.isfile(ref) : + print("ATTENTION : Fichier non trouvé : %s"%ref, file=sys.stderr) + continue + + refContent = [] + for line in open(ref, "r") : + line = line.strip() + if len(line) > 0 : + refContent.append(line) + producedContent = [] + for line in open(inputPath+producedFile, "r") : + line = line.strip() + if len(line) > 0 : + producedContent.append(line) + + if producedContent == refContent : + evaluation[1]["correct"].append(producedFile) + else : + evaluation[1]["incorrect"].append(producedFile) + + return evaluation +################################################################################ + +################################################################################ +def evaluateSa(inputFiles) : + errs = [] + for filename in inputFiles : + saFilename = inputPath+changeExtension(filename, ".sa") + outFilename = inputPath+changeExtension(filename, ".saout") + if not os.path.isfile(saFilename) : + continue + + command = "java -classpath %s SaVM -sa %s > %s"%(findClasspath(), saFilename, outFilename) + out = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stderr.read().decode() + if len(out) != 0 : + errs.append("ERROR %s for input %s : '%s'"%(inspect.stack()[0][3], filename, out)) + + return evaluateDiff(inputFiles, ".saout", ".out", "out-ref/", "Execution de sa"), errs +################################################################################ + +################################################################################ +def evaluateC3a(inputFiles) : + errs = [] + for filename in inputFiles : + c3aFilename = inputPath+changeExtension(filename, ".c3a") + tsFilename = inputPath+changeExtension(filename, ".ts") + outFilename = inputPath+changeExtension(filename, ".c3aout") + if not os.path.isfile(c3aFilename) or not os.path.isfile(tsFilename) : + continue + + command = "java -classpath %s C3aVM -c3a %s -ts %s > %s"%(findClasspath(), c3aFilename, tsFilename, outFilename) + out = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stderr.read().decode() + if len(out) != 0 : + errs.append("ERROR %s for input %s : '%s'"%(inspect.stack()[0][3], filename, out)) + + return evaluateDiff(inputFiles, ".c3aout", ".out", "out-ref/", "Execution du c3a"), errs +################################################################################ + +################################################################################ +def evaluatePreNasm(inputFiles) : + errs = [] + for filename in inputFiles : + nasmFilename = inputPath+changeExtension(filename, ".pre-nasm") + outFilename = inputPath+changeExtension(filename, ".pre-nasmout") + if not os.path.isfile(nasmFilename) : + continue + + command = "java -classpath %s NasmVM -nasm %s > %s"%(findClasspath(), nasmFilename, outFilename) + out = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stderr.read().decode() + if len(out) != 0 : + errs.append("ERROR %s for input %s : '%s'"%(inspect.stack()[0][3], filename, out)) + + return evaluateDiff(inputFiles, ".pre-nasmout", ".out", "out-ref/", "Execution du pre-nasm"), errs +################################################################################ + +################################################################################ +def evaluateNasm(inputFiles) : + errs = [] + for filename in inputFiles : + nasmFilename = inputPath+changeExtension(filename, ".nasm") + outFilename = inputPath+changeExtension(filename, ".nasmout") + if not os.path.isfile(nasmFilename) : + continue + + command = "java -classpath %s NasmVM -nasm %s > %s"%(findClasspath(), nasmFilename, outFilename) + out = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stderr.read().decode() + if len(out) != 0 : + errs.append("ERROR %s for input %s : '%s'"%(inspect.stack()[0][3], filename, out)) + + return evaluateDiff(inputFiles, ".nasmout", ".out", "out-ref/", "Execution du nasm"), errs +################################################################################ + +################################################################################ +def evaluateExecutable(inputFiles) : + errs = [] + for filename in inputFiles : + nasmFilename = changeExtension(filename, ".nasm") + objectFilename = changeExtension(filename, ".o") + execFilename = changeExtension(filename, ".exe") + outFilename = changeExtension(filename, ".exeout") + if not os.path.isfile(inputPath+nasmFilename) : + continue + + out = subprocess.Popen("cd {} && nasm -f elf -dwarf -g {}".format(inputPath+"..","input/"+nasmFilename), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stderr.read() + if not os.path.isfile(inputPath+objectFilename) : + errs.append("ERROR %s for input %s : '%s'"%(inspect.stack()[0][3], filename, out)) + continue + out = subprocess.Popen("ld -m elf_i386 -o {}{} {}{}".format(inputPath,execFilename,inputPath,objectFilename), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stderr.read() + if not os.path.isfile(inputPath+execFilename) : + errs.append("ERROR %s for input %s : '%s'"%(inspect.stack()[0][3], filename, out)) + continue + out = subprocess.Popen("{}{} > {}{}".format(inputPath,execFilename,inputPath,outFilename), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).stderr.read() + if not os.path.isfile(inputPath+outFilename) : + errs.append("ERROR %s for input %s : '%s'"%(inspect.stack()[0][3], filename, out)) + continue + + return evaluateDiff(inputFiles, ".exeout", ".out", "out-ref/", "Execution du binaire"), errs +################################################################################ + +################################################################################ +def printListElements(destination, elements, colorFunction, useColor, resultStr) : + if len(elements) == 0 : + return + maxColumnSize = len(max(elements, key=len)) + for filename in elements : + if useColor : + print("\t{}".format(colorFunction(filename)), file=destination) + else : + print("\t{:{}} {}".format(filename, maxColumnSize+2, resultStr), file=destination) +################################################################################ + +################################################################################ +def printEvaluationResult(destination, evaluationResult, useColor) : + name = evaluationResult[0] + correct = evaluationResult[1]["correct"] + incorrect = evaluationResult[1]["incorrect"] + notfound = evaluationResult[1]["notfound"] + + nbCorrect = len(correct) + nbTotal = len(correct) + len(incorrect) + len(notfound) + + score = 0.0 + if nbTotal > 0 : + score = 100.0*nbCorrect/nbTotal + for dest, color in [(destination, useColor), (open(outputFilename, "a"), False)] : + print("Évaluation de %s :"%name, file=dest) + print("{}/{} correct ({:6.2f}%)".format(nbCorrect, nbTotal, score), file=dest) + if nbCorrect+len(incorrect) > 0 : + printListElements(dest, correct, green, color, "CORRECT") + printListElements(dest, incorrect, purple, color, "INCORRECT") + printListElements(dest, notfound, red, color, "NON-EXISTANT") + return score +################################################################################ + +################################################################################ +if __name__ == "__main__" : + parser = argparse.ArgumentParser() + parser.add_argument("--verbose", "-v", default=False, action="store_true", + help="Verbose output (obsolete, verbose is default).") + parser.add_argument("--silent", "-s", default=False, action="store_true", + help="Less verbose output.") + parser.add_argument("--noColors", default=False, action="store_true", + help="Disable colors in output.") + parser.add_argument("--clean", "-c", default=False, action="store_true", + help="Clean input dir then exit.") + parser.add_argument("--number", "-n", default=None, type=int, + help="Restrict tests to n inputs.") + parser.add_argument("--files", "-f", default=[], nargs="*", + help="Specify input files.") + args = parser.parse_args() + + args.verbose = not args.silent + + if args.verbose : + outVerbose = outScore + if args.clean : + deleteCompilationOutputs() + exit(0) + + with open(outputFilename, "w") as _ : + pass + + inputFiles = args.files[:args.number] + if len(inputFiles) == 0 : + inputFiles = findInputFiles(inputPath)[:args.number] + + errInputFilesTs = [errInputPathTs+"/"+f for f in findInputFiles(errInputPathTs)[:args.number]] + errInputFilesType = [errInputPathType+"/"+f for f in findInputFiles(errInputPathType)[:args.number]] + + deleteCompilationOutputs() + + compileCompiler() + + + scores = [] + names = [] + errors = [] + names.append("SC ") + res = compileInputFiles(inputFiles) + scores.append(printEvaluationResult(outVerbose, res, not args.noColors)) + msg = "Diff de %s" + dfSa = lambda files : (evaluateDiff(inputFiles, ".sa", ".sa", "sa-ref/", msg%"sa"), []) + dfTs = lambda files : (evaluateDiff(inputFiles, ".ts", ".ts", "ts-ref/", msg%"ts"), []) + dfC3a = lambda files : (evaluateDiff(inputFiles, ".c3a", ".c3a", "c3a-ref/", msg%"c3a"), []) + dfPreNasm = lambda files : (evaluateDiff(inputFiles, ".pre-nasm", ".pre-nasm", "pre-nasm-ref/", msg%"pre-nasm"), []) + dfNasm = lambda files : (evaluateDiff(inputFiles, ".nasm", ".nasm", "nasm-ref/", msg%"nasm"), []) + + # Evaluation of normal (working) examples + for evalTarget in [ + ("SA-DIFF ", dfSa), + ("TS-DIFF ", dfTs), + ("SA ", evaluateSa), + ("C3A-DIFF ", dfC3a), + ("C3A ", evaluateC3a), + ("PRE-NASM-DIFF", dfPreNasm), + ("PRE-NASM ", evaluatePreNasm), + ("NASM-DIFF ", dfNasm), + ("NASM ", evaluateNasm), + ("EXE ", evaluateExecutable), + ] : + names.append(evalTarget[0]) + res, err = evalTarget[1](inputFiles) + scores.append(printEvaluationResult(outVerbose, res, not args.noColors)) + errors += err + + # Evaluation of ill formed examples, that should trigger a compilation error + for evalTarget in [ + ("ERR_TS ", evaluateCompilationErrors, errInputFilesTs, ERR_SYMBOL_TABLE_CODE), + ("ERR_TYPE ", evaluateCompilationErrors, errInputFilesType, ERR_TYPE_CODE), + ] : + names.append(evalTarget[0]) + res = evalTarget[1](evalTarget[2], evalTarget[3], evalTarget[0]) + scores.append(printEvaluationResult(outVerbose, res, not args.noColors)) + + deleteClasses() + + # The rest of the script will now print the results + + if not args.noColors : + print("Légende : {} {} {}".format(green("CORRECT"), purple("INCORRECT"), red("NON-EXISTANT")), file=outVerbose) + + errorsStr = "" + + if len(errors) > 0 : + errorsStr = "%s\n%s"%((30*"-")+("EVALUATION ERRORS")+(30*"-"), "\n\n".join(errors)) + + print(errorsStr) + print(errorsStr, file=open(outputFilename, "a")) + + for i in range(len(scores)): + print(names[i], "\t", scores[i]) + + print("Copy-pastable scores :", file=outScore) + print("\t".join(names), file=outScore) + print("\t".join(["%6.2f"%scores[i] for i in range(len(scores))]), file=outScore) + + print("\nSauvegardé dans le fichier %s"%outputFilename) + +# les coefficients associés à chaque partie pour le calcul de la note finale + coeffs = [SC_COEFF, SA_DIFF_COEFF, TS_DIFF_COEFF, SA_COEFF, C3A_DIFF_COEFF, C3A_COEFF, PRE_NASM_DIFF, PRE_NASM_COEFF, NASM_DIFF_COEFF, NASM_COEFF, EXE_COEFF, ERR_TS_COEFF, ERR_TYPE_COEFF] + +# calcul de la note finale + + note = 0 + for i in range(len(scores)): + note += scores[i] / 100 * coeffs[i] + print ("note = ", note) + +################################################################################ + diff --git a/test/fg-ref/add1.fg b/test/fg-ref/add1.fg new file mode 100644 index 0000000..c297a4b --- /dev/null +++ b/test/fg-ref/add1.fg @@ -0,0 +1,14 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 3 ; +8 : ( 9 ) add r0, 10 ; +9 : ( 10 ) mov eax, r0 ;Write 1 +10 : ( ) call iprintLF ;Write 2 +11 : ( 12 ) add esp, 0 ;désallocation des variables locales +12 : ( 13 ) pop ebp ;restaure la valeur de ebp +13 : ( ) ret ; diff --git a/test/fg-ref/add2.fg b/test/fg-ref/add2.fg new file mode 100644 index 0000000..083fd7b --- /dev/null +++ b/test/fg-ref/add2.fg @@ -0,0 +1,16 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 2 ; +8 : ( 9 ) add r0, 4 ; +9 : ( 10 ) mov r1, r0 ; +10 : ( 11 ) add r1, 8 ; +11 : ( 12 ) mov eax, r1 ;Write 1 +12 : ( ) call iprintLF ;Write 2 +13 : ( 14 ) add esp, 0 ;désallocation des variables locales +14 : ( 15 ) pop ebp ;restaure la valeur de ebp +15 : ( ) ret ; diff --git a/test/fg-ref/affect1.fg b/test/fg-ref/affect1.fg new file mode 100644 index 0000000..61923e5 --- /dev/null +++ b/test/fg-ref/affect1.fg @@ -0,0 +1,13 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov dword [a], 1 ;Affect +8 : ( 9 ) mov eax, dword [a] ;Write 1 +9 : ( ) call iprintLF ;Write 2 +10 : ( 11 ) add esp, 0 ;désallocation des variables locales +11 : ( 12 ) pop ebp ;restaure la valeur de ebp +12 : ( ) ret ; diff --git a/test/fg-ref/affect2.fg b/test/fg-ref/affect2.fg new file mode 100644 index 0000000..a464fa6 --- /dev/null +++ b/test/fg-ref/affect2.fg @@ -0,0 +1,13 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 4 ;allocation des variables locales +7 : ( 8 ) mov dword [ebp-4*1], 1 ;Affect +8 : ( 9 ) mov eax, dword [ebp-4*1] ;Write 1 +9 : ( ) call iprintLF ;Write 2 +10 : ( 11 ) add esp, 4 ;désallocation des variables locales +11 : ( 12 ) pop ebp ;restaure la valeur de ebp +12 : ( ) ret ; diff --git a/test/fg-ref/affect3.fg b/test/fg-ref/affect3.fg new file mode 100644 index 0000000..333c3c4 --- /dev/null +++ b/test/fg-ref/affect3.fg @@ -0,0 +1,24 @@ +0 : ( 13 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) f : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov dword [ebp+4*3], 1 ;Affect +8 : ( 9 ) mov eax, dword [ebp+4*3] ;Write 1 +9 : ( ) call iprintLF ;Write 2 +10 : ( 11 ) add esp, 0 ;désallocation des variables locales +11 : ( 12 ) pop ebp ;restaure la valeur de ebp +12 : ( 13 ) ret ; +13 : ( 14 ) main : push ebp ;sauvegarde la valeur de ebp +14 : ( 15 ) mov ebp, esp ;nouvelle valeur de ebp +15 : ( 16 ) sub esp, 4 ;allocation des variables locales +16 : ( 17 ) push 3 ;Param +17 : ( 18 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +18 : ( 4 ) call f ; +19 : ( 20 ) pop r0 ;récupération de la valeur de retour +20 : ( 21 ) add esp, 4 ;désallocation des arguments +21 : ( 22 ) add esp, 4 ;désallocation des variables locales +22 : ( 23 ) pop ebp ;restaure la valeur de ebp +23 : ( ) ret ; diff --git a/test/fg-ref/and1.fg b/test/fg-ref/and1.fg new file mode 100644 index 0000000..750f4f1 --- /dev/null +++ b/test/fg-ref/and1.fg @@ -0,0 +1,21 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r3, 3 ;JumpIfEqual 1 +8 : ( 9 ) cmp r3, 0 ;on passe par un registre temporaire +9 : ( 10 15 ) je l1 ;JumpIfEqual 2 +10 : ( 11 ) mov r4, 1 ;JumpIfEqual 1 +11 : ( 12 ) cmp r4, 0 ;on passe par un registre temporaire +12 : ( 13 15 ) je l1 ;JumpIfEqual 2 +13 : ( 14 ) mov r0, 1 ;Affect +14 : ( 16 ) jmp l0 ;Jump +15 : ( 16 ) l1 : mov r0, 0 ;Affect +16 : ( 17 ) l0 : mov eax, r0 ;Write 1 +17 : ( ) call iprintLF ;Write 2 +18 : ( 19 ) add esp, 0 ;désallocation des variables locales +19 : ( 20 ) pop ebp ;restaure la valeur de ebp +20 : ( ) ret ; diff --git a/test/fg-ref/and2.fg b/test/fg-ref/and2.fg new file mode 100644 index 0000000..2a49f43 --- /dev/null +++ b/test/fg-ref/and2.fg @@ -0,0 +1,21 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r3, 4 ;JumpIfEqual 1 +8 : ( 9 ) cmp r3, 0 ;on passe par un registre temporaire +9 : ( 10 15 ) je l1 ;JumpIfEqual 2 +10 : ( 11 ) mov r4, 0 ;JumpIfEqual 1 +11 : ( 12 ) cmp r4, 0 ;on passe par un registre temporaire +12 : ( 13 15 ) je l1 ;JumpIfEqual 2 +13 : ( 14 ) mov r0, 1 ;Affect +14 : ( 16 ) jmp l0 ;Jump +15 : ( 16 ) l1 : mov r0, 0 ;Affect +16 : ( 17 ) l0 : mov eax, r0 ;Write 1 +17 : ( ) call iprintLF ;Write 2 +18 : ( 19 ) add esp, 0 ;désallocation des variables locales +19 : ( 20 ) pop ebp ;restaure la valeur de ebp +20 : ( ) ret ; diff --git a/test/fg-ref/and3.fg b/test/fg-ref/and3.fg new file mode 100644 index 0000000..5a994c3 --- /dev/null +++ b/test/fg-ref/and3.fg @@ -0,0 +1,21 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r3, 0 ;JumpIfEqual 1 +8 : ( 9 ) cmp r3, 0 ;on passe par un registre temporaire +9 : ( 10 15 ) je l1 ;JumpIfEqual 2 +10 : ( 11 ) mov r4, 1024 ;JumpIfEqual 1 +11 : ( 12 ) cmp r4, 0 ;on passe par un registre temporaire +12 : ( 13 15 ) je l1 ;JumpIfEqual 2 +13 : ( 14 ) mov r0, 1 ;Affect +14 : ( 16 ) jmp l0 ;Jump +15 : ( 16 ) l1 : mov r0, 0 ;Affect +16 : ( 17 ) l0 : mov eax, r0 ;Write 1 +17 : ( ) call iprintLF ;Write 2 +18 : ( 19 ) add esp, 0 ;désallocation des variables locales +19 : ( 20 ) pop ebp ;restaure la valeur de ebp +20 : ( ) ret ; diff --git a/test/fg-ref/and4.fg b/test/fg-ref/and4.fg new file mode 100644 index 0000000..3c441de --- /dev/null +++ b/test/fg-ref/and4.fg @@ -0,0 +1,21 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r3, 0 ;JumpIfEqual 1 +8 : ( 9 ) cmp r3, 0 ;on passe par un registre temporaire +9 : ( 10 15 ) je l1 ;JumpIfEqual 2 +10 : ( 11 ) mov r4, 0 ;JumpIfEqual 1 +11 : ( 12 ) cmp r4, 0 ;on passe par un registre temporaire +12 : ( 13 15 ) je l1 ;JumpIfEqual 2 +13 : ( 14 ) mov r0, 1 ;Affect +14 : ( 16 ) jmp l0 ;Jump +15 : ( 16 ) l1 : mov r0, 0 ;Affect +16 : ( 17 ) l0 : mov eax, r0 ;Write 1 +17 : ( ) call iprintLF ;Write 2 +18 : ( 19 ) add esp, 0 ;désallocation des variables locales +19 : ( 20 ) pop ebp ;restaure la valeur de ebp +20 : ( ) ret ; diff --git a/test/fg-ref/and5.fg b/test/fg-ref/and5.fg new file mode 100644 index 0000000..479056e --- /dev/null +++ b/test/fg-ref/and5.fg @@ -0,0 +1,29 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r4, 1 ;JumpIfEqual 1 +8 : ( 9 ) cmp r4, 0 ;on passe par un registre temporaire +9 : ( 10 15 ) je l3 ;JumpIfEqual 2 +10 : ( 11 ) mov r5, 0 ;JumpIfEqual 1 +11 : ( 12 ) cmp r5, 0 ;on passe par un registre temporaire +12 : ( 13 15 ) je l3 ;JumpIfEqual 2 +13 : ( 14 ) mov r1, 1 ;Affect +14 : ( 16 ) jmp l2 ;Jump +15 : ( 16 ) l3 : mov r1, 0 ;Affect +16 : ( 17 ) l2 : cmp r1, 0 ;JumpIfEqual 1 +17 : ( 18 23 ) je l1 ;JumpIfEqual 2 +18 : ( 19 ) mov r6, 1 ;JumpIfEqual 1 +19 : ( 20 ) cmp r6, 0 ;on passe par un registre temporaire +20 : ( 21 23 ) je l1 ;JumpIfEqual 2 +21 : ( 22 ) mov r0, 1 ;Affect +22 : ( 24 ) jmp l0 ;Jump +23 : ( 24 ) l1 : mov r0, 0 ;Affect +24 : ( 25 ) l0 : mov eax, r0 ;Write 1 +25 : ( ) call iprintLF ;Write 2 +26 : ( 27 ) add esp, 0 ;désallocation des variables locales +27 : ( 28 ) pop ebp ;restaure la valeur de ebp +28 : ( ) ret ; diff --git a/test/fg-ref/appel-param1.fg b/test/fg-ref/appel-param1.fg new file mode 100644 index 0000000..41c20bf --- /dev/null +++ b/test/fg-ref/appel-param1.fg @@ -0,0 +1,23 @@ +0 : ( 12 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) f : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, dword [ebp+4*3] ;Write 1 +8 : ( ) call iprintLF ;Write 2 +9 : ( 10 ) add esp, 0 ;désallocation des variables locales +10 : ( 11 ) pop ebp ;restaure la valeur de ebp +11 : ( 12 ) ret ; +12 : ( 13 ) main : push ebp ;sauvegarde la valeur de ebp +13 : ( 14 ) mov ebp, esp ;nouvelle valeur de ebp +14 : ( 15 ) sub esp, 0 ;allocation des variables locales +15 : ( 16 ) push 1 ;Param +16 : ( 17 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +17 : ( 4 ) call f ; +18 : ( 19 ) pop r0 ;récupération de la valeur de retour +19 : ( 20 ) add esp, 4 ;désallocation des arguments +20 : ( 21 ) add esp, 0 ;désallocation des variables locales +21 : ( 22 ) pop ebp ;restaure la valeur de ebp +22 : ( ) ret ; diff --git a/test/fg-ref/appel-param2.fg b/test/fg-ref/appel-param2.fg new file mode 100644 index 0000000..4b41c80 --- /dev/null +++ b/test/fg-ref/appel-param2.fg @@ -0,0 +1,26 @@ +0 : ( 14 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) f : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, dword [ebp+4*4] ;Write 1 +8 : ( ) call iprintLF ;Write 2 +9 : ( 10 ) mov eax, dword [ebp+4*3] ;Write 1 +10 : ( ) call iprintLF ;Write 2 +11 : ( 12 ) add esp, 0 ;désallocation des variables locales +12 : ( 13 ) pop ebp ;restaure la valeur de ebp +13 : ( 14 ) ret ; +14 : ( 15 ) main : push ebp ;sauvegarde la valeur de ebp +15 : ( 16 ) mov ebp, esp ;nouvelle valeur de ebp +16 : ( 17 ) sub esp, 0 ;allocation des variables locales +17 : ( 18 ) push 1 ;Param +18 : ( 19 ) push 456 ;Param +19 : ( 20 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +20 : ( 4 ) call f ; +21 : ( 22 ) pop r0 ;récupération de la valeur de retour +22 : ( 23 ) add esp, 8 ;désallocation des arguments +23 : ( 24 ) add esp, 0 ;désallocation des variables locales +24 : ( 25 ) pop ebp ;restaure la valeur de ebp +25 : ( ) ret ; diff --git a/test/fg-ref/appel-param3.fg b/test/fg-ref/appel-param3.fg new file mode 100644 index 0000000..a4d7228 --- /dev/null +++ b/test/fg-ref/appel-param3.fg @@ -0,0 +1,35 @@ +0 : ( 20 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) f : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, dword [ebp+4*7] ;Write 1 +8 : ( ) call iprintLF ;Write 2 +9 : ( 10 ) mov eax, dword [ebp+4*6] ;Write 1 +10 : ( ) call iprintLF ;Write 2 +11 : ( 12 ) mov eax, dword [ebp+4*5] ;Write 1 +12 : ( ) call iprintLF ;Write 2 +13 : ( 14 ) mov eax, dword [ebp+4*4] ;Write 1 +14 : ( ) call iprintLF ;Write 2 +15 : ( 16 ) mov eax, dword [ebp+4*3] ;Write 1 +16 : ( ) call iprintLF ;Write 2 +17 : ( 18 ) add esp, 0 ;désallocation des variables locales +18 : ( 19 ) pop ebp ;restaure la valeur de ebp +19 : ( 20 ) ret ; +20 : ( 21 ) main : push ebp ;sauvegarde la valeur de ebp +21 : ( 22 ) mov ebp, esp ;nouvelle valeur de ebp +22 : ( 23 ) sub esp, 0 ;allocation des variables locales +23 : ( 24 ) push 1 ;Param +24 : ( 25 ) push 2 ;Param +25 : ( 26 ) push 3 ;Param +26 : ( 27 ) push 4 ;Param +27 : ( 28 ) push 5 ;Param +28 : ( 29 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +29 : ( 4 ) call f ; +30 : ( 31 ) pop r0 ;récupération de la valeur de retour +31 : ( 32 ) add esp, 20 ;désallocation des arguments +32 : ( 33 ) add esp, 0 ;désallocation des variables locales +33 : ( 34 ) pop ebp ;restaure la valeur de ebp +34 : ( ) ret ; diff --git a/test/fg-ref/appel-retour1.fg b/test/fg-ref/appel-retour1.fg new file mode 100644 index 0000000..dc08c96 --- /dev/null +++ b/test/fg-ref/appel-retour1.fg @@ -0,0 +1,25 @@ +0 : ( 12 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) f : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r3, dword [ebp+4*3] ;ecriture de la valeur de retour +8 : ( 9 ) mov dword [ebp+4*2], r3 ;on passe par un registre temporaire +9 : ( 10 ) add esp, 0 ;désallocation des variables locales +10 : ( 11 ) pop ebp ;restaure la valeur de ebp +11 : ( 12 ) ret ; +12 : ( 13 ) main : push ebp ;sauvegarde la valeur de ebp +13 : ( 14 ) mov ebp, esp ;nouvelle valeur de ebp +14 : ( 15 ) sub esp, 0 ;allocation des variables locales +15 : ( 16 ) push 3712 ;Param +16 : ( 17 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +17 : ( 4 ) call f ; +18 : ( 19 ) pop r0 ;récupération de la valeur de retour +19 : ( 20 ) add esp, 4 ;désallocation des arguments +20 : ( 21 ) mov eax, r0 ;Write 1 +21 : ( ) call iprintLF ;Write 2 +22 : ( 23 ) add esp, 0 ;désallocation des variables locales +23 : ( 24 ) pop ebp ;restaure la valeur de ebp +24 : ( ) ret ; diff --git a/test/fg-ref/appel1.fg b/test/fg-ref/appel1.fg new file mode 100644 index 0000000..c3ca7da --- /dev/null +++ b/test/fg-ref/appel1.fg @@ -0,0 +1,21 @@ +0 : ( 12 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) f : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, 1 ;Write 1 +8 : ( ) call iprintLF ;Write 2 +9 : ( 10 ) add esp, 0 ;désallocation des variables locales +10 : ( 11 ) pop ebp ;restaure la valeur de ebp +11 : ( 12 ) ret ; +12 : ( 13 ) main : push ebp ;sauvegarde la valeur de ebp +13 : ( 14 ) mov ebp, esp ;nouvelle valeur de ebp +14 : ( 15 ) sub esp, 0 ;allocation des variables locales +15 : ( 16 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +16 : ( 4 ) call f ; +17 : ( 18 ) pop r0 ;récupération de la valeur de retour +18 : ( 19 ) add esp, 0 ;désallocation des variables locales +19 : ( 20 ) pop ebp ;restaure la valeur de ebp +20 : ( ) ret ; diff --git a/test/fg-ref/appel2.fg b/test/fg-ref/appel2.fg new file mode 100644 index 0000000..5dd8046 --- /dev/null +++ b/test/fg-ref/appel2.fg @@ -0,0 +1,32 @@ +0 : ( 23 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) g : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, 2 ;Write 1 +8 : ( ) call iprintLF ;Write 2 +9 : ( 10 ) add esp, 0 ;désallocation des variables locales +10 : ( 11 ) pop ebp ;restaure la valeur de ebp +11 : ( 12 ) ret ; +12 : ( 13 ) f : push ebp ;sauvegarde la valeur de ebp +13 : ( 14 ) mov ebp, esp ;nouvelle valeur de ebp +14 : ( 15 ) sub esp, 0 ;allocation des variables locales +15 : ( 16 ) mov eax, 1 ;Write 1 +16 : ( ) call iprintLF ;Write 2 +17 : ( 18 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +18 : ( 4 ) call g ; +19 : ( 20 ) pop r0 ;récupération de la valeur de retour +20 : ( 21 ) add esp, 0 ;désallocation des variables locales +21 : ( 22 ) pop ebp ;restaure la valeur de ebp +22 : ( 23 ) ret ; +23 : ( 24 ) main : push ebp ;sauvegarde la valeur de ebp +24 : ( 25 ) mov ebp, esp ;nouvelle valeur de ebp +25 : ( 26 ) sub esp, 0 ;allocation des variables locales +26 : ( 27 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +27 : ( 12 ) call f ; +28 : ( 29 ) pop r1 ;récupération de la valeur de retour +29 : ( 30 ) add esp, 0 ;désallocation des variables locales +30 : ( 31 ) pop ebp ;restaure la valeur de ebp +31 : ( ) ret ; diff --git a/test/fg-ref/appel3.fg b/test/fg-ref/appel3.fg new file mode 100644 index 0000000..d4964b3 --- /dev/null +++ b/test/fg-ref/appel3.fg @@ -0,0 +1,32 @@ +0 : ( 20 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) g : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, 2 ;Write 1 +8 : ( ) call iprintLF ;Write 2 +9 : ( 10 ) add esp, 0 ;désallocation des variables locales +10 : ( 11 ) pop ebp ;restaure la valeur de ebp +11 : ( 12 ) ret ; +12 : ( 13 ) f : push ebp ;sauvegarde la valeur de ebp +13 : ( 14 ) mov ebp, esp ;nouvelle valeur de ebp +14 : ( 15 ) sub esp, 0 ;allocation des variables locales +15 : ( 16 ) mov eax, 1 ;Write 1 +16 : ( ) call iprintLF ;Write 2 +17 : ( 18 ) add esp, 0 ;désallocation des variables locales +18 : ( 19 ) pop ebp ;restaure la valeur de ebp +19 : ( 20 ) ret ; +20 : ( 21 ) main : push ebp ;sauvegarde la valeur de ebp +21 : ( 22 ) mov ebp, esp ;nouvelle valeur de ebp +22 : ( 23 ) sub esp, 0 ;allocation des variables locales +23 : ( 24 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +24 : ( 12 ) call f ; +25 : ( 26 ) pop r0 ;récupération de la valeur de retour +26 : ( 27 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +27 : ( 4 ) call g ; +28 : ( 29 ) pop r1 ;récupération de la valeur de retour +29 : ( 30 ) add esp, 0 ;désallocation des variables locales +30 : ( 31 ) pop ebp ;restaure la valeur de ebp +31 : ( ) ret ; diff --git a/test/fg-ref/div1.fg b/test/fg-ref/div1.fg new file mode 100644 index 0000000..eccd4da --- /dev/null +++ b/test/fg-ref/div1.fg @@ -0,0 +1,16 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, 4 ; +8 : ( 9 ) mov r4, 2 ; +9 : ( 10 ) idiv r4 ; +10 : ( 11 ) mov r0, eax ; +11 : ( 12 ) mov eax, r0 ;Write 1 +12 : ( ) call iprintLF ;Write 2 +13 : ( 14 ) add esp, 0 ;désallocation des variables locales +14 : ( 15 ) pop ebp ;restaure la valeur de ebp +15 : ( ) ret ; diff --git a/test/fg-ref/div2.fg b/test/fg-ref/div2.fg new file mode 100644 index 0000000..7a56fa1 --- /dev/null +++ b/test/fg-ref/div2.fg @@ -0,0 +1,16 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, 0 ; +8 : ( 9 ) mov r4, 712 ; +9 : ( 10 ) idiv r4 ; +10 : ( 11 ) mov r0, eax ; +11 : ( 12 ) mov eax, r0 ;Write 1 +12 : ( ) call iprintLF ;Write 2 +13 : ( 14 ) add esp, 0 ;désallocation des variables locales +14 : ( 15 ) pop ebp ;restaure la valeur de ebp +15 : ( ) ret ; diff --git a/test/fg-ref/div3.fg b/test/fg-ref/div3.fg new file mode 100644 index 0000000..a7e9224 --- /dev/null +++ b/test/fg-ref/div3.fg @@ -0,0 +1,20 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, 4 ; +8 : ( 9 ) mov r5, 2 ; +9 : ( 10 ) idiv r5 ; +10 : ( 11 ) mov r0, eax ; +11 : ( 12 ) mov eax, r0 ; +12 : ( 13 ) mov r8, 2 ; +13 : ( 14 ) idiv r8 ; +14 : ( 15 ) mov r1, eax ; +15 : ( 16 ) mov eax, r1 ;Write 1 +16 : ( ) call iprintLF ;Write 2 +17 : ( 18 ) add esp, 0 ;désallocation des variables locales +18 : ( 19 ) pop ebp ;restaure la valeur de ebp +19 : ( ) ret ; diff --git a/test/fg-ref/div4.fg b/test/fg-ref/div4.fg new file mode 100644 index 0000000..1290454 --- /dev/null +++ b/test/fg-ref/div4.fg @@ -0,0 +1,16 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, 2 ; +8 : ( 9 ) mov r4, 3 ; +9 : ( 10 ) idiv r4 ; +10 : ( 11 ) mov r0, eax ; +11 : ( 12 ) mov eax, r0 ;Write 1 +12 : ( ) call iprintLF ;Write 2 +13 : ( 14 ) add esp, 0 ;désallocation des variables locales +14 : ( 15 ) pop ebp ;restaure la valeur de ebp +15 : ( ) ret ; diff --git a/test/fg-ref/ecrire1.fg b/test/fg-ref/ecrire1.fg new file mode 100644 index 0000000..77c65e8 --- /dev/null +++ b/test/fg-ref/ecrire1.fg @@ -0,0 +1,12 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, 3456 ;Write 1 +8 : ( ) call iprintLF ;Write 2 +9 : ( 10 ) add esp, 0 ;désallocation des variables locales +10 : ( 11 ) pop ebp ;restaure la valeur de ebp +11 : ( ) ret ; diff --git a/test/fg-ref/ecrire2.fg b/test/fg-ref/ecrire2.fg new file mode 100644 index 0000000..31b3bc5 --- /dev/null +++ b/test/fg-ref/ecrire2.fg @@ -0,0 +1,12 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, 0 ;Write 1 +8 : ( ) call iprintLF ;Write 2 +9 : ( 10 ) add esp, 0 ;désallocation des variables locales +10 : ( 11 ) pop ebp ;restaure la valeur de ebp +11 : ( ) ret ; diff --git a/test/fg-ref/egal1.fg b/test/fg-ref/egal1.fg new file mode 100644 index 0000000..c8c0ce0 --- /dev/null +++ b/test/fg-ref/egal1.fg @@ -0,0 +1,17 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 1 ;Affect +8 : ( 9 ) mov r3, 123 ;JumpIfEqual 1 +9 : ( 10 ) cmp r3, 123 ;on passe par un registre temporaire +10 : ( 11 12 ) je l0 ;JumpIfEqual 2 +11 : ( 12 ) mov r0, 0 ;Affect +12 : ( 13 ) l0 : mov eax, r0 ;Write 1 +13 : ( ) call iprintLF ;Write 2 +14 : ( 15 ) add esp, 0 ;désallocation des variables locales +15 : ( 16 ) pop ebp ;restaure la valeur de ebp +16 : ( ) ret ; diff --git a/test/fg-ref/egal2.fg b/test/fg-ref/egal2.fg new file mode 100644 index 0000000..4122164 --- /dev/null +++ b/test/fg-ref/egal2.fg @@ -0,0 +1,17 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 1 ;Affect +8 : ( 9 ) mov r3, 412 ;JumpIfEqual 1 +9 : ( 10 ) cmp r3, 34 ;on passe par un registre temporaire +10 : ( 11 12 ) je l0 ;JumpIfEqual 2 +11 : ( 12 ) mov r0, 0 ;Affect +12 : ( 13 ) l0 : mov eax, r0 ;Write 1 +13 : ( ) call iprintLF ;Write 2 +14 : ( 15 ) add esp, 0 ;désallocation des variables locales +15 : ( 16 ) pop ebp ;restaure la valeur de ebp +16 : ( ) ret ; diff --git a/test/fg-ref/egal3.fg b/test/fg-ref/egal3.fg new file mode 100644 index 0000000..7ceae35 --- /dev/null +++ b/test/fg-ref/egal3.fg @@ -0,0 +1,21 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r1, 1 ;Affect +8 : ( 9 ) mov r4, 2 ;JumpIfEqual 1 +9 : ( 10 ) cmp r4, 2 ;on passe par un registre temporaire +10 : ( 11 12 ) je l1 ;JumpIfEqual 2 +11 : ( 12 ) mov r1, 0 ;Affect +12 : ( 13 ) l1 : mov r0, 1 ;Affect +13 : ( 14 ) cmp r1, 1 ;JumpIfEqual 1 +14 : ( 15 16 ) je l0 ;JumpIfEqual 2 +15 : ( 16 ) mov r0, 0 ;Affect +16 : ( 17 ) l0 : mov eax, r0 ;Write 1 +17 : ( ) call iprintLF ;Write 2 +18 : ( 19 ) add esp, 0 ;désallocation des variables locales +19 : ( 20 ) pop ebp ;restaure la valeur de ebp +20 : ( ) ret ; diff --git a/test/fg-ref/err5.fg b/test/fg-ref/err5.fg new file mode 100644 index 0000000..be06113 --- /dev/null +++ b/test/fg-ref/err5.fg @@ -0,0 +1,22 @@ +0 : ( 12 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) f : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, 1 ;Write 1 +8 : ( ) call iprintLF ;Write 2 +9 : ( 10 ) add esp, 0 ;désallocation des variables locales +10 : ( 11 ) pop ebp ;restaure la valeur de ebp +11 : ( 12 ) ret ; +12 : ( 13 ) main : push ebp ;sauvegarde la valeur de ebp +13 : ( 14 ) mov ebp, esp ;nouvelle valeur de ebp +14 : ( 15 ) sub esp, 4 ;allocation des variables locales +15 : ( 16 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +16 : ( 4 ) call f ; +17 : ( 18 ) pop r0 ;récupération de la valeur de retour +18 : ( 19 ) mov dword [ebp-4*1], r0 ;Affect +19 : ( 20 ) add esp, 4 ;désallocation des variables locales +20 : ( 21 ) pop ebp ;restaure la valeur de ebp +21 : ( ) ret ; diff --git a/test/fg-ref/fibo.fg b/test/fg-ref/fibo.fg new file mode 100644 index 0000000..70c1ca0 --- /dev/null +++ b/test/fg-ref/fibo.fg @@ -0,0 +1,80 @@ +0 : ( 1 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +1 : ( 2 ) call main ; +2 : ( 3 ) pop r0 ;récupération de la valeur de retour +3 : ( 4 ) mov ebx, 0 ; valeur de retour du programme +4 : ( 5 ) mov eax, 1 ; code de sortie +5 : ( 6 ) int 0x80 ; +6 : ( 7 ) fibo : push ebp ;sauvegarde la valeur de ebp +7 : ( 8 ) mov ebp, esp ;nouvelle valeur de ebp +8 : ( 9 ) push eax ;sauvegarde de eax +9 : ( 10 ) push ebx ;sauvegarde de ebx +10 : ( 11 ) push ecx ;sauvegarde de ecx +11 : ( 12 ) push edx ;sauvegarde de edx +12 : ( 13 ) sub esp, 0 ;allocation des variables locales +13 : ( 14 ) mov r1, 1 ;Affect +14 : ( 15 ) cmp dword [ebp+12], 2 ;JumpIfLess 1 +15 : ( 16 17 ) jl l2 ;JumpIfLess 2 +16 : ( 17 ) mov r1, 0 ;Affect +17 : ( 18 ) l2 : cmp r1, 0 ;JumpIfEqual 1 +18 : ( 19 28 ) je l0 ;JumpIfEqual 2 +19 : ( 20 ) mov dword [ebp+8], 1 ;ecriture de la valeur de retour +20 : ( 21 ) add esp, 0 ;désallocation des variables locales +21 : ( 22 ) pop edx ;restaure edx +22 : ( 23 ) pop ecx ;restaure ecx +23 : ( 24 ) pop ebx ;restaure ebx +24 : ( 25 ) pop eax ;restaure eax +25 : ( 26 ) pop ebp ;restaure la valeur de ebp +26 : ( ) ret ; +27 : ( 52 ) jmp l1 ;Jump +28 : ( 29 ) l0 : mov r3, dword [ebp+12] ; +29 : ( 30 ) sub r3, 1 ; +30 : ( 31 ) push r3 ;Param +31 : ( 32 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +32 : ( 33 ) call fibo ; +33 : ( 34 ) pop r2 ;récupération de la valeur de retour +34 : ( 35 ) add esp, 4 ;désallocation des arguments +35 : ( 36 ) mov r5, dword [ebp+12] ; +36 : ( 37 ) sub r5, 2 ; +37 : ( 38 ) push r5 ;Param +38 : ( 39 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +39 : ( 40 ) call fibo ; +40 : ( 41 ) pop r4 ;récupération de la valeur de retour +41 : ( 42 ) add esp, 4 ;désallocation des arguments +42 : ( 43 ) mov r6, r2 ; +43 : ( 44 ) add r6, r4 ; +44 : ( 45 ) mov dword [ebp+8], r6 ;ecriture de la valeur de retour +45 : ( 46 ) add esp, 0 ;désallocation des variables locales +46 : ( 47 ) pop edx ;restaure edx +47 : ( 48 ) pop ecx ;restaure ecx +48 : ( 49 ) pop ebx ;restaure ebx +49 : ( 50 ) pop eax ;restaure eax +50 : ( 51 ) pop ebp ;restaure la valeur de ebp +51 : ( ) ret ; +52 : ( 53 ) l1 : add esp, 0 ;désallocation des variables locales +53 : ( 54 ) pop edx ;restaure edx +54 : ( 55 ) pop ecx ;restaure ecx +55 : ( 56 ) pop ebx ;restaure ebx +56 : ( 57 ) pop eax ;restaure eax +57 : ( 58 ) pop ebp ;restaure la valeur de ebp +58 : ( ) ret ; +59 : ( 60 ) main : push ebp ;sauvegarde la valeur de ebp +60 : ( 61 ) mov ebp, esp ;nouvelle valeur de ebp +61 : ( 62 ) push eax ;sauvegarde de eax +62 : ( 63 ) push ebx ;sauvegarde de ebx +63 : ( 64 ) push ecx ;sauvegarde de ecx +64 : ( 65 ) push edx ;sauvegarde de edx +65 : ( 66 ) sub esp, 0 ;allocation des variables locales +66 : ( 67 ) push 9 ;Param +67 : ( 68 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +68 : ( 69 ) call fibo ; +69 : ( 70 ) pop r7 ;récupération de la valeur de retour +70 : ( 71 ) add esp, 4 ;désallocation des arguments +71 : ( 72 ) mov eax, r7 ;Write 1 +72 : ( 73 ) call iprintLF ;Write 2 +73 : ( 74 ) add esp, 0 ;désallocation des variables locales +74 : ( 75 ) pop edx ;restaure edx +75 : ( 76 ) pop ecx ;restaure ecx +76 : ( 77 ) pop ebx ;restaure ebx +77 : ( 78 ) pop eax ;restaure eax +78 : ( 79 ) pop ebp ;restaure la valeur de ebp +79 : ( ) ret ; diff --git a/test/fg-ref/inf1.fg b/test/fg-ref/inf1.fg new file mode 100644 index 0000000..3b96a9b --- /dev/null +++ b/test/fg-ref/inf1.fg @@ -0,0 +1,17 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 1 ;Affect +8 : ( 9 ) mov r3, 3 ;JumpIfLess 1 +9 : ( 10 ) cmp r3, 3 ;on passe par un registre temporaire +10 : ( 11 12 ) jl l0 ;JumpIfLess 2 +11 : ( 12 ) mov r0, 0 ;Affect +12 : ( 13 ) l0 : mov eax, r0 ;Write 1 +13 : ( ) call iprintLF ;Write 2 +14 : ( 15 ) add esp, 0 ;désallocation des variables locales +15 : ( 16 ) pop ebp ;restaure la valeur de ebp +16 : ( ) ret ; diff --git a/test/fg-ref/inf2.fg b/test/fg-ref/inf2.fg new file mode 100644 index 0000000..caaacf3 --- /dev/null +++ b/test/fg-ref/inf2.fg @@ -0,0 +1,17 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 1 ;Affect +8 : ( 9 ) mov r3, 4 ;JumpIfLess 1 +9 : ( 10 ) cmp r3, 1 ;on passe par un registre temporaire +10 : ( 11 12 ) jl l0 ;JumpIfLess 2 +11 : ( 12 ) mov r0, 0 ;Affect +12 : ( 13 ) l0 : mov eax, r0 ;Write 1 +13 : ( ) call iprintLF ;Write 2 +14 : ( 15 ) add esp, 0 ;désallocation des variables locales +15 : ( 16 ) pop ebp ;restaure la valeur de ebp +16 : ( ) ret ; diff --git a/test/fg-ref/inf3.fg b/test/fg-ref/inf3.fg new file mode 100644 index 0000000..22bb0d9 --- /dev/null +++ b/test/fg-ref/inf3.fg @@ -0,0 +1,17 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 1 ;Affect +8 : ( 9 ) mov r3, 312 ;JumpIfLess 1 +9 : ( 10 ) cmp r3, 475 ;on passe par un registre temporaire +10 : ( 11 12 ) jl l0 ;JumpIfLess 2 +11 : ( 12 ) mov r0, 0 ;Affect +12 : ( 13 ) l0 : mov eax, r0 ;Write 1 +13 : ( ) call iprintLF ;Write 2 +14 : ( 15 ) add esp, 0 ;désallocation des variables locales +15 : ( 16 ) pop ebp ;restaure la valeur de ebp +16 : ( ) ret ; diff --git a/test/fg-ref/inf4.fg b/test/fg-ref/inf4.fg new file mode 100644 index 0000000..3da39ec --- /dev/null +++ b/test/fg-ref/inf4.fg @@ -0,0 +1,21 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r1, 1 ;Affect +8 : ( 9 ) mov r4, 3 ;JumpIfLess 1 +9 : ( 10 ) cmp r4, 2 ;on passe par un registre temporaire +10 : ( 11 12 ) jl l1 ;JumpIfLess 2 +11 : ( 12 ) mov r1, 0 ;Affect +12 : ( 13 ) l1 : mov r0, 1 ;Affect +13 : ( 14 ) cmp r1, 1 ;JumpIfLess 1 +14 : ( 15 16 ) jl l0 ;JumpIfLess 2 +15 : ( 16 ) mov r0, 0 ;Affect +16 : ( 17 ) l0 : mov eax, r0 ;Write 1 +17 : ( ) call iprintLF ;Write 2 +18 : ( 19 ) add esp, 0 ;désallocation des variables locales +19 : ( 20 ) pop ebp ;restaure la valeur de ebp +20 : ( ) ret ; diff --git a/test/fg-ref/mult1.fg b/test/fg-ref/mult1.fg new file mode 100644 index 0000000..227aefc --- /dev/null +++ b/test/fg-ref/mult1.fg @@ -0,0 +1,14 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 2 ; +8 : ( 9 ) imul r0, 3 ; +9 : ( 10 ) mov eax, r0 ;Write 1 +10 : ( ) call iprintLF ;Write 2 +11 : ( 12 ) add esp, 0 ;désallocation des variables locales +12 : ( 13 ) pop ebp ;restaure la valeur de ebp +13 : ( ) ret ; diff --git a/test/fg-ref/mult2.fg b/test/fg-ref/mult2.fg new file mode 100644 index 0000000..bc8b6a5 --- /dev/null +++ b/test/fg-ref/mult2.fg @@ -0,0 +1,14 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 0 ; +8 : ( 9 ) imul r0, 321 ; +9 : ( 10 ) mov eax, r0 ;Write 1 +10 : ( ) call iprintLF ;Write 2 +11 : ( 12 ) add esp, 0 ;désallocation des variables locales +12 : ( 13 ) pop ebp ;restaure la valeur de ebp +13 : ( ) ret ; diff --git a/test/fg-ref/mult3.fg b/test/fg-ref/mult3.fg new file mode 100644 index 0000000..2e78fb6 --- /dev/null +++ b/test/fg-ref/mult3.fg @@ -0,0 +1,16 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 3 ; +8 : ( 9 ) imul r0, 3 ; +9 : ( 10 ) mov r1, r0 ; +10 : ( 11 ) imul r1, 2 ; +11 : ( 12 ) mov eax, r1 ;Write 1 +12 : ( ) call iprintLF ;Write 2 +13 : ( 14 ) add esp, 0 ;désallocation des variables locales +14 : ( 15 ) pop ebp ;restaure la valeur de ebp +15 : ( ) ret ; diff --git a/test/fg-ref/not1.fg b/test/fg-ref/not1.fg new file mode 100644 index 0000000..7b67cd6 --- /dev/null +++ b/test/fg-ref/not1.fg @@ -0,0 +1,17 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 1 ;Affect +8 : ( 9 ) mov r3, 312 ;JumpIfEqual 1 +9 : ( 10 ) cmp r3, 0 ;on passe par un registre temporaire +10 : ( 11 12 ) je l0 ;JumpIfEqual 2 +11 : ( 12 ) mov r0, 0 ;Affect +12 : ( 13 ) l0 : mov eax, r0 ;Write 1 +13 : ( ) call iprintLF ;Write 2 +14 : ( 15 ) add esp, 0 ;désallocation des variables locales +15 : ( 16 ) pop ebp ;restaure la valeur de ebp +16 : ( ) ret ; diff --git a/test/fg-ref/not2.fg b/test/fg-ref/not2.fg new file mode 100644 index 0000000..6b7e911 --- /dev/null +++ b/test/fg-ref/not2.fg @@ -0,0 +1,17 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 1 ;Affect +8 : ( 9 ) mov r3, 0 ;JumpIfEqual 1 +9 : ( 10 ) cmp r3, 0 ;on passe par un registre temporaire +10 : ( 11 12 ) je l0 ;JumpIfEqual 2 +11 : ( 12 ) mov r0, 0 ;Affect +12 : ( 13 ) l0 : mov eax, r0 ;Write 1 +13 : ( ) call iprintLF ;Write 2 +14 : ( 15 ) add esp, 0 ;désallocation des variables locales +15 : ( 16 ) pop ebp ;restaure la valeur de ebp +16 : ( ) ret ; diff --git a/test/fg-ref/not3.fg b/test/fg-ref/not3.fg new file mode 100644 index 0000000..a2d3434 --- /dev/null +++ b/test/fg-ref/not3.fg @@ -0,0 +1,21 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r1, 1 ;Affect +8 : ( 9 ) mov r4, 0 ;JumpIfEqual 1 +9 : ( 10 ) cmp r4, 0 ;on passe par un registre temporaire +10 : ( 11 12 ) je l1 ;JumpIfEqual 2 +11 : ( 12 ) mov r1, 0 ;Affect +12 : ( 13 ) l1 : mov r0, 1 ;Affect +13 : ( 14 ) cmp r1, 0 ;JumpIfEqual 1 +14 : ( 15 16 ) je l0 ;JumpIfEqual 2 +15 : ( 16 ) mov r0, 0 ;Affect +16 : ( 17 ) l0 : mov eax, r0 ;Write 1 +17 : ( ) call iprintLF ;Write 2 +18 : ( 19 ) add esp, 0 ;désallocation des variables locales +19 : ( 20 ) pop ebp ;restaure la valeur de ebp +20 : ( ) ret ; diff --git a/test/fg-ref/or1.fg b/test/fg-ref/or1.fg new file mode 100644 index 0000000..d5799f4 --- /dev/null +++ b/test/fg-ref/or1.fg @@ -0,0 +1,21 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r3, 1 ;jumpIfNotEqual 1 +8 : ( 9 ) cmp r3, 0 ;on passe par un registre temporaire +9 : ( 10 15 ) jne l1 ;jumpIfNotEqual 2 +10 : ( 11 ) mov r4, 1 ;jumpIfNotEqual 1 +11 : ( 12 ) cmp r4, 0 ;on passe par un registre temporaire +12 : ( 13 15 ) jne l1 ;jumpIfNotEqual 2 +13 : ( 14 ) mov r0, 0 ;Affect +14 : ( 16 ) jmp l0 ;Jump +15 : ( 16 ) l1 : mov r0, 1 ;Affect +16 : ( 17 ) l0 : mov eax, r0 ;Write 1 +17 : ( ) call iprintLF ;Write 2 +18 : ( 19 ) add esp, 0 ;désallocation des variables locales +19 : ( 20 ) pop ebp ;restaure la valeur de ebp +20 : ( ) ret ; diff --git a/test/fg-ref/or2.fg b/test/fg-ref/or2.fg new file mode 100644 index 0000000..e56cdf0 --- /dev/null +++ b/test/fg-ref/or2.fg @@ -0,0 +1,21 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r3, 1 ;jumpIfNotEqual 1 +8 : ( 9 ) cmp r3, 0 ;on passe par un registre temporaire +9 : ( 10 15 ) jne l1 ;jumpIfNotEqual 2 +10 : ( 11 ) mov r4, 0 ;jumpIfNotEqual 1 +11 : ( 12 ) cmp r4, 0 ;on passe par un registre temporaire +12 : ( 13 15 ) jne l1 ;jumpIfNotEqual 2 +13 : ( 14 ) mov r0, 0 ;Affect +14 : ( 16 ) jmp l0 ;Jump +15 : ( 16 ) l1 : mov r0, 1 ;Affect +16 : ( 17 ) l0 : mov eax, r0 ;Write 1 +17 : ( ) call iprintLF ;Write 2 +18 : ( 19 ) add esp, 0 ;désallocation des variables locales +19 : ( 20 ) pop ebp ;restaure la valeur de ebp +20 : ( ) ret ; diff --git a/test/fg-ref/or3.fg b/test/fg-ref/or3.fg new file mode 100644 index 0000000..f045f74 --- /dev/null +++ b/test/fg-ref/or3.fg @@ -0,0 +1,21 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r3, 0 ;jumpIfNotEqual 1 +8 : ( 9 ) cmp r3, 0 ;on passe par un registre temporaire +9 : ( 10 15 ) jne l1 ;jumpIfNotEqual 2 +10 : ( 11 ) mov r4, 315 ;jumpIfNotEqual 1 +11 : ( 12 ) cmp r4, 0 ;on passe par un registre temporaire +12 : ( 13 15 ) jne l1 ;jumpIfNotEqual 2 +13 : ( 14 ) mov r0, 0 ;Affect +14 : ( 16 ) jmp l0 ;Jump +15 : ( 16 ) l1 : mov r0, 1 ;Affect +16 : ( 17 ) l0 : mov eax, r0 ;Write 1 +17 : ( ) call iprintLF ;Write 2 +18 : ( 19 ) add esp, 0 ;désallocation des variables locales +19 : ( 20 ) pop ebp ;restaure la valeur de ebp +20 : ( ) ret ; diff --git a/test/fg-ref/or4.fg b/test/fg-ref/or4.fg new file mode 100644 index 0000000..f55660b --- /dev/null +++ b/test/fg-ref/or4.fg @@ -0,0 +1,21 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r3, 0 ;jumpIfNotEqual 1 +8 : ( 9 ) cmp r3, 0 ;on passe par un registre temporaire +9 : ( 10 15 ) jne l1 ;jumpIfNotEqual 2 +10 : ( 11 ) mov r4, 0 ;jumpIfNotEqual 1 +11 : ( 12 ) cmp r4, 0 ;on passe par un registre temporaire +12 : ( 13 15 ) jne l1 ;jumpIfNotEqual 2 +13 : ( 14 ) mov r0, 0 ;Affect +14 : ( 16 ) jmp l0 ;Jump +15 : ( 16 ) l1 : mov r0, 1 ;Affect +16 : ( 17 ) l0 : mov eax, r0 ;Write 1 +17 : ( ) call iprintLF ;Write 2 +18 : ( 19 ) add esp, 0 ;désallocation des variables locales +19 : ( 20 ) pop ebp ;restaure la valeur de ebp +20 : ( ) ret ; diff --git a/test/fg-ref/or5.fg b/test/fg-ref/or5.fg new file mode 100644 index 0000000..a374a43 --- /dev/null +++ b/test/fg-ref/or5.fg @@ -0,0 +1,29 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r4, 0 ;jumpIfNotEqual 1 +8 : ( 9 ) cmp r4, 0 ;on passe par un registre temporaire +9 : ( 10 15 ) jne l3 ;jumpIfNotEqual 2 +10 : ( 11 ) mov r5, 1 ;jumpIfNotEqual 1 +11 : ( 12 ) cmp r5, 0 ;on passe par un registre temporaire +12 : ( 13 15 ) jne l3 ;jumpIfNotEqual 2 +13 : ( 14 ) mov r1, 0 ;Affect +14 : ( 16 ) jmp l2 ;Jump +15 : ( 16 ) l3 : mov r1, 1 ;Affect +16 : ( 17 ) l2 : cmp r1, 0 ;jumpIfNotEqual 1 +17 : ( 18 23 ) jne l1 ;jumpIfNotEqual 2 +18 : ( 19 ) mov r6, 0 ;jumpIfNotEqual 1 +19 : ( 20 ) cmp r6, 0 ;on passe par un registre temporaire +20 : ( 21 23 ) jne l1 ;jumpIfNotEqual 2 +21 : ( 22 ) mov r0, 0 ;Affect +22 : ( 24 ) jmp l0 ;Jump +23 : ( 24 ) l1 : mov r0, 1 ;Affect +24 : ( 25 ) l0 : mov eax, r0 ;Write 1 +25 : ( ) call iprintLF ;Write 2 +26 : ( 27 ) add esp, 0 ;désallocation des variables locales +27 : ( 28 ) pop ebp ;restaure la valeur de ebp +28 : ( ) ret ; diff --git a/test/fg-ref/parenth1.fg b/test/fg-ref/parenth1.fg new file mode 100644 index 0000000..cae97fc --- /dev/null +++ b/test/fg-ref/parenth1.fg @@ -0,0 +1,12 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, 1 ;Write 1 +8 : ( ) call iprintLF ;Write 2 +9 : ( 10 ) add esp, 0 ;désallocation des variables locales +10 : ( 11 ) pop ebp ;restaure la valeur de ebp +11 : ( ) ret ; diff --git a/test/fg-ref/parenth2.fg b/test/fg-ref/parenth2.fg new file mode 100644 index 0000000..11ce321 --- /dev/null +++ b/test/fg-ref/parenth2.fg @@ -0,0 +1,12 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, 2 ;Write 1 +8 : ( ) call iprintLF ;Write 2 +9 : ( 10 ) add esp, 0 ;désallocation des variables locales +10 : ( 11 ) pop ebp ;restaure la valeur de ebp +11 : ( ) ret ; diff --git a/test/fg-ref/prio23-1.fg b/test/fg-ref/prio23-1.fg new file mode 100644 index 0000000..64a2316 --- /dev/null +++ b/test/fg-ref/prio23-1.fg @@ -0,0 +1,19 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 1 ;Affect +8 : ( 9 ) mov r4, 0 ;JumpIfEqual 1 +9 : ( 10 ) cmp r4, 0 ;on passe par un registre temporaire +10 : ( 11 12 ) je l0 ;JumpIfEqual 2 +11 : ( 12 ) mov r0, 0 ;Affect +12 : ( 13 ) l0 : mov r1, r0 ; +13 : ( 14 ) imul r1, 10 ; +14 : ( 15 ) mov eax, r1 ;Write 1 +15 : ( ) call iprintLF ;Write 2 +16 : ( 17 ) add esp, 0 ;désallocation des variables locales +17 : ( 18 ) pop ebp ;restaure la valeur de ebp +18 : ( ) ret ; diff --git a/test/fg-ref/prio23-2.fg b/test/fg-ref/prio23-2.fg new file mode 100644 index 0000000..40ad4e9 --- /dev/null +++ b/test/fg-ref/prio23-2.fg @@ -0,0 +1,19 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 1 ;Affect +8 : ( 9 ) mov r4, 10 ;JumpIfEqual 1 +9 : ( 10 ) cmp r4, 0 ;on passe par un registre temporaire +10 : ( 11 12 ) je l0 ;JumpIfEqual 2 +11 : ( 12 ) mov r0, 0 ;Affect +12 : ( 13 ) l0 : mov r1, 3 ; +13 : ( 14 ) imul r1, r0 ; +14 : ( 15 ) mov eax, r1 ;Write 1 +15 : ( ) call iprintLF ;Write 2 +16 : ( 17 ) add esp, 0 ;désallocation des variables locales +17 : ( 18 ) pop ebp ;restaure la valeur de ebp +18 : ( ) ret ; diff --git a/test/fg-ref/prio23-3.fg b/test/fg-ref/prio23-3.fg new file mode 100644 index 0000000..b816b70 --- /dev/null +++ b/test/fg-ref/prio23-3.fg @@ -0,0 +1,21 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 1 ;Affect +8 : ( 9 ) mov r4, 0 ;JumpIfEqual 1 +9 : ( 10 ) cmp r4, 0 ;on passe par un registre temporaire +10 : ( 11 12 ) je l0 ;JumpIfEqual 2 +11 : ( 12 ) mov r0, 0 ;Affect +12 : ( 13 ) l0 : mov eax, r0 ; +13 : ( 14 ) mov r6, 1 ; +14 : ( 15 ) idiv r6 ; +15 : ( 16 ) mov r1, eax ; +16 : ( 17 ) mov eax, r1 ;Write 1 +17 : ( ) call iprintLF ;Write 2 +18 : ( 19 ) add esp, 0 ;désallocation des variables locales +19 : ( 20 ) pop ebp ;restaure la valeur de ebp +20 : ( ) ret ; diff --git a/test/fg-ref/prio23-4.fg b/test/fg-ref/prio23-4.fg new file mode 100644 index 0000000..08cb33a --- /dev/null +++ b/test/fg-ref/prio23-4.fg @@ -0,0 +1,25 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 1 ;Affect +8 : ( 9 ) mov r5, 1 ;JumpIfEqual 1 +9 : ( 10 ) cmp r5, 0 ;on passe par un registre temporaire +10 : ( 11 12 ) je l0 ;JumpIfEqual 2 +11 : ( 12 ) mov r0, 0 ;Affect +12 : ( 13 ) l0 : mov r1, 1 ;Affect +13 : ( 14 ) mov r6, 0 ;JumpIfEqual 1 +14 : ( 15 ) cmp r6, 0 ;on passe par un registre temporaire +15 : ( 16 17 ) je l1 ;JumpIfEqual 2 +16 : ( 17 ) mov r1, 0 ;Affect +17 : ( 18 ) l1 : mov eax, r0 ; +18 : ( 19 ) idiv r1 ; +19 : ( 20 ) mov r2, eax ; +20 : ( 21 ) mov eax, r2 ;Write 1 +21 : ( ) call iprintLF ;Write 2 +22 : ( 23 ) add esp, 0 ;désallocation des variables locales +23 : ( 24 ) pop ebp ;restaure la valeur de ebp +24 : ( ) ret ; diff --git a/test/fg-ref/prio34-1.fg b/test/fg-ref/prio34-1.fg new file mode 100644 index 0000000..9eeb40e --- /dev/null +++ b/test/fg-ref/prio34-1.fg @@ -0,0 +1,16 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 3 ; +8 : ( 9 ) imul r0, 4 ; +9 : ( 10 ) mov r1, 2 ; +10 : ( 11 ) add r1, r0 ; +11 : ( 12 ) mov eax, r1 ;Write 1 +12 : ( ) call iprintLF ;Write 2 +13 : ( 14 ) add esp, 0 ;désallocation des variables locales +14 : ( 15 ) pop ebp ;restaure la valeur de ebp +15 : ( ) ret ; diff --git a/test/fg-ref/prio34-2.fg b/test/fg-ref/prio34-2.fg new file mode 100644 index 0000000..fb90144 --- /dev/null +++ b/test/fg-ref/prio34-2.fg @@ -0,0 +1,16 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 2 ; +8 : ( 9 ) imul r0, 3 ; +9 : ( 10 ) mov r1, r0 ; +10 : ( 11 ) sub r1, 4 ; +11 : ( 12 ) mov eax, r1 ;Write 1 +12 : ( ) call iprintLF ;Write 2 +13 : ( 14 ) add esp, 0 ;désallocation des variables locales +14 : ( 15 ) pop ebp ;restaure la valeur de ebp +15 : ( ) ret ; diff --git a/test/fg-ref/prio34-3.fg b/test/fg-ref/prio34-3.fg new file mode 100644 index 0000000..9c8c152 --- /dev/null +++ b/test/fg-ref/prio34-3.fg @@ -0,0 +1,18 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, 6 ; +8 : ( 9 ) mov r5, 3 ; +9 : ( 10 ) idiv r5 ; +10 : ( 11 ) mov r0, eax ; +11 : ( 12 ) mov r1, r0 ; +12 : ( 13 ) sub r1, 72 ; +13 : ( 14 ) mov eax, r1 ;Write 1 +14 : ( ) call iprintLF ;Write 2 +15 : ( 16 ) add esp, 0 ;désallocation des variables locales +16 : ( 17 ) pop ebp ;restaure la valeur de ebp +17 : ( ) ret ; diff --git a/test/fg-ref/prio34-4.fg b/test/fg-ref/prio34-4.fg new file mode 100644 index 0000000..9f93a00 --- /dev/null +++ b/test/fg-ref/prio34-4.fg @@ -0,0 +1,18 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov eax, 20 ; +8 : ( 9 ) mov r5, 10 ; +9 : ( 10 ) idiv r5 ; +10 : ( 11 ) mov r0, eax ; +11 : ( 12 ) mov r1, 6 ; +12 : ( 13 ) add r1, r0 ; +13 : ( 14 ) mov eax, r1 ;Write 1 +14 : ( ) call iprintLF ;Write 2 +15 : ( 16 ) add esp, 0 ;désallocation des variables locales +16 : ( 17 ) pop ebp ;restaure la valeur de ebp +17 : ( ) ret ; diff --git a/test/fg-ref/prio45-1.fg b/test/fg-ref/prio45-1.fg new file mode 100644 index 0000000..d74cf0c --- /dev/null +++ b/test/fg-ref/prio45-1.fg @@ -0,0 +1,19 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r1, 0 ; +8 : ( 9 ) add r1, 1 ; +9 : ( 10 ) mov r0, 1 ;Affect +10 : ( 11 ) mov r4, 2 ;JumpIfEqual 1 +11 : ( 12 ) cmp r4, r1 ;on passe par un registre temporaire +12 : ( 13 14 ) je l0 ;JumpIfEqual 2 +13 : ( 14 ) mov r0, 0 ;Affect +14 : ( 15 ) l0 : mov eax, r0 ;Write 1 +15 : ( ) call iprintLF ;Write 2 +16 : ( 17 ) add esp, 0 ;désallocation des variables locales +17 : ( 18 ) pop ebp ;restaure la valeur de ebp +18 : ( ) ret ; diff --git a/test/fg-ref/prio45-2.fg b/test/fg-ref/prio45-2.fg new file mode 100644 index 0000000..296352a --- /dev/null +++ b/test/fg-ref/prio45-2.fg @@ -0,0 +1,18 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r1, 1 ; +8 : ( 9 ) add r1, 234 ; +9 : ( 10 ) mov r0, 1 ;Affect +10 : ( 11 ) cmp r1, 1 ;JumpIfEqual 1 +11 : ( 12 13 ) je l0 ;JumpIfEqual 2 +12 : ( 13 ) mov r0, 0 ;Affect +13 : ( 14 ) l0 : mov eax, r0 ;Write 1 +14 : ( ) call iprintLF ;Write 2 +15 : ( 16 ) add esp, 0 ;désallocation des variables locales +16 : ( 17 ) pop ebp ;restaure la valeur de ebp +17 : ( ) ret ; diff --git a/test/fg-ref/prio45-3.fg b/test/fg-ref/prio45-3.fg new file mode 100644 index 0000000..3d0b534 --- /dev/null +++ b/test/fg-ref/prio45-3.fg @@ -0,0 +1,19 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r1, 11 ; +8 : ( 9 ) add r1, 100 ; +9 : ( 10 ) mov r0, 1 ;Affect +10 : ( 11 ) mov r4, 12 ;JumpIfLess 1 +11 : ( 12 ) cmp r4, r1 ;on passe par un registre temporaire +12 : ( 13 14 ) jl l0 ;JumpIfLess 2 +13 : ( 14 ) mov r0, 0 ;Affect +14 : ( 15 ) l0 : mov eax, r0 ;Write 1 +15 : ( ) call iprintLF ;Write 2 +16 : ( 17 ) add esp, 0 ;désallocation des variables locales +17 : ( 18 ) pop ebp ;restaure la valeur de ebp +18 : ( ) ret ; diff --git a/test/fg-ref/prio45-4.fg b/test/fg-ref/prio45-4.fg new file mode 100644 index 0000000..9374e20 --- /dev/null +++ b/test/fg-ref/prio45-4.fg @@ -0,0 +1,18 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r1, 21 ; +8 : ( 9 ) sub r1, 21 ; +9 : ( 10 ) mov r0, 1 ;Affect +10 : ( 11 ) cmp r1, 1 ;JumpIfLess 1 +11 : ( 12 13 ) jl l0 ;JumpIfLess 2 +12 : ( 13 ) mov r0, 0 ;Affect +13 : ( 14 ) l0 : mov eax, r0 ;Write 1 +14 : ( ) call iprintLF ;Write 2 +15 : ( 16 ) add esp, 0 ;désallocation des variables locales +16 : ( 17 ) pop ebp ;restaure la valeur de ebp +17 : ( ) ret ; diff --git a/test/fg-ref/prio56-1.fg b/test/fg-ref/prio56-1.fg new file mode 100644 index 0000000..52cb826 --- /dev/null +++ b/test/fg-ref/prio56-1.fg @@ -0,0 +1,25 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r1, 1 ;Affect +8 : ( 9 ) mov r4, 1 ;JumpIfEqual 1 +9 : ( 10 ) cmp r4, 2 ;on passe par un registre temporaire +10 : ( 11 12 ) je l2 ;JumpIfEqual 2 +11 : ( 12 ) mov r1, 0 ;Affect +12 : ( 13 ) l2 : cmp r1, 0 ;JumpIfEqual 1 +13 : ( 14 19 ) je l1 ;JumpIfEqual 2 +14 : ( 15 ) mov r5, 1 ;JumpIfEqual 1 +15 : ( 16 ) cmp r5, 0 ;on passe par un registre temporaire +16 : ( 17 19 ) je l1 ;JumpIfEqual 2 +17 : ( 18 ) mov r0, 1 ;Affect +18 : ( 20 ) jmp l0 ;Jump +19 : ( 20 ) l1 : mov r0, 0 ;Affect +20 : ( 21 ) l0 : mov eax, r0 ;Write 1 +21 : ( ) call iprintLF ;Write 2 +22 : ( 23 ) add esp, 0 ;désallocation des variables locales +23 : ( 24 ) pop ebp ;restaure la valeur de ebp +24 : ( ) ret ; diff --git a/test/fg-ref/prio56-2.fg b/test/fg-ref/prio56-2.fg new file mode 100644 index 0000000..bf9bdab --- /dev/null +++ b/test/fg-ref/prio56-2.fg @@ -0,0 +1,25 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r1, 1 ;Affect +8 : ( 9 ) mov r4, 2 ;JumpIfEqual 1 +9 : ( 10 ) cmp r4, 1 ;on passe par un registre temporaire +10 : ( 11 12 ) je l2 ;JumpIfEqual 2 +11 : ( 12 ) mov r1, 0 ;Affect +12 : ( 13 ) l2 : mov r5, 1 ;JumpIfEqual 1 +13 : ( 14 ) cmp r5, 0 ;on passe par un registre temporaire +14 : ( 15 19 ) je l1 ;JumpIfEqual 2 +15 : ( 16 ) cmp r1, 0 ;JumpIfEqual 1 +16 : ( 17 19 ) je l1 ;JumpIfEqual 2 +17 : ( 18 ) mov r0, 1 ;Affect +18 : ( 20 ) jmp l0 ;Jump +19 : ( 20 ) l1 : mov r0, 0 ;Affect +20 : ( 21 ) l0 : mov eax, r0 ;Write 1 +21 : ( ) call iprintLF ;Write 2 +22 : ( 23 ) add esp, 0 ;désallocation des variables locales +23 : ( 24 ) pop ebp ;restaure la valeur de ebp +24 : ( ) ret ; diff --git a/test/fg-ref/prio67-1.fg b/test/fg-ref/prio67-1.fg new file mode 100644 index 0000000..f7a44e6 --- /dev/null +++ b/test/fg-ref/prio67-1.fg @@ -0,0 +1,29 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r4, 0 ;JumpIfEqual 1 +8 : ( 9 ) cmp r4, 0 ;on passe par un registre temporaire +9 : ( 10 15 ) je l3 ;JumpIfEqual 2 +10 : ( 11 ) mov r5, 1 ;JumpIfEqual 1 +11 : ( 12 ) cmp r5, 0 ;on passe par un registre temporaire +12 : ( 13 15 ) je l3 ;JumpIfEqual 2 +13 : ( 14 ) mov r1, 1 ;Affect +14 : ( 16 ) jmp l2 ;Jump +15 : ( 16 ) l3 : mov r1, 0 ;Affect +16 : ( 17 ) l2 : cmp r1, 0 ;jumpIfNotEqual 1 +17 : ( 18 23 ) jne l1 ;jumpIfNotEqual 2 +18 : ( 19 ) mov r6, 1 ;jumpIfNotEqual 1 +19 : ( 20 ) cmp r6, 0 ;on passe par un registre temporaire +20 : ( 21 23 ) jne l1 ;jumpIfNotEqual 2 +21 : ( 22 ) mov r0, 0 ;Affect +22 : ( 24 ) jmp l0 ;Jump +23 : ( 24 ) l1 : mov r0, 1 ;Affect +24 : ( 25 ) l0 : mov eax, r0 ;Write 1 +25 : ( ) call iprintLF ;Write 2 +26 : ( 27 ) add esp, 0 ;désallocation des variables locales +27 : ( 28 ) pop ebp ;restaure la valeur de ebp +28 : ( ) ret ; diff --git a/test/fg-ref/prio67-2.fg b/test/fg-ref/prio67-2.fg new file mode 100644 index 0000000..2d932b7 --- /dev/null +++ b/test/fg-ref/prio67-2.fg @@ -0,0 +1,29 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r4, 1 ;JumpIfEqual 1 +8 : ( 9 ) cmp r4, 0 ;on passe par un registre temporaire +9 : ( 10 15 ) je l3 ;JumpIfEqual 2 +10 : ( 11 ) mov r5, 0 ;JumpIfEqual 1 +11 : ( 12 ) cmp r5, 0 ;on passe par un registre temporaire +12 : ( 13 15 ) je l3 ;JumpIfEqual 2 +13 : ( 14 ) mov r1, 1 ;Affect +14 : ( 16 ) jmp l2 ;Jump +15 : ( 16 ) l3 : mov r1, 0 ;Affect +16 : ( 17 ) l2 : mov r6, 1 ;jumpIfNotEqual 1 +17 : ( 18 ) cmp r6, 0 ;on passe par un registre temporaire +18 : ( 19 23 ) jne l1 ;jumpIfNotEqual 2 +19 : ( 20 ) cmp r1, 0 ;jumpIfNotEqual 1 +20 : ( 21 23 ) jne l1 ;jumpIfNotEqual 2 +21 : ( 22 ) mov r0, 0 ;Affect +22 : ( 24 ) jmp l0 ;Jump +23 : ( 24 ) l1 : mov r0, 1 ;Affect +24 : ( 25 ) l0 : mov eax, r0 ;Write 1 +25 : ( ) call iprintLF ;Write 2 +26 : ( 27 ) add esp, 0 ;désallocation des variables locales +27 : ( 28 ) pop ebp ;restaure la valeur de ebp +28 : ( ) ret ; diff --git a/test/fg-ref/rec1.fg b/test/fg-ref/rec1.fg new file mode 100644 index 0000000..755d8ec --- /dev/null +++ b/test/fg-ref/rec1.fg @@ -0,0 +1,73 @@ +0 : ( 1 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +1 : ( 2 ) call main ; +2 : ( 3 ) pop r0 ;récupération de la valeur de retour +3 : ( 4 ) mov ebx, 0 ; valeur de retour du programme +4 : ( 5 ) mov eax, 1 ; code de sortie +5 : ( 6 ) int 0x80 ; +6 : ( 7 ) f : push ebp ;sauvegarde la valeur de ebp +7 : ( 8 ) mov ebp, esp ;nouvelle valeur de ebp +8 : ( 9 ) push eax ;sauvegarde de eax +9 : ( 10 ) push ebx ;sauvegarde de ebx +10 : ( 11 ) push ecx ;sauvegarde de ecx +11 : ( 12 ) push edx ;sauvegarde de edx +12 : ( 13 ) sub esp, 0 ;allocation des variables locales +13 : ( 14 ) mov r1, 1 ;Affect +14 : ( 15 ) cmp dword [ebp+12], 1 ;JumpIfEqual 1 +15 : ( 16 17 ) je l2 ;JumpIfEqual 2 +16 : ( 17 ) mov r1, 0 ;Affect +17 : ( 18 ) l2 : cmp r1, 0 ;JumpIfEqual 1 +18 : ( 19 28 ) je l0 ;JumpIfEqual 2 +19 : ( 20 ) mov dword [ebp+8], 1 ;ecriture de la valeur de retour +20 : ( 21 ) add esp, 0 ;désallocation des variables locales +21 : ( 22 ) pop edx ;restaure edx +22 : ( 23 ) pop ecx ;restaure ecx +23 : ( 24 ) pop ebx ;restaure ebx +24 : ( 25 ) pop eax ;restaure eax +25 : ( 26 ) pop ebp ;restaure la valeur de ebp +26 : ( ) ret ; +27 : ( 45 ) jmp l1 ;Jump +28 : ( 29 ) l0 : mov r3, dword [ebp+12] ; +29 : ( 30 ) sub r3, 1 ; +30 : ( 31 ) push r3 ;Param +31 : ( 32 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +32 : ( 33 ) call f ; +33 : ( 34 ) pop r2 ;récupération de la valeur de retour +34 : ( 35 ) add esp, 4 ;désallocation des arguments +35 : ( 36 ) mov r4, 1 ; +36 : ( 37 ) add r4, r2 ; +37 : ( 38 ) mov dword [ebp+8], r4 ;ecriture de la valeur de retour +38 : ( 39 ) add esp, 0 ;désallocation des variables locales +39 : ( 40 ) pop edx ;restaure edx +40 : ( 41 ) pop ecx ;restaure ecx +41 : ( 42 ) pop ebx ;restaure ebx +42 : ( 43 ) pop eax ;restaure eax +43 : ( 44 ) pop ebp ;restaure la valeur de ebp +44 : ( ) ret ; +45 : ( 46 ) l1 : add esp, 0 ;désallocation des variables locales +46 : ( 47 ) pop edx ;restaure edx +47 : ( 48 ) pop ecx ;restaure ecx +48 : ( 49 ) pop ebx ;restaure ebx +49 : ( 50 ) pop eax ;restaure eax +50 : ( 51 ) pop ebp ;restaure la valeur de ebp +51 : ( ) ret ; +52 : ( 53 ) main : push ebp ;sauvegarde la valeur de ebp +53 : ( 54 ) mov ebp, esp ;nouvelle valeur de ebp +54 : ( 55 ) push eax ;sauvegarde de eax +55 : ( 56 ) push ebx ;sauvegarde de ebx +56 : ( 57 ) push ecx ;sauvegarde de ecx +57 : ( 58 ) push edx ;sauvegarde de edx +58 : ( 59 ) sub esp, 0 ;allocation des variables locales +59 : ( 60 ) push 100 ;Param +60 : ( 61 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +61 : ( 62 ) call f ; +62 : ( 63 ) pop r5 ;récupération de la valeur de retour +63 : ( 64 ) add esp, 4 ;désallocation des arguments +64 : ( 65 ) mov eax, r5 ;Write 1 +65 : ( 66 ) call iprintLF ;Write 2 +66 : ( 67 ) add esp, 0 ;désallocation des variables locales +67 : ( 68 ) pop edx ;restaure edx +68 : ( 69 ) pop ecx ;restaure ecx +69 : ( 70 ) pop ebx ;restaure ebx +70 : ( 71 ) pop eax ;restaure eax +71 : ( 72 ) pop ebp ;restaure la valeur de ebp +72 : ( ) ret ; diff --git a/test/fg-ref/si1.fg b/test/fg-ref/si1.fg new file mode 100644 index 0000000..d613104 --- /dev/null +++ b/test/fg-ref/si1.fg @@ -0,0 +1,15 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r2, 1 ;JumpIfEqual 1 +8 : ( 9 ) cmp r2, 0 ;on passe par un registre temporaire +9 : ( 10 12 ) je l1 ;JumpIfEqual 2 +10 : ( 11 ) mov eax, 1 ;Write 1 +11 : ( ) call iprintLF ;Write 2 +12 : ( 13 ) l1 : add esp, 0 ;désallocation des variables locales +13 : ( 14 ) pop ebp ;restaure la valeur de ebp +14 : ( ) ret ; diff --git a/test/fg-ref/si2.fg b/test/fg-ref/si2.fg new file mode 100644 index 0000000..80160c1 --- /dev/null +++ b/test/fg-ref/si2.fg @@ -0,0 +1,18 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r2, 0 ;JumpIfEqual 1 +8 : ( 9 ) cmp r2, 0 ;on passe par un registre temporaire +9 : ( 10 13 ) je l0 ;JumpIfEqual 2 +10 : ( 11 ) mov eax, 1 ;Write 1 +11 : ( ) call iprintLF ;Write 2 +12 : ( 15 ) jmp l1 ;Jump +13 : ( 14 ) l0 : mov eax, 0 ;Write 1 +14 : ( ) call iprintLF ;Write 2 +15 : ( 16 ) l1 : add esp, 0 ;désallocation des variables locales +16 : ( 17 ) pop ebp ;restaure la valeur de ebp +17 : ( ) ret ; diff --git a/test/fg-ref/si3.fg b/test/fg-ref/si3.fg new file mode 100644 index 0000000..4a59086 --- /dev/null +++ b/test/fg-ref/si3.fg @@ -0,0 +1,20 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r2, 1 ;JumpIfEqual 1 +8 : ( 9 ) cmp r2, 0 ;on passe par un registre temporaire +9 : ( 10 13 ) je l0 ;JumpIfEqual 2 +10 : ( 11 ) mov eax, 1 ;Write 1 +11 : ( ) call iprintLF ;Write 2 +12 : ( 15 ) jmp l1 ;Jump +13 : ( 14 ) l0 : mov eax, 0 ;Write 1 +14 : ( ) call iprintLF ;Write 2 +15 : ( 16 ) l1 : mov eax, 3 ;Write 1 +16 : ( ) call iprintLF ;Write 2 +17 : ( 18 ) add esp, 0 ;désallocation des variables locales +18 : ( 19 ) pop ebp ;restaure la valeur de ebp +19 : ( ) ret ; diff --git a/test/fg-ref/si4.fg b/test/fg-ref/si4.fg new file mode 100644 index 0000000..887ca37 --- /dev/null +++ b/test/fg-ref/si4.fg @@ -0,0 +1,20 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r2, 0 ;JumpIfEqual 1 +8 : ( 9 ) cmp r2, 0 ;on passe par un registre temporaire +9 : ( 10 13 ) je l0 ;JumpIfEqual 2 +10 : ( 11 ) mov eax, 1 ;Write 1 +11 : ( ) call iprintLF ;Write 2 +12 : ( 15 ) jmp l1 ;Jump +13 : ( 14 ) l0 : mov eax, 0 ;Write 1 +14 : ( ) call iprintLF ;Write 2 +15 : ( 16 ) l1 : mov eax, 3 ;Write 1 +16 : ( ) call iprintLF ;Write 2 +17 : ( 18 ) add esp, 0 ;désallocation des variables locales +18 : ( 19 ) pop ebp ;restaure la valeur de ebp +19 : ( ) ret ; diff --git a/test/fg-ref/si5.fg b/test/fg-ref/si5.fg new file mode 100644 index 0000000..db829b9 --- /dev/null +++ b/test/fg-ref/si5.fg @@ -0,0 +1,32 @@ +0 : ( 1 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +1 : ( 2 ) call main ; +2 : ( 3 ) pop r0 ;récupération de la valeur de retour +3 : ( 4 ) mov ebx, 0 ; valeur de retour du programme +4 : ( 5 ) mov eax, 1 ; code de sortie +5 : ( 6 ) int 0x80 ; +6 : ( 7 ) main : push ebp ;sauvegarde la valeur de ebp +7 : ( 8 ) mov ebp, esp ;nouvelle valeur de ebp +8 : ( 9 ) push eax ;sauvegarde de eax +9 : ( 10 ) push ebx ;sauvegarde de ebx +10 : ( 11 ) push ecx ;sauvegarde de ecx +11 : ( 12 ) push edx ;sauvegarde de edx +12 : ( 13 ) sub esp, 0 ;allocation des variables locales +13 : ( 14 ) mov r7, 1 ;JumpIfEqual 1 +14 : ( 15 ) cmp r7, 0 ;on passe par un registre temporaire +15 : ( 16 23 ) je l3 ;JumpIfEqual 2 +16 : ( 17 ) mov eax, 1 ;Write 1 +17 : ( 18 ) call iprintLF ;Write 2 +18 : ( 19 ) mov r9, 1 ;JumpIfEqual 1 +19 : ( 20 ) cmp r9, 0 ;on passe par un registre temporaire +20 : ( 21 23 ) je l3 ;JumpIfEqual 2 +21 : ( 22 ) mov eax, 2 ;Write 1 +22 : ( 23 ) call iprintLF ;Write 2 +23 : ( 24 ) l3 : mov eax, 3 ;Write 1 +24 : ( 25 ) call iprintLF ;Write 2 +25 : ( 26 ) add esp, 0 ;désallocation des variables locales +26 : ( 27 ) pop edx ;restaure edx +27 : ( 28 ) pop ecx ;restaure ecx +28 : ( 29 ) pop ebx ;restaure ebx +29 : ( 30 ) pop eax ;restaure eax +30 : ( 31 ) pop ebp ;restaure la valeur de ebp +31 : ( ) ret ; diff --git a/test/fg-ref/sub1.fg b/test/fg-ref/sub1.fg new file mode 100644 index 0000000..e208bab --- /dev/null +++ b/test/fg-ref/sub1.fg @@ -0,0 +1,14 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 10 ; +8 : ( 9 ) sub r0, 5 ; +9 : ( 10 ) mov eax, r0 ;Write 1 +10 : ( ) call iprintLF ;Write 2 +11 : ( 12 ) add esp, 0 ;désallocation des variables locales +12 : ( 13 ) pop ebp ;restaure la valeur de ebp +13 : ( ) ret ; diff --git a/test/fg-ref/sub2.fg b/test/fg-ref/sub2.fg new file mode 100644 index 0000000..d9faa90 --- /dev/null +++ b/test/fg-ref/sub2.fg @@ -0,0 +1,14 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 7 ; +8 : ( 9 ) sub r0, 20 ; +9 : ( 10 ) mov eax, r0 ;Write 1 +10 : ( ) call iprintLF ;Write 2 +11 : ( 12 ) add esp, 0 ;désallocation des variables locales +12 : ( 13 ) pop ebp ;restaure la valeur de ebp +13 : ( ) ret ; diff --git a/test/fg-ref/sub3.fg b/test/fg-ref/sub3.fg new file mode 100644 index 0000000..4d4b04e --- /dev/null +++ b/test/fg-ref/sub3.fg @@ -0,0 +1,16 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r0, 2 ; +8 : ( 9 ) sub r0, 1 ; +9 : ( 10 ) mov r1, r0 ; +10 : ( 11 ) sub r1, 1 ; +11 : ( 12 ) mov eax, r1 ;Write 1 +12 : ( ) call iprintLF ;Write 2 +13 : ( 14 ) add esp, 0 ;désallocation des variables locales +14 : ( 15 ) pop ebp ;restaure la valeur de ebp +15 : ( ) ret ; diff --git a/test/fg-ref/tab1.fg b/test/fg-ref/tab1.fg new file mode 100644 index 0000000..abbe0a1 --- /dev/null +++ b/test/fg-ref/tab1.fg @@ -0,0 +1,25 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r2, 0 ; +8 : ( 9 ) mov dword [tab+4*r2], 0 ;Affect +9 : ( 10 ) mov r3, 1 ; +10 : ( 11 ) mov dword [tab+4*r3], 1 ;Affect +11 : ( 12 ) mov r4, 2 ; +12 : ( 13 ) mov dword [tab+4*r4], 2 ;Affect +13 : ( 14 ) mov r6, 0 ; +14 : ( 15 ) mov eax, dword [tab+4*r6] ;Write 1 +15 : ( ) call iprintLF ;Write 2 +16 : ( 17 ) mov r8, 1 ; +17 : ( 18 ) mov eax, dword [tab+4*r8] ;Write 1 +18 : ( ) call iprintLF ;Write 2 +19 : ( 20 ) mov r10, 2 ; +20 : ( 21 ) mov eax, dword [tab+4*r10] ;Write 1 +21 : ( ) call iprintLF ;Write 2 +22 : ( 23 ) add esp, 0 ;désallocation des variables locales +23 : ( 24 ) pop ebp ;restaure la valeur de ebp +24 : ( ) ret ; diff --git a/test/fg-ref/tab2.fg b/test/fg-ref/tab2.fg new file mode 100644 index 0000000..ec81509 --- /dev/null +++ b/test/fg-ref/tab2.fg @@ -0,0 +1,32 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 4 ;allocation des variables locales +7 : ( 8 ) mov dword [ebp-4*1], 2 ;Affect +8 : ( 9 ) mov r0, dword [ebp-4*1] ; +9 : ( 10 ) add r0, 0 ; +10 : ( 11 ) mov r5, r0 ; +11 : ( 12 ) mov dword [tab+4*r5], 34 ;Affect +12 : ( 13 ) mov r1, dword [ebp-4*1] ; +13 : ( 14 ) add r1, 1 ; +14 : ( 15 ) mov r6, r1 ; +15 : ( 16 ) mov dword [tab+4*r6], 74 ;Affect +16 : ( 17 ) mov r2, dword [ebp-4*1] ; +17 : ( 18 ) add r2, 2 ; +18 : ( 19 ) mov r7, r2 ; +19 : ( 20 ) mov dword [tab+4*r7], 16 ;Affect +20 : ( 21 ) mov r9, 2 ; +21 : ( 22 ) mov eax, dword [tab+4*r9] ;Write 1 +22 : ( ) call iprintLF ;Write 2 +23 : ( 24 ) mov r11, 3 ; +24 : ( 25 ) mov eax, dword [tab+4*r11] ;Write 1 +25 : ( ) call iprintLF ;Write 2 +26 : ( 27 ) mov r13, 4 ; +27 : ( 28 ) mov eax, dword [tab+4*r13] ;Write 1 +28 : ( ) call iprintLF ;Write 2 +29 : ( 30 ) add esp, 4 ;désallocation des variables locales +30 : ( 31 ) pop ebp ;restaure la valeur de ebp +31 : ( ) ret ; diff --git a/test/fg-ref/tab3.fg b/test/fg-ref/tab3.fg new file mode 100644 index 0000000..fc912f6 --- /dev/null +++ b/test/fg-ref/tab3.fg @@ -0,0 +1,35 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 8 ;allocation des variables locales +7 : ( 8 ) mov dword [ebp-4*1], 2 ;Affect +8 : ( 9 ) mov dword [ebp-4*2], 0 ;Affect +9 : ( 10 ) mov r0, dword [ebp-4*1] ; +10 : ( 11 ) add r0, dword [ebp-4*2] ; +11 : ( 12 ) mov r5, r0 ; +12 : ( 13 ) mov dword [tab+4*r5], 34 ;Affect +13 : ( 14 ) mov dword [ebp-4*2], 1 ;Affect +14 : ( 15 ) mov r1, dword [ebp-4*1] ; +15 : ( 16 ) add r1, dword [ebp-4*2] ; +16 : ( 17 ) mov r6, r1 ; +17 : ( 18 ) mov dword [tab+4*r6], 74 ;Affect +18 : ( 19 ) mov dword [ebp-4*2], 2 ;Affect +19 : ( 20 ) mov r2, dword [ebp-4*1] ; +20 : ( 21 ) add r2, dword [ebp-4*2] ; +21 : ( 22 ) mov r7, r2 ; +22 : ( 23 ) mov dword [tab+4*r7], 16 ;Affect +23 : ( 24 ) mov r9, 2 ; +24 : ( 25 ) mov eax, dword [tab+4*r9] ;Write 1 +25 : ( ) call iprintLF ;Write 2 +26 : ( 27 ) mov r11, 3 ; +27 : ( 28 ) mov eax, dword [tab+4*r11] ;Write 1 +28 : ( ) call iprintLF ;Write 2 +29 : ( 30 ) mov r13, 4 ; +30 : ( 31 ) mov eax, dword [tab+4*r13] ;Write 1 +31 : ( ) call iprintLF ;Write 2 +32 : ( 33 ) add esp, 8 ;désallocation des variables locales +33 : ( 34 ) pop ebp ;restaure la valeur de ebp +34 : ( ) ret ; diff --git a/test/fg-ref/tab4.fg b/test/fg-ref/tab4.fg new file mode 100644 index 0000000..20eaf9b --- /dev/null +++ b/test/fg-ref/tab4.fg @@ -0,0 +1,29 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov r3, 0 ; +8 : ( 9 ) mov dword [tab+4*r3], 1 ;Affect +9 : ( 10 ) mov r5, 0 ; +10 : ( 11 ) mov r4, dword [tab+4*r5] ; +11 : ( 12 ) mov dword [tab+4*r4], 12 ;Affect +12 : ( 13 ) mov r6, 0 ; +13 : ( 14 ) mov r0, dword [tab+4*r6] ; +14 : ( 15 ) add r0, 1 ; +15 : ( 16 ) mov r7, r0 ; +16 : ( 17 ) mov dword [tab+4*r7], 13 ;Affect +17 : ( 18 ) mov r9, 0 ; +18 : ( 19 ) mov eax, dword [tab+4*r9] ;Write 1 +19 : ( ) call iprintLF ;Write 2 +20 : ( 21 ) mov r11, 1 ; +21 : ( 22 ) mov eax, dword [tab+4*r11] ;Write 1 +22 : ( ) call iprintLF ;Write 2 +23 : ( 24 ) mov r13, 2 ; +24 : ( 25 ) mov eax, dword [tab+4*r13] ;Write 1 +25 : ( ) call iprintLF ;Write 2 +26 : ( 27 ) add esp, 0 ;désallocation des variables locales +27 : ( 28 ) pop ebp ;restaure la valeur de ebp +28 : ( ) ret ; diff --git a/test/fg-ref/tantque1.fg b/test/fg-ref/tantque1.fg new file mode 100644 index 0000000..55ad059 --- /dev/null +++ b/test/fg-ref/tantque1.fg @@ -0,0 +1,26 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 4 ;allocation des variables locales +7 : ( 8 ) mov dword [ebp-4*1], 10 ;Affect +8 : ( 9 ) l0 : mov r0, 1 ;Affect +9 : ( 10 ) mov r4, 0 ;JumpIfLess 1 +10 : ( 11 ) cmp r4, dword [ebp-4*1] ;on passe par un registre temporaire +11 : ( 12 13 ) jl l2 ;JumpIfLess 2 +12 : ( 13 ) mov r0, 0 ;Affect +13 : ( 14 ) l2 : cmp r0, 0 ;JumpIfEqual 1 +14 : ( 15 21 ) je l1 ;JumpIfEqual 2 +15 : ( 16 ) mov eax, dword [ebp-4*1] ;Write 1 +16 : ( ) call iprintLF ;Write 2 +17 : ( 18 ) mov r1, dword [ebp-4*1] ; +18 : ( 19 ) sub r1, 1 ; +19 : ( 20 ) mov dword [ebp-4*1], r1 ;Affect +20 : ( 8 ) jmp l0 ;Jump +21 : ( 22 ) l1 : mov eax, 0 ;Write 1 +22 : ( ) call iprintLF ;Write 2 +23 : ( 24 ) add esp, 4 ;désallocation des variables locales +24 : ( 25 ) pop ebp ;restaure la valeur de ebp +25 : ( ) ret ; diff --git a/test/fg-ref/tantque2.fg b/test/fg-ref/tantque2.fg new file mode 100644 index 0000000..2c74761 --- /dev/null +++ b/test/fg-ref/tantque2.fg @@ -0,0 +1,36 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 8 ;allocation des variables locales +7 : ( 8 ) mov dword [ebp-4*1], 0 ;Affect +8 : ( 9 ) l0 : mov r0, 1 ;Affect +9 : ( 10 ) cmp dword [ebp-4*1], 4 ;JumpIfLess 1 +10 : ( 11 12 ) jl l2 ;JumpIfLess 2 +11 : ( 12 ) mov r0, 0 ;Affect +12 : ( 13 ) l2 : cmp r0, 0 ;JumpIfEqual 1 +13 : ( 14 33 ) je l1 ;JumpIfEqual 2 +14 : ( 15 ) mov dword [ebp-4*2], 0 ;Affect +15 : ( 16 ) l3 : mov r1, 1 ;Affect +16 : ( 17 ) cmp dword [ebp-4*2], 4 ;JumpIfLess 1 +17 : ( 18 19 ) jl l5 ;JumpIfLess 2 +18 : ( 19 ) mov r1, 0 ;Affect +19 : ( 20 ) l5 : cmp r1, 0 ;JumpIfEqual 1 +20 : ( 21 29 ) je l4 ;JumpIfEqual 2 +21 : ( 22 ) mov eax, dword [ebp-4*1] ;Write 1 +22 : ( ) call iprintLF ;Write 2 +23 : ( 24 ) mov eax, dword [ebp-4*2] ;Write 1 +24 : ( ) call iprintLF ;Write 2 +25 : ( 26 ) mov r2, dword [ebp-4*2] ; +26 : ( 27 ) add r2, 1 ; +27 : ( 28 ) mov dword [ebp-4*2], r2 ;Affect +28 : ( 15 ) jmp l3 ;Jump +29 : ( 30 ) l4 : mov r3, dword [ebp-4*1] ; +30 : ( 31 ) add r3, 1 ; +31 : ( 32 ) mov dword [ebp-4*1], r3 ;Affect +32 : ( 8 ) jmp l0 ;Jump +33 : ( 34 ) l1 : add esp, 8 ;désallocation des variables locales +34 : ( 35 ) pop ebp ;restaure la valeur de ebp +35 : ( ) ret ; diff --git a/test/fg-ref/varglob1.fg b/test/fg-ref/varglob1.fg new file mode 100644 index 0000000..d577f3c --- /dev/null +++ b/test/fg-ref/varglob1.fg @@ -0,0 +1,13 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov dword [variable], 6834 ;Affect +8 : ( 9 ) mov eax, dword [variable] ;Write 1 +9 : ( ) call iprintLF ;Write 2 +10 : ( 11 ) add esp, 0 ;désallocation des variables locales +11 : ( 12 ) pop ebp ;restaure la valeur de ebp +12 : ( ) ret ; diff --git a/test/fg-ref/varglob2.fg b/test/fg-ref/varglob2.fg new file mode 100644 index 0000000..5dff65a --- /dev/null +++ b/test/fg-ref/varglob2.fg @@ -0,0 +1,15 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov dword [variable], 10 ;Affect +8 : ( 9 ) mov r0, dword [variable] ; +9 : ( 10 ) add r0, 50 ; +10 : ( 11 ) mov eax, r0 ;Write 1 +11 : ( ) call iprintLF ;Write 2 +12 : ( 13 ) add esp, 0 ;désallocation des variables locales +13 : ( 14 ) pop ebp ;restaure la valeur de ebp +14 : ( ) ret ; diff --git a/test/fg-ref/varglob3.fg b/test/fg-ref/varglob3.fg new file mode 100644 index 0000000..869643f --- /dev/null +++ b/test/fg-ref/varglob3.fg @@ -0,0 +1,16 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov dword [var1], 10 ;Affect +8 : ( 9 ) mov dword [var2], 34 ;Affect +9 : ( 10 ) mov eax, dword [var1] ;Write 1 +10 : ( ) call iprintLF ;Write 2 +11 : ( 12 ) mov eax, dword [var2] ;Write 1 +12 : ( ) call iprintLF ;Write 2 +13 : ( 14 ) add esp, 0 ;désallocation des variables locales +14 : ( 15 ) pop ebp ;restaure la valeur de ebp +15 : ( ) ret ; diff --git a/test/fg-ref/varglob4.fg b/test/fg-ref/varglob4.fg new file mode 100644 index 0000000..e020f56 --- /dev/null +++ b/test/fg-ref/varglob4.fg @@ -0,0 +1,16 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 0 ;allocation des variables locales +7 : ( 8 ) mov dword [var1], 10 ;Affect +8 : ( 9 ) mov dword [var2], 34 ;Affect +9 : ( 10 ) mov r0, dword [var1] ; +10 : ( 11 ) add r0, dword [var2] ; +11 : ( 12 ) mov eax, r0 ;Write 1 +12 : ( ) call iprintLF ;Write 2 +13 : ( 14 ) add esp, 0 ;désallocation des variables locales +14 : ( 15 ) pop ebp ;restaure la valeur de ebp +15 : ( ) ret ; diff --git a/test/fg-ref/varloc1.fg b/test/fg-ref/varloc1.fg new file mode 100644 index 0000000..292336d --- /dev/null +++ b/test/fg-ref/varloc1.fg @@ -0,0 +1,13 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 4 ;allocation des variables locales +7 : ( 8 ) mov dword [ebp-4*1], 6834 ;Affect +8 : ( 9 ) mov eax, dword [ebp-4*1] ;Write 1 +9 : ( ) call iprintLF ;Write 2 +10 : ( 11 ) add esp, 4 ;désallocation des variables locales +11 : ( 12 ) pop ebp ;restaure la valeur de ebp +12 : ( ) ret ; diff --git a/test/fg-ref/varloc2.fg b/test/fg-ref/varloc2.fg new file mode 100644 index 0000000..6e14583 --- /dev/null +++ b/test/fg-ref/varloc2.fg @@ -0,0 +1,15 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 4 ;allocation des variables locales +7 : ( 8 ) mov dword [ebp-4*1], 10 ;Affect +8 : ( 9 ) mov r0, dword [ebp-4*1] ; +9 : ( 10 ) add r0, 50 ; +10 : ( 11 ) mov eax, r0 ;Write 1 +11 : ( ) call iprintLF ;Write 2 +12 : ( 13 ) add esp, 4 ;désallocation des variables locales +13 : ( 14 ) pop ebp ;restaure la valeur de ebp +14 : ( ) ret ; diff --git a/test/fg-ref/varloc3.fg b/test/fg-ref/varloc3.fg new file mode 100644 index 0000000..6d47bc1 --- /dev/null +++ b/test/fg-ref/varloc3.fg @@ -0,0 +1,16 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 8 ;allocation des variables locales +7 : ( 8 ) mov dword [ebp-4*1], 10 ;Affect +8 : ( 9 ) mov dword [ebp-4*2], 30 ;Affect +9 : ( 10 ) mov eax, dword [ebp-4*1] ;Write 1 +10 : ( ) call iprintLF ;Write 2 +11 : ( 12 ) mov eax, dword [ebp-4*2] ;Write 1 +12 : ( ) call iprintLF ;Write 2 +13 : ( 14 ) add esp, 8 ;désallocation des variables locales +14 : ( 15 ) pop ebp ;restaure la valeur de ebp +15 : ( ) ret ; diff --git a/test/fg-ref/varloc4.fg b/test/fg-ref/varloc4.fg new file mode 100644 index 0000000..d35e291 --- /dev/null +++ b/test/fg-ref/varloc4.fg @@ -0,0 +1,16 @@ +0 : ( 4 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) main : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 8 ;allocation des variables locales +7 : ( 8 ) mov dword [ebp-4*1], 10 ;Affect +8 : ( 9 ) mov dword [ebp-4*2], 30 ;Affect +9 : ( 10 ) mov r0, dword [ebp-4*1] ; +10 : ( 11 ) add r0, dword [ebp-4*2] ; +11 : ( 12 ) mov eax, r0 ;Write 1 +12 : ( ) call iprintLF ;Write 2 +13 : ( 14 ) add esp, 8 ;désallocation des variables locales +14 : ( 15 ) pop ebp ;restaure la valeur de ebp +15 : ( ) ret ; diff --git a/test/fg-ref/varloc5.fg b/test/fg-ref/varloc5.fg new file mode 100644 index 0000000..a4a15a3 --- /dev/null +++ b/test/fg-ref/varloc5.fg @@ -0,0 +1,25 @@ +0 : ( 13 ) call main ; +1 : ( 2 ) mov ebx, 0 ; valeur de retour du programme +2 : ( 3 ) mov eax, 1 ; +3 : ( 4 ) int 0x80 ; +4 : ( 5 ) f : push ebp ;sauvegarde la valeur de ebp +5 : ( 6 ) mov ebp, esp ;nouvelle valeur de ebp +6 : ( 7 ) sub esp, 4 ;allocation des variables locales +7 : ( 8 ) mov dword [ebp-4*1], 10 ;Affect +8 : ( 9 ) mov eax, dword [ebp-4*1] ;Write 1 +9 : ( ) call iprintLF ;Write 2 +10 : ( 11 ) add esp, 4 ;désallocation des variables locales +11 : ( 12 ) pop ebp ;restaure la valeur de ebp +12 : ( 13 ) ret ; +13 : ( 14 ) main : push ebp ;sauvegarde la valeur de ebp +14 : ( 15 ) mov ebp, esp ;nouvelle valeur de ebp +15 : ( 16 ) sub esp, 0 ;allocation des variables locales +16 : ( 17 ) mov dword [var1], 20 ;Affect +17 : ( 18 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +18 : ( 4 ) call f ; +19 : ( 20 ) pop r0 ;récupération de la valeur de retour +20 : ( 21 ) mov eax, dword [var1] ;Write 1 +21 : ( ) call iprintLF ;Write 2 +22 : ( 23 ) add esp, 0 ;désallocation des variables locales +23 : ( 24 ) pop ebp ;restaure la valeur de ebp +24 : ( ) ret ; diff --git a/test/fgs-ref/add1.fgs b/test/fgs-ref/add1.fgs new file mode 100644 index 0000000..17c0fa4 --- /dev/null +++ b/test/fgs-ref/add1.fgs @@ -0,0 +1,15 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 3 ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) add r0, 10 ; +use = (0 ) def = (3 ) in = (0 ) out = () mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/add2.fgs b/test/fgs-ref/add2.fgs new file mode 100644 index 0000000..d8a2e66 --- /dev/null +++ b/test/fgs-ref/add2.fgs @@ -0,0 +1,17 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 2 ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) add r0, 4 ; +use = (0 ) def = (1 ) in = (0 ) out = (1 ) mov r1, r0 ; +use = (1 ) def = (1 ) in = (1 ) out = (1 ) add r1, 8 ; +use = (1 ) def = (4 ) in = (1 ) out = () mov eax, r1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/affect1.fgs b/test/fgs-ref/affect1.fgs new file mode 100644 index 0000000..859a4d2 --- /dev/null +++ b/test/fgs-ref/affect1.fgs @@ -0,0 +1,14 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (1 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () mov dword [a], 1 ;Affect +use = () def = (2 ) in = () out = () mov eax, dword [a] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/affect2.fgs b/test/fgs-ref/affect2.fgs new file mode 100644 index 0000000..b254e12 --- /dev/null +++ b/test/fgs-ref/affect2.fgs @@ -0,0 +1,14 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (1 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 4 ;allocation des variables locales +use = () def = () in = () out = () mov dword [ebp-4*1], 1 ;Affect +use = () def = (2 ) in = () out = () mov eax, dword [ebp-4*1] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 4 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/affect3.fgs b/test/fgs-ref/affect3.fgs new file mode 100644 index 0000000..82b824f --- /dev/null +++ b/test/fgs-ref/affect3.fgs @@ -0,0 +1,25 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () f : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () mov dword [ebp+4*3], 1 ;Affect +use = () def = (3 ) in = () out = () mov eax, dword [ebp+4*3] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 4 ;allocation des variables locales +use = () def = () in = () out = () push 3 ;Param +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call f ; +use = () def = (0 ) in = () out = () pop r0 ;récupération de la valeur de retour +use = () def = () in = () out = () add esp, 4 ;désallocation des arguments +use = () def = () in = () out = () add esp, 4 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/and1.fgs b/test/fgs-ref/and1.fgs new file mode 100644 index 0000000..6939350 --- /dev/null +++ b/test/fgs-ref/and1.fgs @@ -0,0 +1,22 @@ +iter num = 5 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = () out = (3 ) mov r3, 3 ;JumpIfEqual 1 +use = (3 ) def = () in = (3 ) out = () cmp r3, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = (4 ) in = () out = (4 ) mov r4, 1 ;JumpIfEqual 1 +use = (4 ) def = () in = (4 ) out = () cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = () in = (0 ) out = (0 ) jmp l0 ;Jump +use = () def = (0 ) in = () out = (0 ) l1 : mov r0, 0 ;Affect +use = (0 ) def = (5 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/and2.fgs b/test/fgs-ref/and2.fgs new file mode 100644 index 0000000..d0cb5b7 --- /dev/null +++ b/test/fgs-ref/and2.fgs @@ -0,0 +1,22 @@ +iter num = 5 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = () out = (3 ) mov r3, 4 ;JumpIfEqual 1 +use = (3 ) def = () in = (3 ) out = () cmp r3, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = (4 ) in = () out = (4 ) mov r4, 0 ;JumpIfEqual 1 +use = (4 ) def = () in = (4 ) out = () cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = () in = (0 ) out = (0 ) jmp l0 ;Jump +use = () def = (0 ) in = () out = (0 ) l1 : mov r0, 0 ;Affect +use = (0 ) def = (5 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/and3.fgs b/test/fgs-ref/and3.fgs new file mode 100644 index 0000000..6ce5107 --- /dev/null +++ b/test/fgs-ref/and3.fgs @@ -0,0 +1,22 @@ +iter num = 5 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = () out = (3 ) mov r3, 0 ;JumpIfEqual 1 +use = (3 ) def = () in = (3 ) out = () cmp r3, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = (4 ) in = () out = (4 ) mov r4, 1024 ;JumpIfEqual 1 +use = (4 ) def = () in = (4 ) out = () cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = () in = (0 ) out = (0 ) jmp l0 ;Jump +use = () def = (0 ) in = () out = (0 ) l1 : mov r0, 0 ;Affect +use = (0 ) def = (5 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/and4.fgs b/test/fgs-ref/and4.fgs new file mode 100644 index 0000000..a83cb5a --- /dev/null +++ b/test/fgs-ref/and4.fgs @@ -0,0 +1,22 @@ +iter num = 5 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = () out = (3 ) mov r3, 0 ;JumpIfEqual 1 +use = (3 ) def = () in = (3 ) out = () cmp r3, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = (4 ) in = () out = (4 ) mov r4, 0 ;JumpIfEqual 1 +use = (4 ) def = () in = (4 ) out = () cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = () in = (0 ) out = (0 ) jmp l0 ;Jump +use = () def = (0 ) in = () out = (0 ) l1 : mov r0, 0 ;Affect +use = (0 ) def = (5 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/and5.fgs b/test/fgs-ref/and5.fgs new file mode 100644 index 0000000..b0d28d2 --- /dev/null +++ b/test/fgs-ref/and5.fgs @@ -0,0 +1,30 @@ +iter num = 5 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (4 ) in = () out = (4 ) mov r4, 1 ;JumpIfEqual 1 +use = (4 ) def = () in = (4 ) out = () cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l3 ;JumpIfEqual 2 +use = () def = (5 ) in = () out = (5 ) mov r5, 0 ;JumpIfEqual 1 +use = (5 ) def = () in = (5 ) out = () cmp r5, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l3 ;JumpIfEqual 2 +use = () def = (1 ) in = () out = (1 ) mov r1, 1 ;Affect +use = () def = () in = (1 ) out = (1 ) jmp l2 ;Jump +use = () def = (1 ) in = () out = (1 ) l3 : mov r1, 0 ;Affect +use = (1 ) def = () in = (1 ) out = () l2 : cmp r1, 0 ;JumpIfEqual 1 +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = (6 ) in = () out = (6 ) mov r6, 1 ;JumpIfEqual 1 +use = (6 ) def = () in = (6 ) out = () cmp r6, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = () in = (0 ) out = (0 ) jmp l0 ;Jump +use = () def = (0 ) in = () out = (0 ) l1 : mov r0, 0 ;Affect +use = (0 ) def = (7 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/appel-param1.fgs b/test/fgs-ref/appel-param1.fgs new file mode 100644 index 0000000..2e08d57 --- /dev/null +++ b/test/fgs-ref/appel-param1.fgs @@ -0,0 +1,24 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () f : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = () out = () mov eax, dword [ebp+4*3] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () push 1 ;Param +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call f ; +use = () def = (0 ) in = () out = () pop r0 ;récupération de la valeur de retour +use = () def = () in = () out = () add esp, 4 ;désallocation des arguments +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/appel-param2.fgs b/test/fgs-ref/appel-param2.fgs new file mode 100644 index 0000000..2ffaa39 --- /dev/null +++ b/test/fgs-ref/appel-param2.fgs @@ -0,0 +1,27 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () f : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = () out = () mov eax, dword [ebp+4*4] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (4 ) in = () out = () mov eax, dword [ebp+4*3] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () push 1 ;Param +use = () def = () in = () out = () push 456 ;Param +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call f ; +use = () def = (0 ) in = () out = () pop r0 ;récupération de la valeur de retour +use = () def = () in = () out = () add esp, 8 ;désallocation des arguments +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/appel-param3.fgs b/test/fgs-ref/appel-param3.fgs new file mode 100644 index 0000000..3bbb753 --- /dev/null +++ b/test/fgs-ref/appel-param3.fgs @@ -0,0 +1,36 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () f : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = () out = () mov eax, dword [ebp+4*7] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (4 ) in = () out = () mov eax, dword [ebp+4*6] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (5 ) in = () out = () mov eax, dword [ebp+4*5] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (6 ) in = () out = () mov eax, dword [ebp+4*4] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (7 ) in = () out = () mov eax, dword [ebp+4*3] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () push 1 ;Param +use = () def = () in = () out = () push 2 ;Param +use = () def = () in = () out = () push 3 ;Param +use = () def = () in = () out = () push 4 ;Param +use = () def = () in = () out = () push 5 ;Param +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call f ; +use = () def = (0 ) in = () out = () pop r0 ;récupération de la valeur de retour +use = () def = () in = () out = () add esp, 20 ;désallocation des arguments +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/appel-retour1.fgs b/test/fgs-ref/appel-retour1.fgs new file mode 100644 index 0000000..1b39c79 --- /dev/null +++ b/test/fgs-ref/appel-retour1.fgs @@ -0,0 +1,26 @@ +iter num = 5 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () f : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = () out = (3 ) mov r3, dword [ebp+4*3] ;ecriture de la valeur de retour +use = (3 ) def = () in = (3 ) out = () mov dword [ebp+4*2], r3 ;on passe par un registre temporaire +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () push 3712 ;Param +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call f ; +use = () def = (0 ) in = () out = (0 ) pop r0 ;récupération de la valeur de retour +use = () def = () in = (0 ) out = (0 ) add esp, 4 ;désallocation des arguments +use = (0 ) def = (4 ) in = (0 ) out = () mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/appel1.fgs b/test/fgs-ref/appel1.fgs new file mode 100644 index 0000000..9849940 --- /dev/null +++ b/test/fgs-ref/appel1.fgs @@ -0,0 +1,22 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () f : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = () out = () mov eax, 1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call f ; +use = () def = (0 ) in = () out = () pop r0 ;récupération de la valeur de retour +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/appel2.fgs b/test/fgs-ref/appel2.fgs new file mode 100644 index 0000000..3835666 --- /dev/null +++ b/test/fgs-ref/appel2.fgs @@ -0,0 +1,33 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () g : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (4 ) in = () out = () mov eax, 2 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () f : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (5 ) in = () out = () mov eax, 1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call g ; +use = () def = (0 ) in = () out = () pop r0 ;récupération de la valeur de retour +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call f ; +use = () def = (1 ) in = () out = () pop r1 ;récupération de la valeur de retour +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/appel3.fgs b/test/fgs-ref/appel3.fgs new file mode 100644 index 0000000..08f8812 --- /dev/null +++ b/test/fgs-ref/appel3.fgs @@ -0,0 +1,33 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () g : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (4 ) in = () out = () mov eax, 2 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () f : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (5 ) in = () out = () mov eax, 1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call f ; +use = () def = (0 ) in = () out = () pop r0 ;récupération de la valeur de retour +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call g ; +use = () def = (1 ) in = () out = () pop r1 ;récupération de la valeur de retour +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/div1.fgs b/test/fgs-ref/div1.fgs new file mode 100644 index 0000000..d1f1064 --- /dev/null +++ b/test/fgs-ref/div1.fgs @@ -0,0 +1,17 @@ +iter num = 20 +use = () def = () in = (5 ) out = (5 ) call main ; +use = () def = (1 ) in = (5 ) out = (5 ) mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = (5 ) out = (5 ) mov eax, 1 ; +use = () def = () in = (5 ) out = (5 ) int 0x80 ; +use = () def = () in = (5 ) out = (5 ) main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = (5 ) out = (5 ) mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = (5 ) out = (5 ) sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = (5 ) out = (5 ) mov eax, 4 ; +use = () def = (4 ) in = (5 ) out = (4 5 ) mov r4, 2 ; +use = (4 ) def = () in = (4 5 ) out = (5 ) idiv r4 ; +use = (5 ) def = (0 ) in = (5 ) out = (0 ) mov r0, eax ; +use = (0 ) def = (6 ) in = (0 ) out = () mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/div2.fgs b/test/fgs-ref/div2.fgs new file mode 100644 index 0000000..eeaaedb --- /dev/null +++ b/test/fgs-ref/div2.fgs @@ -0,0 +1,17 @@ +iter num = 20 +use = () def = () in = (5 ) out = (5 ) call main ; +use = () def = (1 ) in = (5 ) out = (5 ) mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = (5 ) out = (5 ) mov eax, 1 ; +use = () def = () in = (5 ) out = (5 ) int 0x80 ; +use = () def = () in = (5 ) out = (5 ) main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = (5 ) out = (5 ) mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = (5 ) out = (5 ) sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = (5 ) out = (5 ) mov eax, 0 ; +use = () def = (4 ) in = (5 ) out = (4 5 ) mov r4, 712 ; +use = (4 ) def = () in = (4 5 ) out = (5 ) idiv r4 ; +use = (5 ) def = (0 ) in = (5 ) out = (0 ) mov r0, eax ; +use = (0 ) def = (6 ) in = (0 ) out = () mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/div3.fgs b/test/fgs-ref/div3.fgs new file mode 100644 index 0000000..1fb235a --- /dev/null +++ b/test/fgs-ref/div3.fgs @@ -0,0 +1,21 @@ +iter num = 28 +use = () def = () in = (6 9 ) out = (6 9 ) call main ; +use = () def = (2 ) in = (6 9 ) out = (6 9 ) mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = (6 9 ) out = (6 9 ) mov eax, 1 ; +use = () def = () in = (6 9 ) out = (6 9 ) int 0x80 ; +use = () def = () in = (6 9 ) out = (6 9 ) main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = (6 9 ) out = (6 9 ) mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = (6 9 ) out = (6 9 ) sub esp, 0 ;allocation des variables locales +use = () def = (4 ) in = (6 9 ) out = (6 9 ) mov eax, 4 ; +use = () def = (5 ) in = (6 9 ) out = (5 6 9 ) mov r5, 2 ; +use = (5 ) def = () in = (5 6 9 ) out = (6 9 ) idiv r5 ; +use = (6 ) def = (0 ) in = (6 9 ) out = (0 9 ) mov r0, eax ; +use = (0 ) def = (7 ) in = (0 9 ) out = (9 ) mov eax, r0 ; +use = () def = (8 ) in = (9 ) out = (8 9 ) mov r8, 2 ; +use = (8 ) def = () in = (8 9 ) out = (9 ) idiv r8 ; +use = (9 ) def = (1 ) in = (9 ) out = (1 ) mov r1, eax ; +use = (1 ) def = (10 ) in = (1 ) out = () mov eax, r1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/div4.fgs b/test/fgs-ref/div4.fgs new file mode 100644 index 0000000..388ed25 --- /dev/null +++ b/test/fgs-ref/div4.fgs @@ -0,0 +1,17 @@ +iter num = 20 +use = () def = () in = (5 ) out = (5 ) call main ; +use = () def = (1 ) in = (5 ) out = (5 ) mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = (5 ) out = (5 ) mov eax, 1 ; +use = () def = () in = (5 ) out = (5 ) int 0x80 ; +use = () def = () in = (5 ) out = (5 ) main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = (5 ) out = (5 ) mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = (5 ) out = (5 ) sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = (5 ) out = (5 ) mov eax, 2 ; +use = () def = (4 ) in = (5 ) out = (4 5 ) mov r4, 3 ; +use = (4 ) def = () in = (4 5 ) out = (5 ) idiv r4 ; +use = (5 ) def = (0 ) in = (5 ) out = (0 ) mov r0, eax ; +use = (0 ) def = (6 ) in = (0 ) out = () mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/ecrire1.fgs b/test/fgs-ref/ecrire1.fgs new file mode 100644 index 0000000..b592fbb --- /dev/null +++ b/test/fgs-ref/ecrire1.fgs @@ -0,0 +1,13 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (1 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (2 ) in = () out = () mov eax, 3456 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/ecrire2.fgs b/test/fgs-ref/ecrire2.fgs new file mode 100644 index 0000000..4968122 --- /dev/null +++ b/test/fgs-ref/ecrire2.fgs @@ -0,0 +1,13 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (1 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (2 ) in = () out = () mov eax, 0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/egal1.fgs b/test/fgs-ref/egal1.fgs new file mode 100644 index 0000000..0548751 --- /dev/null +++ b/test/fgs-ref/egal1.fgs @@ -0,0 +1,18 @@ +iter num = 9 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = (3 ) in = (0 ) out = (0 3 ) mov r3, 123 ;JumpIfEqual 1 +use = (3 ) def = () in = (0 3 ) out = (0 ) cmp r3, 123 ;on passe par un registre temporaire +use = () def = () in = (0 ) out = (0 ) je l0 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = (4 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/egal2.fgs b/test/fgs-ref/egal2.fgs new file mode 100644 index 0000000..41b4e6b --- /dev/null +++ b/test/fgs-ref/egal2.fgs @@ -0,0 +1,18 @@ +iter num = 9 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = (3 ) in = (0 ) out = (0 3 ) mov r3, 412 ;JumpIfEqual 1 +use = (3 ) def = () in = (0 3 ) out = (0 ) cmp r3, 34 ;on passe par un registre temporaire +use = () def = () in = (0 ) out = (0 ) je l0 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = (4 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/egal3.fgs b/test/fgs-ref/egal3.fgs new file mode 100644 index 0000000..8122de0 --- /dev/null +++ b/test/fgs-ref/egal3.fgs @@ -0,0 +1,22 @@ +iter num = 11 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (1 ) in = () out = (1 ) mov r1, 1 ;Affect +use = () def = (4 ) in = (1 ) out = (1 4 ) mov r4, 2 ;JumpIfEqual 1 +use = (4 ) def = () in = (1 4 ) out = (1 ) cmp r4, 2 ;on passe par un registre temporaire +use = () def = () in = (1 ) out = (1 ) je l1 ;JumpIfEqual 2 +use = () def = (1 ) in = () out = (1 ) mov r1, 0 ;Affect +use = () def = (0 ) in = (1 ) out = (0 1 ) l1 : mov r0, 1 ;Affect +use = (1 ) def = () in = (0 1 ) out = (0 ) cmp r1, 1 ;JumpIfEqual 1 +use = () def = () in = (0 ) out = (0 ) je l0 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = (5 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/err5.fgs b/test/fgs-ref/err5.fgs new file mode 100644 index 0000000..a381c27 --- /dev/null +++ b/test/fgs-ref/err5.fgs @@ -0,0 +1,23 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () f : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = () out = () mov eax, 1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 4 ;allocation des variables locales +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call f ; +use = () def = (0 ) in = () out = (0 ) pop r0 ;récupération de la valeur de retour +use = (0 ) def = () in = (0 ) out = () mov dword [ebp-4*1], r0 ;Affect +use = () def = () in = () out = () add esp, 4 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/fibo.fgs b/test/fgs-ref/fibo.fgs new file mode 100644 index 0000000..5806ac5 --- /dev/null +++ b/test/fgs-ref/fibo.fgs @@ -0,0 +1,81 @@ +iter num = 19 +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () pop r0 ;récupération de la valeur de retour +use = () def = (8 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (9 ) in = () out = () mov eax, 1 ; code de sortie +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () fibo : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () push eax ;sauvegarde de eax +use = () def = () in = () out = () push ebx ;sauvegarde de ebx +use = () def = () in = () out = () push ecx ;sauvegarde de ecx +use = () def = () in = () out = () push edx ;sauvegarde de edx +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (1 ) in = () out = (1 ) mov r1, 1 ;Affect +use = () def = () in = (1 ) out = (1 ) cmp dword [ebp+12], 2 ;JumpIfLess 1 +use = () def = () in = (1 ) out = (1 ) jl l2 ;JumpIfLess 2 +use = () def = (1 ) in = () out = (1 ) mov r1, 0 ;Affect +use = (1 ) def = () in = (1 ) out = () l2 : cmp r1, 0 ;JumpIfEqual 1 +use = () def = () in = () out = () je l0 ;JumpIfEqual 2 +use = () def = () in = () out = () mov dword [ebp+8], 1 ;ecriture de la valeur de retour +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = (14 ) in = () out = () pop edx ;restaure edx +use = () def = (15 ) in = () out = () pop ecx ;restaure ecx +use = () def = (16 ) in = () out = () pop ebx ;restaure ebx +use = () def = (17 ) in = () out = () pop eax ;restaure eax +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () jmp l1 ;Jump +use = () def = (3 ) in = () out = (3 ) l0 : mov r3, dword [ebp+12] ; +use = (3 ) def = (3 ) in = (3 ) out = () sub r3, 1 ; +use = () def = () in = () out = () push r3 ;Param +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call fibo ; +use = () def = (2 ) in = () out = (2 ) pop r2 ;récupération de la valeur de retour +use = () def = () in = (2 ) out = (2 ) add esp, 4 ;désallocation des arguments +use = () def = (5 ) in = (2 ) out = (2 5 ) mov r5, dword [ebp+12] ; +use = (5 ) def = (5 ) in = (2 5 ) out = (2 ) sub r5, 2 ; +use = () def = () in = (2 ) out = (2 ) push r5 ;Param +use = () def = () in = (2 ) out = (2 ) sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = (2 ) out = (2 ) call fibo ; +use = () def = (4 ) in = (2 ) out = (2 4 ) pop r4 ;récupération de la valeur de retour +use = () def = () in = (2 4 ) out = (2 4 ) add esp, 4 ;désallocation des arguments +use = (2 ) def = (6 ) in = (2 4 ) out = (4 6 ) mov r6, r2 ; +use = (4 6 ) def = (6 ) in = (4 6 ) out = (6 ) add r6, r4 ; +use = (6 ) def = () in = (6 ) out = () mov dword [ebp+8], r6 ;ecriture de la valeur de retour +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = (18 ) in = () out = () pop edx ;restaure edx +use = () def = (19 ) in = () out = () pop ecx ;restaure ecx +use = () def = (20 ) in = () out = () pop ebx ;restaure ebx +use = () def = (21 ) in = () out = () pop eax ;restaure eax +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () l1 : add esp, 0 ;désallocation des variables locales +use = () def = (22 ) in = () out = () pop edx ;restaure edx +use = () def = (23 ) in = () out = () pop ecx ;restaure ecx +use = () def = (24 ) in = () out = () pop ebx ;restaure ebx +use = () def = (25 ) in = () out = () pop eax ;restaure eax +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () push eax ;sauvegarde de eax +use = () def = () in = () out = () push ebx ;sauvegarde de ebx +use = () def = () in = () out = () push ecx ;sauvegarde de ecx +use = () def = () in = () out = () push edx ;sauvegarde de edx +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () push 9 ;Param +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call fibo ; +use = () def = (7 ) in = () out = (7 ) pop r7 ;récupération de la valeur de retour +use = () def = () in = (7 ) out = (7 ) add esp, 4 ;désallocation des arguments +use = (7 ) def = (30 ) in = (7 ) out = () mov eax, r7 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = (31 ) in = () out = () pop edx ;restaure edx +use = () def = (32 ) in = () out = () pop ecx ;restaure ecx +use = () def = (33 ) in = () out = () pop ebx ;restaure ebx +use = () def = (34 ) in = () out = () pop eax ;restaure eax +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/inf1.fgs b/test/fgs-ref/inf1.fgs new file mode 100644 index 0000000..8688816 --- /dev/null +++ b/test/fgs-ref/inf1.fgs @@ -0,0 +1,18 @@ +iter num = 9 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = (3 ) in = (0 ) out = (0 3 ) mov r3, 3 ;JumpIfLess 1 +use = (3 ) def = () in = (0 3 ) out = (0 ) cmp r3, 3 ;on passe par un registre temporaire +use = () def = () in = (0 ) out = (0 ) jl l0 ;JumpIfLess 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = (4 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/inf2.fgs b/test/fgs-ref/inf2.fgs new file mode 100644 index 0000000..8be613b --- /dev/null +++ b/test/fgs-ref/inf2.fgs @@ -0,0 +1,18 @@ +iter num = 9 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = (3 ) in = (0 ) out = (0 3 ) mov r3, 4 ;JumpIfLess 1 +use = (3 ) def = () in = (0 3 ) out = (0 ) cmp r3, 1 ;on passe par un registre temporaire +use = () def = () in = (0 ) out = (0 ) jl l0 ;JumpIfLess 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = (4 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/inf3.fgs b/test/fgs-ref/inf3.fgs new file mode 100644 index 0000000..7484453 --- /dev/null +++ b/test/fgs-ref/inf3.fgs @@ -0,0 +1,18 @@ +iter num = 9 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = (3 ) in = (0 ) out = (0 3 ) mov r3, 312 ;JumpIfLess 1 +use = (3 ) def = () in = (0 3 ) out = (0 ) cmp r3, 475 ;on passe par un registre temporaire +use = () def = () in = (0 ) out = (0 ) jl l0 ;JumpIfLess 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = (4 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/inf4.fgs b/test/fgs-ref/inf4.fgs new file mode 100644 index 0000000..7f8fd1c --- /dev/null +++ b/test/fgs-ref/inf4.fgs @@ -0,0 +1,22 @@ +iter num = 11 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (1 ) in = () out = (1 ) mov r1, 1 ;Affect +use = () def = (4 ) in = (1 ) out = (1 4 ) mov r4, 3 ;JumpIfLess 1 +use = (4 ) def = () in = (1 4 ) out = (1 ) cmp r4, 2 ;on passe par un registre temporaire +use = () def = () in = (1 ) out = (1 ) jl l1 ;JumpIfLess 2 +use = () def = (1 ) in = () out = (1 ) mov r1, 0 ;Affect +use = () def = (0 ) in = (1 ) out = (0 1 ) l1 : mov r0, 1 ;Affect +use = (1 ) def = () in = (0 1 ) out = (0 ) cmp r1, 1 ;JumpIfLess 1 +use = () def = () in = (0 ) out = (0 ) jl l0 ;JumpIfLess 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = (5 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/mult1.fgs b/test/fgs-ref/mult1.fgs new file mode 100644 index 0000000..744a496 --- /dev/null +++ b/test/fgs-ref/mult1.fgs @@ -0,0 +1,15 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 2 ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) imul r0, 3 ; +use = (0 ) def = (3 ) in = (0 ) out = () mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/mult2.fgs b/test/fgs-ref/mult2.fgs new file mode 100644 index 0000000..283b9c8 --- /dev/null +++ b/test/fgs-ref/mult2.fgs @@ -0,0 +1,15 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) imul r0, 321 ; +use = (0 ) def = (3 ) in = (0 ) out = () mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/mult3.fgs b/test/fgs-ref/mult3.fgs new file mode 100644 index 0000000..7a190b6 --- /dev/null +++ b/test/fgs-ref/mult3.fgs @@ -0,0 +1,17 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 3 ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) imul r0, 3 ; +use = (0 ) def = (1 ) in = (0 ) out = (1 ) mov r1, r0 ; +use = (1 ) def = (1 ) in = (1 ) out = (1 ) imul r1, 2 ; +use = (1 ) def = (4 ) in = (1 ) out = () mov eax, r1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/not1.fgs b/test/fgs-ref/not1.fgs new file mode 100644 index 0000000..eab7c02 --- /dev/null +++ b/test/fgs-ref/not1.fgs @@ -0,0 +1,18 @@ +iter num = 9 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = (3 ) in = (0 ) out = (0 3 ) mov r3, 312 ;JumpIfEqual 1 +use = (3 ) def = () in = (0 3 ) out = (0 ) cmp r3, 0 ;on passe par un registre temporaire +use = () def = () in = (0 ) out = (0 ) je l0 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = (4 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/not2.fgs b/test/fgs-ref/not2.fgs new file mode 100644 index 0000000..73c8d3f --- /dev/null +++ b/test/fgs-ref/not2.fgs @@ -0,0 +1,18 @@ +iter num = 9 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = (3 ) in = (0 ) out = (0 3 ) mov r3, 0 ;JumpIfEqual 1 +use = (3 ) def = () in = (0 3 ) out = (0 ) cmp r3, 0 ;on passe par un registre temporaire +use = () def = () in = (0 ) out = (0 ) je l0 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = (4 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/not3.fgs b/test/fgs-ref/not3.fgs new file mode 100644 index 0000000..2a71dd0 --- /dev/null +++ b/test/fgs-ref/not3.fgs @@ -0,0 +1,22 @@ +iter num = 11 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (1 ) in = () out = (1 ) mov r1, 1 ;Affect +use = () def = (4 ) in = (1 ) out = (1 4 ) mov r4, 0 ;JumpIfEqual 1 +use = (4 ) def = () in = (1 4 ) out = (1 ) cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = (1 ) out = (1 ) je l1 ;JumpIfEqual 2 +use = () def = (1 ) in = () out = (1 ) mov r1, 0 ;Affect +use = () def = (0 ) in = (1 ) out = (0 1 ) l1 : mov r0, 1 ;Affect +use = (1 ) def = () in = (0 1 ) out = (0 ) cmp r1, 0 ;JumpIfEqual 1 +use = () def = () in = (0 ) out = (0 ) je l0 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = (5 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/or1.fgs b/test/fgs-ref/or1.fgs new file mode 100644 index 0000000..aa71c4c --- /dev/null +++ b/test/fgs-ref/or1.fgs @@ -0,0 +1,22 @@ +iter num = 5 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = () out = (3 ) mov r3, 1 ;jumpIfNotEqual 1 +use = (3 ) def = () in = (3 ) out = () cmp r3, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () jne l1 ;jumpIfNotEqual 2 +use = () def = (4 ) in = () out = (4 ) mov r4, 1 ;jumpIfNotEqual 1 +use = (4 ) def = () in = (4 ) out = () cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () jne l1 ;jumpIfNotEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = () def = () in = (0 ) out = (0 ) jmp l0 ;Jump +use = () def = (0 ) in = () out = (0 ) l1 : mov r0, 1 ;Affect +use = (0 ) def = (5 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/or2.fgs b/test/fgs-ref/or2.fgs new file mode 100644 index 0000000..7094e61 --- /dev/null +++ b/test/fgs-ref/or2.fgs @@ -0,0 +1,22 @@ +iter num = 5 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = () out = (3 ) mov r3, 1 ;jumpIfNotEqual 1 +use = (3 ) def = () in = (3 ) out = () cmp r3, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () jne l1 ;jumpIfNotEqual 2 +use = () def = (4 ) in = () out = (4 ) mov r4, 0 ;jumpIfNotEqual 1 +use = (4 ) def = () in = (4 ) out = () cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () jne l1 ;jumpIfNotEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = () def = () in = (0 ) out = (0 ) jmp l0 ;Jump +use = () def = (0 ) in = () out = (0 ) l1 : mov r0, 1 ;Affect +use = (0 ) def = (5 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/or3.fgs b/test/fgs-ref/or3.fgs new file mode 100644 index 0000000..5b331bd --- /dev/null +++ b/test/fgs-ref/or3.fgs @@ -0,0 +1,22 @@ +iter num = 5 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = () out = (3 ) mov r3, 0 ;jumpIfNotEqual 1 +use = (3 ) def = () in = (3 ) out = () cmp r3, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () jne l1 ;jumpIfNotEqual 2 +use = () def = (4 ) in = () out = (4 ) mov r4, 315 ;jumpIfNotEqual 1 +use = (4 ) def = () in = (4 ) out = () cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () jne l1 ;jumpIfNotEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = () def = () in = (0 ) out = (0 ) jmp l0 ;Jump +use = () def = (0 ) in = () out = (0 ) l1 : mov r0, 1 ;Affect +use = (0 ) def = (5 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/or4.fgs b/test/fgs-ref/or4.fgs new file mode 100644 index 0000000..86503bb --- /dev/null +++ b/test/fgs-ref/or4.fgs @@ -0,0 +1,22 @@ +iter num = 5 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = () out = (3 ) mov r3, 0 ;jumpIfNotEqual 1 +use = (3 ) def = () in = (3 ) out = () cmp r3, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () jne l1 ;jumpIfNotEqual 2 +use = () def = (4 ) in = () out = (4 ) mov r4, 0 ;jumpIfNotEqual 1 +use = (4 ) def = () in = (4 ) out = () cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () jne l1 ;jumpIfNotEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = () def = () in = (0 ) out = (0 ) jmp l0 ;Jump +use = () def = (0 ) in = () out = (0 ) l1 : mov r0, 1 ;Affect +use = (0 ) def = (5 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/or5.fgs b/test/fgs-ref/or5.fgs new file mode 100644 index 0000000..a14bf64 --- /dev/null +++ b/test/fgs-ref/or5.fgs @@ -0,0 +1,30 @@ +iter num = 5 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (4 ) in = () out = (4 ) mov r4, 0 ;jumpIfNotEqual 1 +use = (4 ) def = () in = (4 ) out = () cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () jne l3 ;jumpIfNotEqual 2 +use = () def = (5 ) in = () out = (5 ) mov r5, 1 ;jumpIfNotEqual 1 +use = (5 ) def = () in = (5 ) out = () cmp r5, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () jne l3 ;jumpIfNotEqual 2 +use = () def = (1 ) in = () out = (1 ) mov r1, 0 ;Affect +use = () def = () in = (1 ) out = (1 ) jmp l2 ;Jump +use = () def = (1 ) in = () out = (1 ) l3 : mov r1, 1 ;Affect +use = (1 ) def = () in = (1 ) out = () l2 : cmp r1, 0 ;jumpIfNotEqual 1 +use = () def = () in = () out = () jne l1 ;jumpIfNotEqual 2 +use = () def = (6 ) in = () out = (6 ) mov r6, 0 ;jumpIfNotEqual 1 +use = (6 ) def = () in = (6 ) out = () cmp r6, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () jne l1 ;jumpIfNotEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = () def = () in = (0 ) out = (0 ) jmp l0 ;Jump +use = () def = (0 ) in = () out = (0 ) l1 : mov r0, 1 ;Affect +use = (0 ) def = (7 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/parenth1.fgs b/test/fgs-ref/parenth1.fgs new file mode 100644 index 0000000..2aed1a1 --- /dev/null +++ b/test/fgs-ref/parenth1.fgs @@ -0,0 +1,13 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (1 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (2 ) in = () out = () mov eax, 1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/parenth2.fgs b/test/fgs-ref/parenth2.fgs new file mode 100644 index 0000000..8f2d299 --- /dev/null +++ b/test/fgs-ref/parenth2.fgs @@ -0,0 +1,13 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (1 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (2 ) in = () out = () mov eax, 2 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio23-1.fgs b/test/fgs-ref/prio23-1.fgs new file mode 100644 index 0000000..d50f451 --- /dev/null +++ b/test/fgs-ref/prio23-1.fgs @@ -0,0 +1,20 @@ +iter num = 9 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = (4 ) in = (0 ) out = (0 4 ) mov r4, 0 ;JumpIfEqual 1 +use = (4 ) def = () in = (0 4 ) out = (0 ) cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = (0 ) out = (0 ) je l0 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = (1 ) in = (0 ) out = (1 ) l0 : mov r1, r0 ; +use = (1 ) def = (1 ) in = (1 ) out = (1 ) imul r1, 10 ; +use = (1 ) def = (5 ) in = (1 ) out = () mov eax, r1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio23-2.fgs b/test/fgs-ref/prio23-2.fgs new file mode 100644 index 0000000..ca8580f --- /dev/null +++ b/test/fgs-ref/prio23-2.fgs @@ -0,0 +1,20 @@ +iter num = 11 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = (4 ) in = (0 ) out = (0 4 ) mov r4, 10 ;JumpIfEqual 1 +use = (4 ) def = () in = (0 4 ) out = (0 ) cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = (0 ) out = (0 ) je l0 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = () def = (1 ) in = (0 ) out = (0 1 ) l0 : mov r1, 3 ; +use = (0 1 ) def = (1 ) in = (0 1 ) out = (1 ) imul r1, r0 ; +use = (1 ) def = (5 ) in = (1 ) out = () mov eax, r1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio23-3.fgs b/test/fgs-ref/prio23-3.fgs new file mode 100644 index 0000000..6bb0cc3 --- /dev/null +++ b/test/fgs-ref/prio23-3.fgs @@ -0,0 +1,22 @@ +iter num = 28 +use = () def = () in = (7 ) out = (7 ) call main ; +use = () def = (2 ) in = (7 ) out = (7 ) mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = (7 ) out = (7 ) mov eax, 1 ; +use = () def = () in = (7 ) out = (7 ) int 0x80 ; +use = () def = () in = (7 ) out = (7 ) main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = (7 ) out = (7 ) mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = (7 ) out = (7 ) sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = (7 ) out = (0 7 ) mov r0, 1 ;Affect +use = () def = (4 ) in = (0 7 ) out = (0 4 7 ) mov r4, 0 ;JumpIfEqual 1 +use = (4 ) def = () in = (0 4 7 ) out = (0 7 ) cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = (0 7 ) out = (0 7 ) je l0 ;JumpIfEqual 2 +use = () def = (0 ) in = (7 ) out = (0 7 ) mov r0, 0 ;Affect +use = (0 ) def = (5 ) in = (0 7 ) out = (7 ) l0 : mov eax, r0 ; +use = () def = (6 ) in = (7 ) out = (6 7 ) mov r6, 1 ; +use = (6 ) def = () in = (6 7 ) out = (7 ) idiv r6 ; +use = (7 ) def = (1 ) in = (7 ) out = (1 ) mov r1, eax ; +use = (1 ) def = (8 ) in = (1 ) out = () mov eax, r1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio23-4.fgs b/test/fgs-ref/prio23-4.fgs new file mode 100644 index 0000000..31cb97e --- /dev/null +++ b/test/fgs-ref/prio23-4.fgs @@ -0,0 +1,26 @@ +iter num = 34 +use = () def = () in = (8 ) out = (8 ) call main ; +use = () def = (3 ) in = (8 ) out = (8 ) mov ebx, 0 ; valeur de retour du programme +use = () def = (4 ) in = (8 ) out = (8 ) mov eax, 1 ; +use = () def = () in = (8 ) out = (8 ) int 0x80 ; +use = () def = () in = (8 ) out = (8 ) main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = (8 ) out = (8 ) mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = (8 ) out = (8 ) sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = (8 ) out = (0 8 ) mov r0, 1 ;Affect +use = () def = (5 ) in = (0 8 ) out = (0 5 8 ) mov r5, 1 ;JumpIfEqual 1 +use = (5 ) def = () in = (0 5 8 ) out = (0 8 ) cmp r5, 0 ;on passe par un registre temporaire +use = () def = () in = (0 8 ) out = (0 8 ) je l0 ;JumpIfEqual 2 +use = () def = (0 ) in = (8 ) out = (0 8 ) mov r0, 0 ;Affect +use = () def = (1 ) in = (0 8 ) out = (0 1 8 ) l0 : mov r1, 1 ;Affect +use = () def = (6 ) in = (0 1 8 ) out = (0 1 6 8 ) mov r6, 0 ;JumpIfEqual 1 +use = (6 ) def = () in = (0 1 6 8 ) out = (0 1 8 ) cmp r6, 0 ;on passe par un registre temporaire +use = () def = () in = (0 1 8 ) out = (0 1 8 ) je l1 ;JumpIfEqual 2 +use = () def = (1 ) in = (0 8 ) out = (0 1 8 ) mov r1, 0 ;Affect +use = (0 ) def = (7 ) in = (0 1 8 ) out = (1 8 ) l1 : mov eax, r0 ; +use = (1 ) def = () in = (1 8 ) out = (8 ) idiv r1 ; +use = (8 ) def = (2 ) in = (8 ) out = (2 ) mov r2, eax ; +use = (2 ) def = (9 ) in = (2 ) out = () mov eax, r2 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio34-1.fgs b/test/fgs-ref/prio34-1.fgs new file mode 100644 index 0000000..fadac07 --- /dev/null +++ b/test/fgs-ref/prio34-1.fgs @@ -0,0 +1,17 @@ +iter num = 5 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 3 ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) imul r0, 4 ; +use = () def = (1 ) in = (0 ) out = (0 1 ) mov r1, 2 ; +use = (0 1 ) def = (1 ) in = (0 1 ) out = (1 ) add r1, r0 ; +use = (1 ) def = (4 ) in = (1 ) out = () mov eax, r1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio34-2.fgs b/test/fgs-ref/prio34-2.fgs new file mode 100644 index 0000000..ffeb7df --- /dev/null +++ b/test/fgs-ref/prio34-2.fgs @@ -0,0 +1,17 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 2 ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) imul r0, 3 ; +use = (0 ) def = (1 ) in = (0 ) out = (1 ) mov r1, r0 ; +use = (1 ) def = (1 ) in = (1 ) out = (1 ) sub r1, 4 ; +use = (1 ) def = (4 ) in = (1 ) out = () mov eax, r1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio34-3.fgs b/test/fgs-ref/prio34-3.fgs new file mode 100644 index 0000000..aba8655 --- /dev/null +++ b/test/fgs-ref/prio34-3.fgs @@ -0,0 +1,19 @@ +iter num = 20 +use = () def = () in = (6 ) out = (6 ) call main ; +use = () def = (2 ) in = (6 ) out = (6 ) mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = (6 ) out = (6 ) mov eax, 1 ; +use = () def = () in = (6 ) out = (6 ) int 0x80 ; +use = () def = () in = (6 ) out = (6 ) main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = (6 ) out = (6 ) mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = (6 ) out = (6 ) sub esp, 0 ;allocation des variables locales +use = () def = (4 ) in = (6 ) out = (6 ) mov eax, 6 ; +use = () def = (5 ) in = (6 ) out = (5 6 ) mov r5, 3 ; +use = (5 ) def = () in = (5 6 ) out = (6 ) idiv r5 ; +use = (6 ) def = (0 ) in = (6 ) out = (0 ) mov r0, eax ; +use = (0 ) def = (1 ) in = (0 ) out = (1 ) mov r1, r0 ; +use = (1 ) def = (1 ) in = (1 ) out = (1 ) sub r1, 72 ; +use = (1 ) def = (7 ) in = (1 ) out = () mov eax, r1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio34-4.fgs b/test/fgs-ref/prio34-4.fgs new file mode 100644 index 0000000..088f3df --- /dev/null +++ b/test/fgs-ref/prio34-4.fgs @@ -0,0 +1,19 @@ +iter num = 20 +use = () def = () in = (6 ) out = (6 ) call main ; +use = () def = (2 ) in = (6 ) out = (6 ) mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = (6 ) out = (6 ) mov eax, 1 ; +use = () def = () in = (6 ) out = (6 ) int 0x80 ; +use = () def = () in = (6 ) out = (6 ) main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = (6 ) out = (6 ) mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = (6 ) out = (6 ) sub esp, 0 ;allocation des variables locales +use = () def = (4 ) in = (6 ) out = (6 ) mov eax, 20 ; +use = () def = (5 ) in = (6 ) out = (5 6 ) mov r5, 10 ; +use = (5 ) def = () in = (5 6 ) out = (6 ) idiv r5 ; +use = (6 ) def = (0 ) in = (6 ) out = (0 ) mov r0, eax ; +use = () def = (1 ) in = (0 ) out = (0 1 ) mov r1, 6 ; +use = (0 1 ) def = (1 ) in = (0 1 ) out = (1 ) add r1, r0 ; +use = (1 ) def = (7 ) in = (1 ) out = () mov eax, r1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio45-1.fgs b/test/fgs-ref/prio45-1.fgs new file mode 100644 index 0000000..c4e774f --- /dev/null +++ b/test/fgs-ref/prio45-1.fgs @@ -0,0 +1,20 @@ +iter num = 9 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (1 ) in = () out = (1 ) mov r1, 0 ; +use = (1 ) def = (1 ) in = (1 ) out = (1 ) add r1, 1 ; +use = () def = (0 ) in = (1 ) out = (0 1 ) mov r0, 1 ;Affect +use = () def = (4 ) in = (0 1 ) out = (0 1 4 ) mov r4, 2 ;JumpIfEqual 1 +use = (1 4 ) def = () in = (0 1 4 ) out = (0 ) cmp r4, r1 ;on passe par un registre temporaire +use = () def = () in = (0 ) out = (0 ) je l0 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = (5 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio45-2.fgs b/test/fgs-ref/prio45-2.fgs new file mode 100644 index 0000000..581d854 --- /dev/null +++ b/test/fgs-ref/prio45-2.fgs @@ -0,0 +1,19 @@ +iter num = 7 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (1 ) in = () out = (1 ) mov r1, 1 ; +use = (1 ) def = (1 ) in = (1 ) out = (1 ) add r1, 234 ; +use = () def = (0 ) in = (1 ) out = (0 1 ) mov r0, 1 ;Affect +use = (1 ) def = () in = (0 1 ) out = (0 ) cmp r1, 1 ;JumpIfEqual 1 +use = () def = () in = (0 ) out = (0 ) je l0 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = (4 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio45-3.fgs b/test/fgs-ref/prio45-3.fgs new file mode 100644 index 0000000..9519f6c --- /dev/null +++ b/test/fgs-ref/prio45-3.fgs @@ -0,0 +1,20 @@ +iter num = 9 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (1 ) in = () out = (1 ) mov r1, 11 ; +use = (1 ) def = (1 ) in = (1 ) out = (1 ) add r1, 100 ; +use = () def = (0 ) in = (1 ) out = (0 1 ) mov r0, 1 ;Affect +use = () def = (4 ) in = (0 1 ) out = (0 1 4 ) mov r4, 12 ;JumpIfLess 1 +use = (1 4 ) def = () in = (0 1 4 ) out = (0 ) cmp r4, r1 ;on passe par un registre temporaire +use = () def = () in = (0 ) out = (0 ) jl l0 ;JumpIfLess 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = (5 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio45-4.fgs b/test/fgs-ref/prio45-4.fgs new file mode 100644 index 0000000..2e64d12 --- /dev/null +++ b/test/fgs-ref/prio45-4.fgs @@ -0,0 +1,19 @@ +iter num = 7 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (1 ) in = () out = (1 ) mov r1, 21 ; +use = (1 ) def = (1 ) in = (1 ) out = (1 ) sub r1, 21 ; +use = () def = (0 ) in = (1 ) out = (0 1 ) mov r0, 1 ;Affect +use = (1 ) def = () in = (0 1 ) out = (0 ) cmp r1, 1 ;JumpIfLess 1 +use = () def = () in = (0 ) out = (0 ) jl l0 ;JumpIfLess 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = (4 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio56-1.fgs b/test/fgs-ref/prio56-1.fgs new file mode 100644 index 0000000..7b84beb --- /dev/null +++ b/test/fgs-ref/prio56-1.fgs @@ -0,0 +1,26 @@ +iter num = 9 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (1 ) in = () out = (1 ) mov r1, 1 ;Affect +use = () def = (4 ) in = (1 ) out = (1 4 ) mov r4, 1 ;JumpIfEqual 1 +use = (4 ) def = () in = (1 4 ) out = (1 ) cmp r4, 2 ;on passe par un registre temporaire +use = () def = () in = (1 ) out = (1 ) je l2 ;JumpIfEqual 2 +use = () def = (1 ) in = () out = (1 ) mov r1, 0 ;Affect +use = (1 ) def = () in = (1 ) out = () l2 : cmp r1, 0 ;JumpIfEqual 1 +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = (5 ) in = () out = (5 ) mov r5, 1 ;JumpIfEqual 1 +use = (5 ) def = () in = (5 ) out = () cmp r5, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = () in = (0 ) out = (0 ) jmp l0 ;Jump +use = () def = (0 ) in = () out = (0 ) l1 : mov r0, 0 ;Affect +use = (0 ) def = (6 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio56-2.fgs b/test/fgs-ref/prio56-2.fgs new file mode 100644 index 0000000..f4c98dd --- /dev/null +++ b/test/fgs-ref/prio56-2.fgs @@ -0,0 +1,26 @@ +iter num = 15 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (1 ) in = () out = (1 ) mov r1, 1 ;Affect +use = () def = (4 ) in = (1 ) out = (1 4 ) mov r4, 2 ;JumpIfEqual 1 +use = (4 ) def = () in = (1 4 ) out = (1 ) cmp r4, 1 ;on passe par un registre temporaire +use = () def = () in = (1 ) out = (1 ) je l2 ;JumpIfEqual 2 +use = () def = (1 ) in = () out = (1 ) mov r1, 0 ;Affect +use = () def = (5 ) in = (1 ) out = (1 5 ) l2 : mov r5, 1 ;JumpIfEqual 1 +use = (5 ) def = () in = (1 5 ) out = (1 ) cmp r5, 0 ;on passe par un registre temporaire +use = () def = () in = (1 ) out = (1 ) je l1 ;JumpIfEqual 2 +use = (1 ) def = () in = (1 ) out = () cmp r1, 0 ;JumpIfEqual 1 +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 1 ;Affect +use = () def = () in = (0 ) out = (0 ) jmp l0 ;Jump +use = () def = (0 ) in = () out = (0 ) l1 : mov r0, 0 ;Affect +use = (0 ) def = (6 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio67-1.fgs b/test/fgs-ref/prio67-1.fgs new file mode 100644 index 0000000..daa97c7 --- /dev/null +++ b/test/fgs-ref/prio67-1.fgs @@ -0,0 +1,30 @@ +iter num = 5 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (4 ) in = () out = (4 ) mov r4, 0 ;JumpIfEqual 1 +use = (4 ) def = () in = (4 ) out = () cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l3 ;JumpIfEqual 2 +use = () def = (5 ) in = () out = (5 ) mov r5, 1 ;JumpIfEqual 1 +use = (5 ) def = () in = (5 ) out = () cmp r5, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l3 ;JumpIfEqual 2 +use = () def = (1 ) in = () out = (1 ) mov r1, 1 ;Affect +use = () def = () in = (1 ) out = (1 ) jmp l2 ;Jump +use = () def = (1 ) in = () out = (1 ) l3 : mov r1, 0 ;Affect +use = (1 ) def = () in = (1 ) out = () l2 : cmp r1, 0 ;jumpIfNotEqual 1 +use = () def = () in = () out = () jne l1 ;jumpIfNotEqual 2 +use = () def = (6 ) in = () out = (6 ) mov r6, 1 ;jumpIfNotEqual 1 +use = (6 ) def = () in = (6 ) out = () cmp r6, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () jne l1 ;jumpIfNotEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = () def = () in = (0 ) out = (0 ) jmp l0 ;Jump +use = () def = (0 ) in = () out = (0 ) l1 : mov r0, 1 ;Affect +use = (0 ) def = (7 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/prio67-2.fgs b/test/fgs-ref/prio67-2.fgs new file mode 100644 index 0000000..2837740 --- /dev/null +++ b/test/fgs-ref/prio67-2.fgs @@ -0,0 +1,30 @@ +iter num = 11 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (4 ) in = () out = (4 ) mov r4, 1 ;JumpIfEqual 1 +use = (4 ) def = () in = (4 ) out = () cmp r4, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l3 ;JumpIfEqual 2 +use = () def = (5 ) in = () out = (5 ) mov r5, 0 ;JumpIfEqual 1 +use = (5 ) def = () in = (5 ) out = () cmp r5, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l3 ;JumpIfEqual 2 +use = () def = (1 ) in = () out = (1 ) mov r1, 1 ;Affect +use = () def = () in = (1 ) out = (1 ) jmp l2 ;Jump +use = () def = (1 ) in = () out = (1 ) l3 : mov r1, 0 ;Affect +use = () def = (6 ) in = (1 ) out = (1 6 ) l2 : mov r6, 1 ;jumpIfNotEqual 1 +use = (6 ) def = () in = (1 6 ) out = (1 ) cmp r6, 0 ;on passe par un registre temporaire +use = () def = () in = (1 ) out = (1 ) jne l1 ;jumpIfNotEqual 2 +use = (1 ) def = () in = (1 ) out = () cmp r1, 0 ;jumpIfNotEqual 1 +use = () def = () in = () out = () jne l1 ;jumpIfNotEqual 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = () def = () in = (0 ) out = (0 ) jmp l0 ;Jump +use = () def = (0 ) in = () out = (0 ) l1 : mov r0, 1 ;Affect +use = (0 ) def = (7 ) in = (0 ) out = () l0 : mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/rec1.fgs b/test/fgs-ref/rec1.fgs new file mode 100644 index 0000000..3ca7549 --- /dev/null +++ b/test/fgs-ref/rec1.fgs @@ -0,0 +1,74 @@ +iter num = 7 +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () pop r0 ;récupération de la valeur de retour +use = () def = (6 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (7 ) in = () out = () mov eax, 1 ; code de sortie +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () f : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () push eax ;sauvegarde de eax +use = () def = () in = () out = () push ebx ;sauvegarde de ebx +use = () def = () in = () out = () push ecx ;sauvegarde de ecx +use = () def = () in = () out = () push edx ;sauvegarde de edx +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (1 ) in = () out = (1 ) mov r1, 1 ;Affect +use = () def = () in = (1 ) out = (1 ) cmp dword [ebp+12], 1 ;JumpIfEqual 1 +use = () def = () in = (1 ) out = (1 ) je l2 ;JumpIfEqual 2 +use = () def = (1 ) in = () out = (1 ) mov r1, 0 ;Affect +use = (1 ) def = () in = (1 ) out = () l2 : cmp r1, 0 ;JumpIfEqual 1 +use = () def = () in = () out = () je l0 ;JumpIfEqual 2 +use = () def = () in = () out = () mov dword [ebp+8], 1 ;ecriture de la valeur de retour +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = (12 ) in = () out = () pop edx ;restaure edx +use = () def = (13 ) in = () out = () pop ecx ;restaure ecx +use = () def = (14 ) in = () out = () pop ebx ;restaure ebx +use = () def = (15 ) in = () out = () pop eax ;restaure eax +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () jmp l1 ;Jump +use = () def = (3 ) in = () out = (3 ) l0 : mov r3, dword [ebp+12] ; +use = (3 ) def = (3 ) in = (3 ) out = () sub r3, 1 ; +use = () def = () in = () out = () push r3 ;Param +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call f ; +use = () def = (2 ) in = () out = (2 ) pop r2 ;récupération de la valeur de retour +use = () def = () in = (2 ) out = (2 ) add esp, 4 ;désallocation des arguments +use = () def = (4 ) in = (2 ) out = (2 4 ) mov r4, 1 ; +use = (2 4 ) def = (4 ) in = (2 4 ) out = (4 ) add r4, r2 ; +use = (4 ) def = () in = (4 ) out = () mov dword [ebp+8], r4 ;ecriture de la valeur de retour +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = (16 ) in = () out = () pop edx ;restaure edx +use = () def = (17 ) in = () out = () pop ecx ;restaure ecx +use = () def = (18 ) in = () out = () pop ebx ;restaure ebx +use = () def = (19 ) in = () out = () pop eax ;restaure eax +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () l1 : add esp, 0 ;désallocation des variables locales +use = () def = (20 ) in = () out = () pop edx ;restaure edx +use = () def = (21 ) in = () out = () pop ecx ;restaure ecx +use = () def = (22 ) in = () out = () pop ebx ;restaure ebx +use = () def = (23 ) in = () out = () pop eax ;restaure eax +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () push eax ;sauvegarde de eax +use = () def = () in = () out = () push ebx ;sauvegarde de ebx +use = () def = () in = () out = () push ecx ;sauvegarde de ecx +use = () def = () in = () out = () push edx ;sauvegarde de edx +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () push 100 ;Param +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call f ; +use = () def = (5 ) in = () out = (5 ) pop r5 ;récupération de la valeur de retour +use = () def = () in = (5 ) out = (5 ) add esp, 4 ;désallocation des arguments +use = (5 ) def = (28 ) in = (5 ) out = () mov eax, r5 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = (29 ) in = () out = () pop edx ;restaure edx +use = () def = (30 ) in = () out = () pop ecx ;restaure ecx +use = () def = (31 ) in = () out = () pop ebx ;restaure ebx +use = () def = (32 ) in = () out = () pop eax ;restaure eax +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/si1.fgs b/test/fgs-ref/si1.fgs new file mode 100644 index 0000000..d394ed0 --- /dev/null +++ b/test/fgs-ref/si1.fgs @@ -0,0 +1,16 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (1 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (2 ) in = () out = (2 ) mov r2, 1 ;JumpIfEqual 1 +use = (2 ) def = () in = (2 ) out = () cmp r2, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = (3 ) in = () out = () mov eax, 1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () l1 : add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/si2.fgs b/test/fgs-ref/si2.fgs new file mode 100644 index 0000000..f752f20 --- /dev/null +++ b/test/fgs-ref/si2.fgs @@ -0,0 +1,19 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (1 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (2 ) in = () out = (2 ) mov r2, 0 ;JumpIfEqual 1 +use = (2 ) def = () in = (2 ) out = () cmp r2, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l0 ;JumpIfEqual 2 +use = () def = (3 ) in = () out = () mov eax, 1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () jmp l1 ;Jump +use = () def = (4 ) in = () out = () l0 : mov eax, 0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () l1 : add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/si3.fgs b/test/fgs-ref/si3.fgs new file mode 100644 index 0000000..d60ffe2 --- /dev/null +++ b/test/fgs-ref/si3.fgs @@ -0,0 +1,21 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (1 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (2 ) in = () out = (2 ) mov r2, 1 ;JumpIfEqual 1 +use = (2 ) def = () in = (2 ) out = () cmp r2, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l0 ;JumpIfEqual 2 +use = () def = (3 ) in = () out = () mov eax, 1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () jmp l1 ;Jump +use = () def = (4 ) in = () out = () l0 : mov eax, 0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (5 ) in = () out = () l1 : mov eax, 3 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/si4.fgs b/test/fgs-ref/si4.fgs new file mode 100644 index 0000000..8f0dfb3 --- /dev/null +++ b/test/fgs-ref/si4.fgs @@ -0,0 +1,21 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (1 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (2 ) in = () out = (2 ) mov r2, 0 ;JumpIfEqual 1 +use = (2 ) def = () in = (2 ) out = () cmp r2, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l0 ;JumpIfEqual 2 +use = () def = (3 ) in = () out = () mov eax, 1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () jmp l1 ;Jump +use = () def = (4 ) in = () out = () l0 : mov eax, 0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (5 ) in = () out = () l1 : mov eax, 3 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/si5.fgs b/test/fgs-ref/si5.fgs new file mode 100644 index 0000000..9f931ee --- /dev/null +++ b/test/fgs-ref/si5.fgs @@ -0,0 +1,33 @@ +iter num = 3 +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () pop r0 ;récupération de la valeur de retour +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; code de sortie +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () push eax ;sauvegarde de eax +use = () def = () in = () out = () push ebx ;sauvegarde de ebx +use = () def = () in = () out = () push ecx ;sauvegarde de ecx +use = () def = () in = () out = () push edx ;sauvegarde de edx +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (7 ) in = () out = (7 ) mov r7, 1 ;JumpIfEqual 1 +use = (7 ) def = () in = (7 ) out = () cmp r7, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l3 ;JumpIfEqual 2 +use = () def = (8 ) in = () out = () mov eax, 1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (9 ) in = () out = (9 ) mov r9, 1 ;JumpIfEqual 1 +use = (9 ) def = () in = (9 ) out = () cmp r9, 0 ;on passe par un registre temporaire +use = () def = () in = () out = () je l3 ;JumpIfEqual 2 +use = () def = (10 ) in = () out = () mov eax, 2 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (11 ) in = () out = () l3 : mov eax, 3 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = (12 ) in = () out = () pop edx ;restaure edx +use = () def = (13 ) in = () out = () pop ecx ;restaure ecx +use = () def = (14 ) in = () out = () pop ebx ;restaure ebx +use = () def = (15 ) in = () out = () pop eax ;restaure eax +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/sub1.fgs b/test/fgs-ref/sub1.fgs new file mode 100644 index 0000000..5b3cd76 --- /dev/null +++ b/test/fgs-ref/sub1.fgs @@ -0,0 +1,15 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 10 ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) sub r0, 5 ; +use = (0 ) def = (3 ) in = (0 ) out = () mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/sub2.fgs b/test/fgs-ref/sub2.fgs new file mode 100644 index 0000000..cec410f --- /dev/null +++ b/test/fgs-ref/sub2.fgs @@ -0,0 +1,15 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 7 ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) sub r0, 20 ; +use = (0 ) def = (3 ) in = (0 ) out = () mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/sub3.fgs b/test/fgs-ref/sub3.fgs new file mode 100644 index 0000000..95d9b35 --- /dev/null +++ b/test/fgs-ref/sub3.fgs @@ -0,0 +1,17 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (0 ) in = () out = (0 ) mov r0, 2 ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) sub r0, 1 ; +use = (0 ) def = (1 ) in = (0 ) out = (1 ) mov r1, r0 ; +use = (1 ) def = (1 ) in = (1 ) out = (1 ) sub r1, 1 ; +use = (1 ) def = (4 ) in = (1 ) out = () mov eax, r1 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/tab1.fgs b/test/fgs-ref/tab1.fgs new file mode 100644 index 0000000..231b91a --- /dev/null +++ b/test/fgs-ref/tab1.fgs @@ -0,0 +1,26 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (1 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (2 ) in = () out = (2 ) mov r2, 0 ; +use = (2 ) def = () in = (2 ) out = () mov dword [tab+4*r2], 0 ;Affect +use = () def = (3 ) in = () out = (3 ) mov r3, 1 ; +use = (3 ) def = () in = (3 ) out = () mov dword [tab+4*r3], 1 ;Affect +use = () def = (4 ) in = () out = (4 ) mov r4, 2 ; +use = (4 ) def = () in = (4 ) out = () mov dword [tab+4*r4], 2 ;Affect +use = () def = (6 ) in = () out = (6 ) mov r6, 0 ; +use = (6 ) def = (5 ) in = (6 ) out = () mov eax, dword [tab+4*r6] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (8 ) in = () out = (8 ) mov r8, 1 ; +use = (8 ) def = (7 ) in = (8 ) out = () mov eax, dword [tab+4*r8] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (10 ) in = () out = (10 ) mov r10, 2 ; +use = (10 ) def = (9 ) in = (10 ) out = () mov eax, dword [tab+4*r10] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/tab2.fgs b/test/fgs-ref/tab2.fgs new file mode 100644 index 0000000..de80c12 --- /dev/null +++ b/test/fgs-ref/tab2.fgs @@ -0,0 +1,33 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (3 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (4 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 4 ;allocation des variables locales +use = () def = () in = () out = () mov dword [ebp-4*1], 2 ;Affect +use = () def = (0 ) in = () out = (0 ) mov r0, dword [ebp-4*1] ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) add r0, 0 ; +use = (0 ) def = (5 ) in = (0 ) out = (5 ) mov r5, r0 ; +use = (5 ) def = () in = (5 ) out = () mov dword [tab+4*r5], 34 ;Affect +use = () def = (1 ) in = () out = (1 ) mov r1, dword [ebp-4*1] ; +use = (1 ) def = (1 ) in = (1 ) out = (1 ) add r1, 1 ; +use = (1 ) def = (6 ) in = (1 ) out = (6 ) mov r6, r1 ; +use = (6 ) def = () in = (6 ) out = () mov dword [tab+4*r6], 74 ;Affect +use = () def = (2 ) in = () out = (2 ) mov r2, dword [ebp-4*1] ; +use = (2 ) def = (2 ) in = (2 ) out = (2 ) add r2, 2 ; +use = (2 ) def = (7 ) in = (2 ) out = (7 ) mov r7, r2 ; +use = (7 ) def = () in = (7 ) out = () mov dword [tab+4*r7], 16 ;Affect +use = () def = (9 ) in = () out = (9 ) mov r9, 2 ; +use = (9 ) def = (8 ) in = (9 ) out = () mov eax, dword [tab+4*r9] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (11 ) in = () out = (11 ) mov r11, 3 ; +use = (11 ) def = (10 ) in = (11 ) out = () mov eax, dword [tab+4*r11] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (13 ) in = () out = (13 ) mov r13, 4 ; +use = (13 ) def = (12 ) in = (13 ) out = () mov eax, dword [tab+4*r13] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 4 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/tab3.fgs b/test/fgs-ref/tab3.fgs new file mode 100644 index 0000000..95adfbb --- /dev/null +++ b/test/fgs-ref/tab3.fgs @@ -0,0 +1,36 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (3 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (4 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 8 ;allocation des variables locales +use = () def = () in = () out = () mov dword [ebp-4*1], 2 ;Affect +use = () def = () in = () out = () mov dword [ebp-4*2], 0 ;Affect +use = () def = (0 ) in = () out = (0 ) mov r0, dword [ebp-4*1] ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) add r0, dword [ebp-4*2] ; +use = (0 ) def = (5 ) in = (0 ) out = (5 ) mov r5, r0 ; +use = (5 ) def = () in = (5 ) out = () mov dword [tab+4*r5], 34 ;Affect +use = () def = () in = () out = () mov dword [ebp-4*2], 1 ;Affect +use = () def = (1 ) in = () out = (1 ) mov r1, dword [ebp-4*1] ; +use = (1 ) def = (1 ) in = (1 ) out = (1 ) add r1, dword [ebp-4*2] ; +use = (1 ) def = (6 ) in = (1 ) out = (6 ) mov r6, r1 ; +use = (6 ) def = () in = (6 ) out = () mov dword [tab+4*r6], 74 ;Affect +use = () def = () in = () out = () mov dword [ebp-4*2], 2 ;Affect +use = () def = (2 ) in = () out = (2 ) mov r2, dword [ebp-4*1] ; +use = (2 ) def = (2 ) in = (2 ) out = (2 ) add r2, dword [ebp-4*2] ; +use = (2 ) def = (7 ) in = (2 ) out = (7 ) mov r7, r2 ; +use = (7 ) def = () in = (7 ) out = () mov dword [tab+4*r7], 16 ;Affect +use = () def = (9 ) in = () out = (9 ) mov r9, 2 ; +use = (9 ) def = (8 ) in = (9 ) out = () mov eax, dword [tab+4*r9] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (11 ) in = () out = (11 ) mov r11, 3 ; +use = (11 ) def = (10 ) in = (11 ) out = () mov eax, dword [tab+4*r11] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (13 ) in = () out = (13 ) mov r13, 4 ; +use = (13 ) def = (12 ) in = (13 ) out = () mov eax, dword [tab+4*r13] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 8 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/tab4.fgs b/test/fgs-ref/tab4.fgs new file mode 100644 index 0000000..c0d4f8a --- /dev/null +++ b/test/fgs-ref/tab4.fgs @@ -0,0 +1,30 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = (3 ) in = () out = (3 ) mov r3, 0 ; +use = (3 ) def = () in = (3 ) out = () mov dword [tab+4*r3], 1 ;Affect +use = () def = (5 ) in = () out = (5 ) mov r5, 0 ; +use = (5 ) def = (4 ) in = (5 ) out = (4 ) mov r4, dword [tab+4*r5] ; +use = (4 ) def = () in = (4 ) out = () mov dword [tab+4*r4], 12 ;Affect +use = () def = (6 ) in = () out = (6 ) mov r6, 0 ; +use = (6 ) def = (0 ) in = (6 ) out = (0 ) mov r0, dword [tab+4*r6] ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) add r0, 1 ; +use = (0 ) def = (7 ) in = (0 ) out = (7 ) mov r7, r0 ; +use = (7 ) def = () in = (7 ) out = () mov dword [tab+4*r7], 13 ;Affect +use = () def = (9 ) in = () out = (9 ) mov r9, 0 ; +use = (9 ) def = (8 ) in = (9 ) out = () mov eax, dword [tab+4*r9] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (11 ) in = () out = (11 ) mov r11, 1 ; +use = (11 ) def = (10 ) in = (11 ) out = () mov eax, dword [tab+4*r11] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (13 ) in = () out = (13 ) mov r13, 2 ; +use = (13 ) def = (12 ) in = (13 ) out = () mov eax, dword [tab+4*r13] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/tantque1.fgs b/test/fgs-ref/tantque1.fgs new file mode 100644 index 0000000..d7bf6e0 --- /dev/null +++ b/test/fgs-ref/tantque1.fgs @@ -0,0 +1,27 @@ +iter num = 9 +use = () def = () in = () out = () call main ; +use = () def = (2 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (3 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 4 ;allocation des variables locales +use = () def = () in = () out = () mov dword [ebp-4*1], 10 ;Affect +use = () def = (0 ) in = () out = (0 ) l0 : mov r0, 1 ;Affect +use = () def = (4 ) in = (0 ) out = (0 4 ) mov r4, 0 ;JumpIfLess 1 +use = (4 ) def = () in = (0 4 ) out = (0 ) cmp r4, dword [ebp-4*1] ;on passe par un registre temporaire +use = () def = () in = (0 ) out = (0 ) jl l2 ;JumpIfLess 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = () in = (0 ) out = () l2 : cmp r0, 0 ;JumpIfEqual 1 +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = (5 ) in = () out = () mov eax, dword [ebp-4*1] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (1 ) in = () out = (1 ) mov r1, dword [ebp-4*1] ; +use = (1 ) def = (1 ) in = (1 ) out = (1 ) sub r1, 1 ; +use = (1 ) def = () in = (1 ) out = () mov dword [ebp-4*1], r1 ;Affect +use = () def = () in = () out = () jmp l0 ;Jump +use = () def = (6 ) in = () out = () l1 : mov eax, 0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 4 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/tantque2.fgs b/test/fgs-ref/tantque2.fgs new file mode 100644 index 0000000..279c4df --- /dev/null +++ b/test/fgs-ref/tantque2.fgs @@ -0,0 +1,37 @@ +iter num = 7 +use = () def = () in = () out = () call main ; +use = () def = (4 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (5 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 8 ;allocation des variables locales +use = () def = () in = () out = () mov dword [ebp-4*1], 0 ;Affect +use = () def = (0 ) in = () out = (0 ) l0 : mov r0, 1 ;Affect +use = () def = () in = (0 ) out = (0 ) cmp dword [ebp-4*1], 4 ;JumpIfLess 1 +use = () def = () in = (0 ) out = (0 ) jl l2 ;JumpIfLess 2 +use = () def = (0 ) in = () out = (0 ) mov r0, 0 ;Affect +use = (0 ) def = () in = (0 ) out = () l2 : cmp r0, 0 ;JumpIfEqual 1 +use = () def = () in = () out = () je l1 ;JumpIfEqual 2 +use = () def = () in = () out = () mov dword [ebp-4*2], 0 ;Affect +use = () def = (1 ) in = () out = (1 ) l3 : mov r1, 1 ;Affect +use = () def = () in = (1 ) out = (1 ) cmp dword [ebp-4*2], 4 ;JumpIfLess 1 +use = () def = () in = (1 ) out = (1 ) jl l5 ;JumpIfLess 2 +use = () def = (1 ) in = () out = (1 ) mov r1, 0 ;Affect +use = (1 ) def = () in = (1 ) out = () l5 : cmp r1, 0 ;JumpIfEqual 1 +use = () def = () in = () out = () je l4 ;JumpIfEqual 2 +use = () def = (6 ) in = () out = () mov eax, dword [ebp-4*1] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (7 ) in = () out = () mov eax, dword [ebp-4*2] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (2 ) in = () out = (2 ) mov r2, dword [ebp-4*2] ; +use = (2 ) def = (2 ) in = (2 ) out = (2 ) add r2, 1 ; +use = (2 ) def = () in = (2 ) out = () mov dword [ebp-4*2], r2 ;Affect +use = () def = () in = () out = () jmp l3 ;Jump +use = () def = (3 ) in = () out = (3 ) l4 : mov r3, dword [ebp-4*1] ; +use = (3 ) def = (3 ) in = (3 ) out = (3 ) add r3, 1 ; +use = (3 ) def = () in = (3 ) out = () mov dword [ebp-4*1], r3 ;Affect +use = () def = () in = () out = () jmp l0 ;Jump +use = () def = () in = () out = () l1 : add esp, 8 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/varglob1.fgs b/test/fgs-ref/varglob1.fgs new file mode 100644 index 0000000..72148c7 --- /dev/null +++ b/test/fgs-ref/varglob1.fgs @@ -0,0 +1,14 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (1 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () mov dword [variable], 6834 ;Affect +use = () def = (2 ) in = () out = () mov eax, dword [variable] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/varglob2.fgs b/test/fgs-ref/varglob2.fgs new file mode 100644 index 0000000..b4190b6 --- /dev/null +++ b/test/fgs-ref/varglob2.fgs @@ -0,0 +1,16 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () mov dword [variable], 10 ;Affect +use = () def = (0 ) in = () out = (0 ) mov r0, dword [variable] ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) add r0, 50 ; +use = (0 ) def = (3 ) in = (0 ) out = () mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/varglob3.fgs b/test/fgs-ref/varglob3.fgs new file mode 100644 index 0000000..35eebac --- /dev/null +++ b/test/fgs-ref/varglob3.fgs @@ -0,0 +1,17 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (1 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () mov dword [var1], 10 ;Affect +use = () def = () in = () out = () mov dword [var2], 34 ;Affect +use = () def = (2 ) in = () out = () mov eax, dword [var1] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (3 ) in = () out = () mov eax, dword [var2] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/varglob4.fgs b/test/fgs-ref/varglob4.fgs new file mode 100644 index 0000000..6405a6f --- /dev/null +++ b/test/fgs-ref/varglob4.fgs @@ -0,0 +1,17 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () mov dword [var1], 10 ;Affect +use = () def = () in = () out = () mov dword [var2], 34 ;Affect +use = () def = (0 ) in = () out = (0 ) mov r0, dword [var1] ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) add r0, dword [var2] ; +use = (0 ) def = (3 ) in = (0 ) out = () mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/varloc1.fgs b/test/fgs-ref/varloc1.fgs new file mode 100644 index 0000000..591bef1 --- /dev/null +++ b/test/fgs-ref/varloc1.fgs @@ -0,0 +1,14 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (1 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 4 ;allocation des variables locales +use = () def = () in = () out = () mov dword [ebp-4*1], 6834 ;Affect +use = () def = (2 ) in = () out = () mov eax, dword [ebp-4*1] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 4 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/varloc2.fgs b/test/fgs-ref/varloc2.fgs new file mode 100644 index 0000000..3d7d2c7 --- /dev/null +++ b/test/fgs-ref/varloc2.fgs @@ -0,0 +1,16 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 4 ;allocation des variables locales +use = () def = () in = () out = () mov dword [ebp-4*1], 10 ;Affect +use = () def = (0 ) in = () out = (0 ) mov r0, dword [ebp-4*1] ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) add r0, 50 ; +use = (0 ) def = (3 ) in = (0 ) out = () mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 4 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/varloc3.fgs b/test/fgs-ref/varloc3.fgs new file mode 100644 index 0000000..e38d572 --- /dev/null +++ b/test/fgs-ref/varloc3.fgs @@ -0,0 +1,17 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (0 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (1 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 8 ;allocation des variables locales +use = () def = () in = () out = () mov dword [ebp-4*1], 10 ;Affect +use = () def = () in = () out = () mov dword [ebp-4*2], 30 ;Affect +use = () def = (2 ) in = () out = () mov eax, dword [ebp-4*1] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = (3 ) in = () out = () mov eax, dword [ebp-4*2] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 8 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/varloc4.fgs b/test/fgs-ref/varloc4.fgs new file mode 100644 index 0000000..0357bac --- /dev/null +++ b/test/fgs-ref/varloc4.fgs @@ -0,0 +1,17 @@ +iter num = 3 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 8 ;allocation des variables locales +use = () def = () in = () out = () mov dword [ebp-4*1], 10 ;Affect +use = () def = () in = () out = () mov dword [ebp-4*2], 30 ;Affect +use = () def = (0 ) in = () out = (0 ) mov r0, dword [ebp-4*1] ; +use = (0 ) def = (0 ) in = (0 ) out = (0 ) add r0, dword [ebp-4*2] ; +use = (0 ) def = (3 ) in = (0 ) out = () mov eax, r0 ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 8 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/fgs-ref/varloc5.fgs b/test/fgs-ref/varloc5.fgs new file mode 100644 index 0000000..74ee639 --- /dev/null +++ b/test/fgs-ref/varloc5.fgs @@ -0,0 +1,26 @@ +iter num = 1 +use = () def = () in = () out = () call main ; +use = () def = (1 ) in = () out = () mov ebx, 0 ; valeur de retour du programme +use = () def = (2 ) in = () out = () mov eax, 1 ; +use = () def = () in = () out = () int 0x80 ; +use = () def = () in = () out = () f : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 4 ;allocation des variables locales +use = () def = () in = () out = () mov dword [ebp-4*1], 10 ;Affect +use = () def = (3 ) in = () out = () mov eax, dword [ebp-4*1] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 4 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; +use = () def = () in = () out = () main : push ebp ;sauvegarde la valeur de ebp +use = () def = () in = () out = () mov ebp, esp ;nouvelle valeur de ebp +use = () def = () in = () out = () sub esp, 0 ;allocation des variables locales +use = () def = () in = () out = () mov dword [var1], 20 ;Affect +use = () def = () in = () out = () sub esp, 4 ;allocation mémoire pour la valeur de retour +use = () def = () in = () out = () call f ; +use = () def = (0 ) in = () out = () pop r0 ;récupération de la valeur de retour +use = () def = (4 ) in = () out = () mov eax, dword [var1] ;Write 1 +use = () def = () in = () out = () call iprintLF ;Write 2 +use = () def = () in = () out = () add esp, 0 ;désallocation des variables locales +use = () def = () in = () out = () pop ebp ;restaure la valeur de ebp +use = () def = () in = () out = () ret ; diff --git a/test/ig-ref/add1.ig b/test/ig-ref/add1.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/add1.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/add2.ig b/test/ig-ref/add2.ig new file mode 100644 index 0000000..858571f --- /dev/null +++ b/test/ig-ref/add2.ig @@ -0,0 +1,5 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) diff --git a/test/ig-ref/affect1.ig b/test/ig-ref/affect1.ig new file mode 100644 index 0000000..9081252 --- /dev/null +++ b/test/ig-ref/affect1.ig @@ -0,0 +1,3 @@ +0 : ( ) +1 : ( ) +2 : ( ) diff --git a/test/ig-ref/affect2.ig b/test/ig-ref/affect2.ig new file mode 100644 index 0000000..9081252 --- /dev/null +++ b/test/ig-ref/affect2.ig @@ -0,0 +1,3 @@ +0 : ( ) +1 : ( ) +2 : ( ) diff --git a/test/ig-ref/affect3.ig b/test/ig-ref/affect3.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/affect3.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/and1.ig b/test/ig-ref/and1.ig new file mode 100644 index 0000000..9fbbbab --- /dev/null +++ b/test/ig-ref/and1.ig @@ -0,0 +1,6 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) diff --git a/test/ig-ref/and2.ig b/test/ig-ref/and2.ig new file mode 100644 index 0000000..9fbbbab --- /dev/null +++ b/test/ig-ref/and2.ig @@ -0,0 +1,6 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) diff --git a/test/ig-ref/and3.ig b/test/ig-ref/and3.ig new file mode 100644 index 0000000..9fbbbab --- /dev/null +++ b/test/ig-ref/and3.ig @@ -0,0 +1,6 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) diff --git a/test/ig-ref/and4.ig b/test/ig-ref/and4.ig new file mode 100644 index 0000000..9fbbbab --- /dev/null +++ b/test/ig-ref/and4.ig @@ -0,0 +1,6 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) diff --git a/test/ig-ref/and5.ig b/test/ig-ref/and5.ig new file mode 100644 index 0000000..b8523b9 --- /dev/null +++ b/test/ig-ref/and5.ig @@ -0,0 +1,8 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) +6 : ( ) +7 : ( ) diff --git a/test/ig-ref/appel-param1.ig b/test/ig-ref/appel-param1.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/appel-param1.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/appel-param2.ig b/test/ig-ref/appel-param2.ig new file mode 100644 index 0000000..858571f --- /dev/null +++ b/test/ig-ref/appel-param2.ig @@ -0,0 +1,5 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) diff --git a/test/ig-ref/appel-param3.ig b/test/ig-ref/appel-param3.ig new file mode 100644 index 0000000..b8523b9 --- /dev/null +++ b/test/ig-ref/appel-param3.ig @@ -0,0 +1,8 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) +6 : ( ) +7 : ( ) diff --git a/test/ig-ref/appel-retour1.ig b/test/ig-ref/appel-retour1.ig new file mode 100644 index 0000000..858571f --- /dev/null +++ b/test/ig-ref/appel-retour1.ig @@ -0,0 +1,5 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) diff --git a/test/ig-ref/appel1.ig b/test/ig-ref/appel1.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/appel1.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/appel2.ig b/test/ig-ref/appel2.ig new file mode 100644 index 0000000..9fbbbab --- /dev/null +++ b/test/ig-ref/appel2.ig @@ -0,0 +1,6 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) diff --git a/test/ig-ref/appel3.ig b/test/ig-ref/appel3.ig new file mode 100644 index 0000000..9fbbbab --- /dev/null +++ b/test/ig-ref/appel3.ig @@ -0,0 +1,6 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) diff --git a/test/ig-ref/div1.ig b/test/ig-ref/div1.ig new file mode 100644 index 0000000..310c1f5 --- /dev/null +++ b/test/ig-ref/div1.ig @@ -0,0 +1,7 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( 5 ) +5 : ( 4 ) +6 : ( ) diff --git a/test/ig-ref/div2.ig b/test/ig-ref/div2.ig new file mode 100644 index 0000000..310c1f5 --- /dev/null +++ b/test/ig-ref/div2.ig @@ -0,0 +1,7 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( 5 ) +5 : ( 4 ) +6 : ( ) diff --git a/test/ig-ref/div3.ig b/test/ig-ref/div3.ig new file mode 100644 index 0000000..cc89801 --- /dev/null +++ b/test/ig-ref/div3.ig @@ -0,0 +1,11 @@ +0 : ( 9 ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( 9 6 ) +6 : ( 5 9 ) +7 : ( ) +8 : ( 9 ) +9 : ( 8 0 5 6 ) +10 : ( ) diff --git a/test/ig-ref/div4.ig b/test/ig-ref/div4.ig new file mode 100644 index 0000000..310c1f5 --- /dev/null +++ b/test/ig-ref/div4.ig @@ -0,0 +1,7 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( 5 ) +5 : ( 4 ) +6 : ( ) diff --git a/test/ig-ref/ecrire1.ig b/test/ig-ref/ecrire1.ig new file mode 100644 index 0000000..9081252 --- /dev/null +++ b/test/ig-ref/ecrire1.ig @@ -0,0 +1,3 @@ +0 : ( ) +1 : ( ) +2 : ( ) diff --git a/test/ig-ref/ecrire2.ig b/test/ig-ref/ecrire2.ig new file mode 100644 index 0000000..9081252 --- /dev/null +++ b/test/ig-ref/ecrire2.ig @@ -0,0 +1,3 @@ +0 : ( ) +1 : ( ) +2 : ( ) diff --git a/test/ig-ref/egal1.ig b/test/ig-ref/egal1.ig new file mode 100644 index 0000000..409eea4 --- /dev/null +++ b/test/ig-ref/egal1.ig @@ -0,0 +1,5 @@ +0 : ( 3 ) +1 : ( ) +2 : ( ) +3 : ( 0 ) +4 : ( ) diff --git a/test/ig-ref/egal2.ig b/test/ig-ref/egal2.ig new file mode 100644 index 0000000..409eea4 --- /dev/null +++ b/test/ig-ref/egal2.ig @@ -0,0 +1,5 @@ +0 : ( 3 ) +1 : ( ) +2 : ( ) +3 : ( 0 ) +4 : ( ) diff --git a/test/ig-ref/egal3.ig b/test/ig-ref/egal3.ig new file mode 100644 index 0000000..36be12e --- /dev/null +++ b/test/ig-ref/egal3.ig @@ -0,0 +1,6 @@ +0 : ( 1 ) +1 : ( 0 4 ) +2 : ( ) +3 : ( ) +4 : ( 1 ) +5 : ( ) diff --git a/test/ig-ref/err5.ig b/test/ig-ref/err5.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/err5.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/fibo.ig b/test/ig-ref/fibo.ig new file mode 100644 index 0000000..995a6d6 --- /dev/null +++ b/test/ig-ref/fibo.ig @@ -0,0 +1,35 @@ +0 : ( ) +1 : ( ) +2 : ( 4 5 ) +3 : ( ) +4 : ( 6 2 ) +5 : ( 2 ) +6 : ( 4 ) +7 : ( ) +8 : ( ) +9 : ( ) +10 : ( ) +11 : ( ) +12 : ( ) +13 : ( ) +14 : ( ) +15 : ( ) +16 : ( ) +17 : ( ) +18 : ( ) +19 : ( ) +20 : ( ) +21 : ( ) +22 : ( ) +23 : ( ) +24 : ( ) +25 : ( ) +26 : ( ) +27 : ( ) +28 : ( ) +29 : ( ) +30 : ( ) +31 : ( ) +32 : ( ) +33 : ( ) +34 : ( ) diff --git a/test/ig-ref/inf1.ig b/test/ig-ref/inf1.ig new file mode 100644 index 0000000..409eea4 --- /dev/null +++ b/test/ig-ref/inf1.ig @@ -0,0 +1,5 @@ +0 : ( 3 ) +1 : ( ) +2 : ( ) +3 : ( 0 ) +4 : ( ) diff --git a/test/ig-ref/inf2.ig b/test/ig-ref/inf2.ig new file mode 100644 index 0000000..409eea4 --- /dev/null +++ b/test/ig-ref/inf2.ig @@ -0,0 +1,5 @@ +0 : ( 3 ) +1 : ( ) +2 : ( ) +3 : ( 0 ) +4 : ( ) diff --git a/test/ig-ref/inf3.ig b/test/ig-ref/inf3.ig new file mode 100644 index 0000000..409eea4 --- /dev/null +++ b/test/ig-ref/inf3.ig @@ -0,0 +1,5 @@ +0 : ( 3 ) +1 : ( ) +2 : ( ) +3 : ( 0 ) +4 : ( ) diff --git a/test/ig-ref/inf4.ig b/test/ig-ref/inf4.ig new file mode 100644 index 0000000..36be12e --- /dev/null +++ b/test/ig-ref/inf4.ig @@ -0,0 +1,6 @@ +0 : ( 1 ) +1 : ( 0 4 ) +2 : ( ) +3 : ( ) +4 : ( 1 ) +5 : ( ) diff --git a/test/ig-ref/mult1.ig b/test/ig-ref/mult1.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/mult1.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/mult2.ig b/test/ig-ref/mult2.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/mult2.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/mult3.ig b/test/ig-ref/mult3.ig new file mode 100644 index 0000000..858571f --- /dev/null +++ b/test/ig-ref/mult3.ig @@ -0,0 +1,5 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) diff --git a/test/ig-ref/not1.ig b/test/ig-ref/not1.ig new file mode 100644 index 0000000..409eea4 --- /dev/null +++ b/test/ig-ref/not1.ig @@ -0,0 +1,5 @@ +0 : ( 3 ) +1 : ( ) +2 : ( ) +3 : ( 0 ) +4 : ( ) diff --git a/test/ig-ref/not2.ig b/test/ig-ref/not2.ig new file mode 100644 index 0000000..409eea4 --- /dev/null +++ b/test/ig-ref/not2.ig @@ -0,0 +1,5 @@ +0 : ( 3 ) +1 : ( ) +2 : ( ) +3 : ( 0 ) +4 : ( ) diff --git a/test/ig-ref/not3.ig b/test/ig-ref/not3.ig new file mode 100644 index 0000000..36be12e --- /dev/null +++ b/test/ig-ref/not3.ig @@ -0,0 +1,6 @@ +0 : ( 1 ) +1 : ( 0 4 ) +2 : ( ) +3 : ( ) +4 : ( 1 ) +5 : ( ) diff --git a/test/ig-ref/or1.ig b/test/ig-ref/or1.ig new file mode 100644 index 0000000..9fbbbab --- /dev/null +++ b/test/ig-ref/or1.ig @@ -0,0 +1,6 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) diff --git a/test/ig-ref/or2.ig b/test/ig-ref/or2.ig new file mode 100644 index 0000000..9fbbbab --- /dev/null +++ b/test/ig-ref/or2.ig @@ -0,0 +1,6 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) diff --git a/test/ig-ref/or3.ig b/test/ig-ref/or3.ig new file mode 100644 index 0000000..9fbbbab --- /dev/null +++ b/test/ig-ref/or3.ig @@ -0,0 +1,6 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) diff --git a/test/ig-ref/or4.ig b/test/ig-ref/or4.ig new file mode 100644 index 0000000..9fbbbab --- /dev/null +++ b/test/ig-ref/or4.ig @@ -0,0 +1,6 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) diff --git a/test/ig-ref/or5.ig b/test/ig-ref/or5.ig new file mode 100644 index 0000000..b8523b9 --- /dev/null +++ b/test/ig-ref/or5.ig @@ -0,0 +1,8 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) +6 : ( ) +7 : ( ) diff --git a/test/ig-ref/parenth1.ig b/test/ig-ref/parenth1.ig new file mode 100644 index 0000000..9081252 --- /dev/null +++ b/test/ig-ref/parenth1.ig @@ -0,0 +1,3 @@ +0 : ( ) +1 : ( ) +2 : ( ) diff --git a/test/ig-ref/parenth2.ig b/test/ig-ref/parenth2.ig new file mode 100644 index 0000000..9081252 --- /dev/null +++ b/test/ig-ref/parenth2.ig @@ -0,0 +1,3 @@ +0 : ( ) +1 : ( ) +2 : ( ) diff --git a/test/ig-ref/prio23-1.ig b/test/ig-ref/prio23-1.ig new file mode 100644 index 0000000..01906f1 --- /dev/null +++ b/test/ig-ref/prio23-1.ig @@ -0,0 +1,6 @@ +0 : ( 4 ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( 0 ) +5 : ( ) diff --git a/test/ig-ref/prio23-2.ig b/test/ig-ref/prio23-2.ig new file mode 100644 index 0000000..3c46084 --- /dev/null +++ b/test/ig-ref/prio23-2.ig @@ -0,0 +1,6 @@ +0 : ( 1 4 ) +1 : ( 0 ) +2 : ( ) +3 : ( ) +4 : ( 0 ) +5 : ( ) diff --git a/test/ig-ref/prio23-3.ig b/test/ig-ref/prio23-3.ig new file mode 100644 index 0000000..2c85526 --- /dev/null +++ b/test/ig-ref/prio23-3.ig @@ -0,0 +1,9 @@ +0 : ( 4 7 ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( 7 0 ) +5 : ( ) +6 : ( 7 ) +7 : ( 6 4 0 ) +8 : ( ) diff --git a/test/ig-ref/prio23-4.ig b/test/ig-ref/prio23-4.ig new file mode 100644 index 0000000..a6f0114 --- /dev/null +++ b/test/ig-ref/prio23-4.ig @@ -0,0 +1,10 @@ +0 : ( 6 1 5 8 ) +1 : ( 6 8 0 ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( 8 0 ) +6 : ( 8 1 0 ) +7 : ( ) +8 : ( 6 1 5 0 ) +9 : ( ) diff --git a/test/ig-ref/prio34-1.ig b/test/ig-ref/prio34-1.ig new file mode 100644 index 0000000..651a70a --- /dev/null +++ b/test/ig-ref/prio34-1.ig @@ -0,0 +1,5 @@ +0 : ( 1 ) +1 : ( 0 ) +2 : ( ) +3 : ( ) +4 : ( ) diff --git a/test/ig-ref/prio34-2.ig b/test/ig-ref/prio34-2.ig new file mode 100644 index 0000000..858571f --- /dev/null +++ b/test/ig-ref/prio34-2.ig @@ -0,0 +1,5 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) diff --git a/test/ig-ref/prio34-3.ig b/test/ig-ref/prio34-3.ig new file mode 100644 index 0000000..896201f --- /dev/null +++ b/test/ig-ref/prio34-3.ig @@ -0,0 +1,8 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( 6 ) +6 : ( 5 ) +7 : ( ) diff --git a/test/ig-ref/prio34-4.ig b/test/ig-ref/prio34-4.ig new file mode 100644 index 0000000..160bcbd --- /dev/null +++ b/test/ig-ref/prio34-4.ig @@ -0,0 +1,8 @@ +0 : ( 1 ) +1 : ( 0 ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( 6 ) +6 : ( 5 ) +7 : ( ) diff --git a/test/ig-ref/prio45-1.ig b/test/ig-ref/prio45-1.ig new file mode 100644 index 0000000..3e68789 --- /dev/null +++ b/test/ig-ref/prio45-1.ig @@ -0,0 +1,6 @@ +0 : ( 4 1 ) +1 : ( 4 0 ) +2 : ( ) +3 : ( ) +4 : ( 1 0 ) +5 : ( ) diff --git a/test/ig-ref/prio45-2.ig b/test/ig-ref/prio45-2.ig new file mode 100644 index 0000000..651a70a --- /dev/null +++ b/test/ig-ref/prio45-2.ig @@ -0,0 +1,5 @@ +0 : ( 1 ) +1 : ( 0 ) +2 : ( ) +3 : ( ) +4 : ( ) diff --git a/test/ig-ref/prio45-3.ig b/test/ig-ref/prio45-3.ig new file mode 100644 index 0000000..3e68789 --- /dev/null +++ b/test/ig-ref/prio45-3.ig @@ -0,0 +1,6 @@ +0 : ( 4 1 ) +1 : ( 4 0 ) +2 : ( ) +3 : ( ) +4 : ( 1 0 ) +5 : ( ) diff --git a/test/ig-ref/prio45-4.ig b/test/ig-ref/prio45-4.ig new file mode 100644 index 0000000..651a70a --- /dev/null +++ b/test/ig-ref/prio45-4.ig @@ -0,0 +1,5 @@ +0 : ( 1 ) +1 : ( 0 ) +2 : ( ) +3 : ( ) +4 : ( ) diff --git a/test/ig-ref/prio56-1.ig b/test/ig-ref/prio56-1.ig new file mode 100644 index 0000000..5a5fe88 --- /dev/null +++ b/test/ig-ref/prio56-1.ig @@ -0,0 +1,7 @@ +0 : ( ) +1 : ( 4 ) +2 : ( ) +3 : ( ) +4 : ( 1 ) +5 : ( ) +6 : ( ) diff --git a/test/ig-ref/prio56-2.ig b/test/ig-ref/prio56-2.ig new file mode 100644 index 0000000..70471f1 --- /dev/null +++ b/test/ig-ref/prio56-2.ig @@ -0,0 +1,7 @@ +0 : ( ) +1 : ( 5 4 ) +2 : ( ) +3 : ( ) +4 : ( 1 ) +5 : ( 1 ) +6 : ( ) diff --git a/test/ig-ref/prio67-1.ig b/test/ig-ref/prio67-1.ig new file mode 100644 index 0000000..b8523b9 --- /dev/null +++ b/test/ig-ref/prio67-1.ig @@ -0,0 +1,8 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) +6 : ( ) +7 : ( ) diff --git a/test/ig-ref/prio67-2.ig b/test/ig-ref/prio67-2.ig new file mode 100644 index 0000000..2ca8a44 --- /dev/null +++ b/test/ig-ref/prio67-2.ig @@ -0,0 +1,8 @@ +0 : ( ) +1 : ( 6 ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) +6 : ( 1 ) +7 : ( ) diff --git a/test/ig-ref/rec1.ig b/test/ig-ref/rec1.ig new file mode 100644 index 0000000..38c4a8b --- /dev/null +++ b/test/ig-ref/rec1.ig @@ -0,0 +1,33 @@ +0 : ( ) +1 : ( ) +2 : ( 4 ) +3 : ( ) +4 : ( 2 ) +5 : ( ) +6 : ( ) +7 : ( ) +8 : ( ) +9 : ( ) +10 : ( ) +11 : ( ) +12 : ( ) +13 : ( ) +14 : ( ) +15 : ( ) +16 : ( ) +17 : ( ) +18 : ( ) +19 : ( ) +20 : ( ) +21 : ( ) +22 : ( ) +23 : ( ) +24 : ( ) +25 : ( ) +26 : ( ) +27 : ( ) +28 : ( ) +29 : ( ) +30 : ( ) +31 : ( ) +32 : ( ) diff --git a/test/ig-ref/si1.ig b/test/ig-ref/si1.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/si1.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/si2.ig b/test/ig-ref/si2.ig new file mode 100644 index 0000000..858571f --- /dev/null +++ b/test/ig-ref/si2.ig @@ -0,0 +1,5 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) diff --git a/test/ig-ref/si3.ig b/test/ig-ref/si3.ig new file mode 100644 index 0000000..9fbbbab --- /dev/null +++ b/test/ig-ref/si3.ig @@ -0,0 +1,6 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) diff --git a/test/ig-ref/si4.ig b/test/ig-ref/si4.ig new file mode 100644 index 0000000..9fbbbab --- /dev/null +++ b/test/ig-ref/si4.ig @@ -0,0 +1,6 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) diff --git a/test/ig-ref/si5.ig b/test/ig-ref/si5.ig new file mode 100644 index 0000000..99b007e --- /dev/null +++ b/test/ig-ref/si5.ig @@ -0,0 +1,16 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) +6 : ( ) +7 : ( ) +8 : ( ) +9 : ( ) +10 : ( ) +11 : ( ) +12 : ( ) +13 : ( ) +14 : ( ) +15 : ( ) diff --git a/test/ig-ref/sub1.ig b/test/ig-ref/sub1.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/sub1.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/sub2.ig b/test/ig-ref/sub2.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/sub2.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/sub3.ig b/test/ig-ref/sub3.ig new file mode 100644 index 0000000..858571f --- /dev/null +++ b/test/ig-ref/sub3.ig @@ -0,0 +1,5 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) diff --git a/test/ig-ref/tab1.ig b/test/ig-ref/tab1.ig new file mode 100644 index 0000000..296dc40 --- /dev/null +++ b/test/ig-ref/tab1.ig @@ -0,0 +1,11 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) +6 : ( ) +7 : ( ) +8 : ( ) +9 : ( ) +10 : ( ) diff --git a/test/ig-ref/tab2.ig b/test/ig-ref/tab2.ig new file mode 100644 index 0000000..3687f68 --- /dev/null +++ b/test/ig-ref/tab2.ig @@ -0,0 +1,14 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) +6 : ( ) +7 : ( ) +8 : ( ) +9 : ( ) +10 : ( ) +11 : ( ) +12 : ( ) +13 : ( ) diff --git a/test/ig-ref/tab3.ig b/test/ig-ref/tab3.ig new file mode 100644 index 0000000..3687f68 --- /dev/null +++ b/test/ig-ref/tab3.ig @@ -0,0 +1,14 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) +6 : ( ) +7 : ( ) +8 : ( ) +9 : ( ) +10 : ( ) +11 : ( ) +12 : ( ) +13 : ( ) diff --git a/test/ig-ref/tab4.ig b/test/ig-ref/tab4.ig new file mode 100644 index 0000000..3687f68 --- /dev/null +++ b/test/ig-ref/tab4.ig @@ -0,0 +1,14 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) +6 : ( ) +7 : ( ) +8 : ( ) +9 : ( ) +10 : ( ) +11 : ( ) +12 : ( ) +13 : ( ) diff --git a/test/ig-ref/tantque1.ig b/test/ig-ref/tantque1.ig new file mode 100644 index 0000000..95f1f94 --- /dev/null +++ b/test/ig-ref/tantque1.ig @@ -0,0 +1,7 @@ +0 : ( 4 ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( 0 ) +5 : ( ) +6 : ( ) diff --git a/test/ig-ref/tantque2.ig b/test/ig-ref/tantque2.ig new file mode 100644 index 0000000..b8523b9 --- /dev/null +++ b/test/ig-ref/tantque2.ig @@ -0,0 +1,8 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) +5 : ( ) +6 : ( ) +7 : ( ) diff --git a/test/ig-ref/varglob1.ig b/test/ig-ref/varglob1.ig new file mode 100644 index 0000000..9081252 --- /dev/null +++ b/test/ig-ref/varglob1.ig @@ -0,0 +1,3 @@ +0 : ( ) +1 : ( ) +2 : ( ) diff --git a/test/ig-ref/varglob2.ig b/test/ig-ref/varglob2.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/varglob2.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/varglob3.ig b/test/ig-ref/varglob3.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/varglob3.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/varglob4.ig b/test/ig-ref/varglob4.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/varglob4.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/varloc1.ig b/test/ig-ref/varloc1.ig new file mode 100644 index 0000000..9081252 --- /dev/null +++ b/test/ig-ref/varloc1.ig @@ -0,0 +1,3 @@ +0 : ( ) +1 : ( ) +2 : ( ) diff --git a/test/ig-ref/varloc2.ig b/test/ig-ref/varloc2.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/varloc2.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/varloc3.ig b/test/ig-ref/varloc3.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/varloc3.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/varloc4.ig b/test/ig-ref/varloc4.ig new file mode 100644 index 0000000..3ac5b32 --- /dev/null +++ b/test/ig-ref/varloc4.ig @@ -0,0 +1,4 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) diff --git a/test/ig-ref/varloc5.ig b/test/ig-ref/varloc5.ig new file mode 100644 index 0000000..858571f --- /dev/null +++ b/test/ig-ref/varloc5.ig @@ -0,0 +1,5 @@ +0 : ( ) +1 : ( ) +2 : ( ) +3 : ( ) +4 : ( ) diff --git a/test/input/.gitignore b/test/input/.gitignore new file mode 100644 index 0000000..970de74 --- /dev/null +++ b/test/input/.gitignore @@ -0,0 +1,17 @@ +*\.sc +*\.sa +*\.saout +*\.ts +*\.c3a +*\.c3aout +*\.pre-nasm +*\.pre-nasmout +*\.fg +*\.fgs +*\.ig +*\.nasm +*\.nasmout +*\.exe +*\.exeout +*\.out +*\.o diff --git a/test/input/add1.l b/test/input/add1.l new file mode 100644 index 0000000..ba80541 --- /dev/null +++ b/test/input/add1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(3 + 10); +} diff --git a/test/input/add1.s b/test/input/add1.s new file mode 100644 index 0000000..e37fb34 --- /dev/null +++ b/test/input/add1.s @@ -0,0 +1,20 @@ +.include "io_arm.asm" + + +.data + +.text +.global _start +_start: + bl main + mov r7, #1 //exit syscall + svc #0 //Syscall +main : push {r11,r14} //prologue func + mov r0, #3 + add r0, r0, #10 + push {r7,r14} //Sauvegarde r7 et lr + mov r7, #4 //Write syscall + svc #0 //syscall + pop {r7,r15} //Restauration de r7 et pc + pop {r11,r15} //epilogue func + bx lr diff --git a/test/input/add2.l b/test/input/add2.l new file mode 100644 index 0000000..7f179b2 --- /dev/null +++ b/test/input/add2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(2 + 4 + 8); +} diff --git a/test/input/add2.s b/test/input/add2.s new file mode 100644 index 0000000..308cfa2 --- /dev/null +++ b/test/input/add2.s @@ -0,0 +1,21 @@ +.include "io_arm.asm" + + +.data + +.text +.global _start +_start: + bl main + mov r7, #1 //exit syscall + svc #0 //Syscall +main : push {r11,r14} //prologue func + mov r1, #2 + add r1, r1, #4 + add r0, r2, #8 + push {r7,r14} //Sauvegarde r7 et lr + mov r7, #4 //Write syscall + svc #0 //syscall + pop {r7,r15} //Restauration de r7 et pc + pop {r11,r15} //epilogue func + bx lr diff --git a/test/input/affect1.l b/test/input/affect1.l new file mode 100644 index 0000000..cff6425 --- /dev/null +++ b/test/input/affect1.l @@ -0,0 +1,6 @@ +entier a +main() +{ +a = 1; +ecrire(a); +} diff --git a/test/input/affect1.s b/test/input/affect1.s new file mode 100644 index 0000000..bc09581 --- /dev/null +++ b/test/input/affect1.s @@ -0,0 +1,22 @@ +.include "io_arm.asm" + + +.data + +.global a +a:.worda VAR 1 0 + +.text +.global _start +_start: + bl main + mov r7, #1 //exit syscall + svc #0 //Syscall +main : push {r11,r14} //prologue func + mov a, #1 //Affect + push {r7,r14} //Sauvegarde r7 et lr + mov r7, #4 //Write syscall + svc #0 //syscall + pop {r7,r15} //Restauration de r7 et pc + pop {r11,r15} //epilogue func + bx lr diff --git a/test/input/affect2.l b/test/input/affect2.l new file mode 100644 index 0000000..06a3ae4 --- /dev/null +++ b/test/input/affect2.l @@ -0,0 +1,6 @@ +main() +entier a +{ +a = 1; +ecrire(a); +} diff --git a/test/input/affect2.s b/test/input/affect2.s new file mode 100644 index 0000000..91743b4 --- /dev/null +++ b/test/input/affect2.s @@ -0,0 +1,19 @@ +.include "io_arm.asm" + + +.data + +.text +.global _start +_start: + bl main + mov r7, #1 //exit syscall + svc #0 //Syscall +main : push {r11,r14} //prologue func + mov r0, #1 //Affect + push {r7,r14} //Sauvegarde r7 et lr + mov r7, #4 //Write syscall + svc #0 //syscall + pop {r7,r15} //Restauration de r7 et pc + pop {r11,r15} //epilogue func + bx lr diff --git a/test/input/affect3.l b/test/input/affect3.l new file mode 100644 index 0000000..cb1da14 --- /dev/null +++ b/test/input/affect3.l @@ -0,0 +1,11 @@ +f(entier a) +{ +a = 1; +ecrire(a); +} + +main() +entier a +{ +f(3); +} diff --git a/test/input/and1.l b/test/input/and1.l new file mode 100644 index 0000000..722352f --- /dev/null +++ b/test/input/and1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai & vrai); +} diff --git a/test/input/and2.l b/test/input/and2.l new file mode 100644 index 0000000..7f27e0b --- /dev/null +++ b/test/input/and2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai & faux); +} diff --git a/test/input/and3.l b/test/input/and3.l new file mode 100644 index 0000000..8b824bf --- /dev/null +++ b/test/input/and3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(faux & vrai); +} diff --git a/test/input/and4.l b/test/input/and4.l new file mode 100644 index 0000000..015b9dd --- /dev/null +++ b/test/input/and4.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(faux & faux); +} diff --git a/test/input/and5.l b/test/input/and5.l new file mode 100644 index 0000000..b32c729 --- /dev/null +++ b/test/input/and5.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai & faux & vrai); +} diff --git a/test/input/appel-param1.l b/test/input/appel-param1.l new file mode 100644 index 0000000..3856000 --- /dev/null +++ b/test/input/appel-param1.l @@ -0,0 +1,9 @@ +f(entier a) +{ +ecrire(a); +} + +main() +{ +f(1); +} diff --git a/test/input/appel-param2.l b/test/input/appel-param2.l new file mode 100644 index 0000000..5278f1a --- /dev/null +++ b/test/input/appel-param2.l @@ -0,0 +1,10 @@ +f(entier a, entier b) +{ +ecrire(a); +ecrire(b); +} + +main() +{ +f(1, 456); +} diff --git a/test/input/appel-param3.l b/test/input/appel-param3.l new file mode 100644 index 0000000..02cbc4c --- /dev/null +++ b/test/input/appel-param3.l @@ -0,0 +1,13 @@ +f(entier a, entier b, entier c, entier d, entier e) +{ +ecrire(a); +ecrire(b); +ecrire(c); +ecrire(d); +ecrire(e); +} + +main() +{ +f(1, 2, 3, 4, 5); +} diff --git a/test/input/appel-retour1.l b/test/input/appel-retour1.l new file mode 100644 index 0000000..262eaa7 --- /dev/null +++ b/test/input/appel-retour1.l @@ -0,0 +1,9 @@ +entier f(entier a) +{ +retour(a); +} + +main() +{ +ecrire(f(3712)); +} diff --git a/test/input/appel1.l b/test/input/appel1.l new file mode 100644 index 0000000..50282cb --- /dev/null +++ b/test/input/appel1.l @@ -0,0 +1,9 @@ +f() +{ +ecrire(1); +} + +main() +{ +f(); +} diff --git a/test/input/appel2.l b/test/input/appel2.l new file mode 100644 index 0000000..a96f3aa --- /dev/null +++ b/test/input/appel2.l @@ -0,0 +1,15 @@ +g() +{ +ecrire(2); +} + +f() +{ +ecrire(1); +g(); +} + +main() +{ +f(); +} diff --git a/test/input/appel3.l b/test/input/appel3.l new file mode 100644 index 0000000..a0a511b --- /dev/null +++ b/test/input/appel3.l @@ -0,0 +1,15 @@ +g() +{ +ecrire(2); +} + +f() +{ +ecrire(1); +} + +main() +{ +f(); +g(); +} diff --git a/test/input/clean b/test/input/clean new file mode 100755 index 0000000..9f8b584 --- /dev/null +++ b/test/input/clean @@ -0,0 +1,14 @@ +rm *.c3a +rm *.c3aout +rm *.exe +rm *.fg +rm *.fgs +rm *.ig +rm *.nasm +rm *.o +rm *.out +rm *.pre-nasm +rm *.sa +rm *.saout +rm *.sc +rm *.ts diff --git a/test/input/div1.l b/test/input/div1.l new file mode 100644 index 0000000..1883db1 --- /dev/null +++ b/test/input/div1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(4 / 2); +} diff --git a/test/input/div2.l b/test/input/div2.l new file mode 100644 index 0000000..bbf4a3a --- /dev/null +++ b/test/input/div2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(0 / 712); +} diff --git a/test/input/div3.l b/test/input/div3.l new file mode 100644 index 0000000..3ba8af5 --- /dev/null +++ b/test/input/div3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(4 / 2 / 2); +} diff --git a/test/input/div4.l b/test/input/div4.l new file mode 100644 index 0000000..6d7ad34 --- /dev/null +++ b/test/input/div4.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(2 / 3); +} diff --git a/test/input/ecrire1.l b/test/input/ecrire1.l new file mode 100644 index 0000000..fb46c63 --- /dev/null +++ b/test/input/ecrire1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(3456); +} diff --git a/test/input/ecrire2.l b/test/input/ecrire2.l new file mode 100644 index 0000000..04a17b4 --- /dev/null +++ b/test/input/ecrire2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(0); +} diff --git a/test/input/egal1.l b/test/input/egal1.l new file mode 100644 index 0000000..db5eb0d --- /dev/null +++ b/test/input/egal1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(123 = 123); +} diff --git a/test/input/egal2.l b/test/input/egal2.l new file mode 100644 index 0000000..c6df09c --- /dev/null +++ b/test/input/egal2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(412 = 34); +} diff --git a/test/input/egal3.l b/test/input/egal3.l new file mode 100644 index 0000000..af96195 --- /dev/null +++ b/test/input/egal3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(2 = 2 = vrai); +} diff --git a/test/input/fibo.l b/test/input/fibo.l new file mode 100644 index 0000000..f67922d --- /dev/null +++ b/test/input/fibo.l @@ -0,0 +1,14 @@ +entier fibo( entier n ) +{ + si n < 2 alors { + retour 1; + } + sinon { + retour fibo( n - 1 ) + fibo( n - 2 ); + } +} + +main() +{ + ecrire( fibo( 9 ) ); +} diff --git a/test/input/inf1.l b/test/input/inf1.l new file mode 100644 index 0000000..57528bd --- /dev/null +++ b/test/input/inf1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(3 < 3); +} diff --git a/test/input/inf2.l b/test/input/inf2.l new file mode 100644 index 0000000..23255bc --- /dev/null +++ b/test/input/inf2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(4 < 1); +} diff --git a/test/input/inf3.l b/test/input/inf3.l new file mode 100644 index 0000000..dbb6666 --- /dev/null +++ b/test/input/inf3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(312 < 475); +} diff --git a/test/input/mult1.l b/test/input/mult1.l new file mode 100644 index 0000000..1d0e8ff --- /dev/null +++ b/test/input/mult1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(2 * 3); +} diff --git a/test/input/mult2.l b/test/input/mult2.l new file mode 100644 index 0000000..06428e5 --- /dev/null +++ b/test/input/mult2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(0 * 321); +} diff --git a/test/input/mult3.l b/test/input/mult3.l new file mode 100644 index 0000000..6f25bfe --- /dev/null +++ b/test/input/mult3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(3 * 3 * 2); +} diff --git a/test/input/nettoie.sh b/test/input/nettoie.sh new file mode 100644 index 0000000..e997393 --- /dev/null +++ b/test/input/nettoie.sh @@ -0,0 +1,16 @@ +rm *.c3a +rm *.c3aout +rm *.exe +rm *.exeout +rm *.fg +rm *.fgs +rm *.ig +rm *.nasm +rm *.nasmout +rm *.o +rm *.pre-nasm +rm *.pre-nasmout +rm *.sa +rm *.saout +rm *.sc +rm *.ts diff --git a/test/input/not1.l b/test/input/not1.l new file mode 100644 index 0000000..6508335 --- /dev/null +++ b/test/input/not1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(! vrai); +} diff --git a/test/input/not2.l b/test/input/not2.l new file mode 100644 index 0000000..fee0155 --- /dev/null +++ b/test/input/not2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(! faux); +} diff --git a/test/input/not3.l b/test/input/not3.l new file mode 100644 index 0000000..e26acb5 --- /dev/null +++ b/test/input/not3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(! ! faux); +} diff --git a/test/input/or1.l b/test/input/or1.l new file mode 100644 index 0000000..de6482a --- /dev/null +++ b/test/input/or1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai | vrai); +} diff --git a/test/input/or2.l b/test/input/or2.l new file mode 100644 index 0000000..5c16db1 --- /dev/null +++ b/test/input/or2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai | faux); +} diff --git a/test/input/or3.l b/test/input/or3.l new file mode 100644 index 0000000..990b4aa --- /dev/null +++ b/test/input/or3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(faux | vrai); +} diff --git a/test/input/or4.l b/test/input/or4.l new file mode 100644 index 0000000..96e588b --- /dev/null +++ b/test/input/or4.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(faux | faux); +} diff --git a/test/input/or5.l b/test/input/or5.l new file mode 100644 index 0000000..be6b474 --- /dev/null +++ b/test/input/or5.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(faux | vrai | faux); +} diff --git a/test/input/parenth1.l b/test/input/parenth1.l new file mode 100644 index 0000000..358d525 --- /dev/null +++ b/test/input/parenth1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire((1)); +} diff --git a/test/input/parenth2.l b/test/input/parenth2.l new file mode 100644 index 0000000..fd2f997 --- /dev/null +++ b/test/input/parenth2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(((2))); +} diff --git a/test/input/prio34-1.l b/test/input/prio34-1.l new file mode 100644 index 0000000..3980bbf --- /dev/null +++ b/test/input/prio34-1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(2 + 3 * 4); +} diff --git a/test/input/prio34-2.l b/test/input/prio34-2.l new file mode 100644 index 0000000..4ff0447 --- /dev/null +++ b/test/input/prio34-2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(2 * 3 - 4); +} diff --git a/test/input/prio34-3.l b/test/input/prio34-3.l new file mode 100644 index 0000000..d6c2838 --- /dev/null +++ b/test/input/prio34-3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(6 / 3 - 72); +} diff --git a/test/input/prio34-4.l b/test/input/prio34-4.l new file mode 100644 index 0000000..943c397 --- /dev/null +++ b/test/input/prio34-4.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(6 + 20 / 10); +} diff --git a/test/input/prio45-1.l b/test/input/prio45-1.l new file mode 100644 index 0000000..126e9fb --- /dev/null +++ b/test/input/prio45-1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(2 = 0 + 1); +} diff --git a/test/input/prio45-2.l b/test/input/prio45-2.l new file mode 100644 index 0000000..66fe6fd --- /dev/null +++ b/test/input/prio45-2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(1 + 234 = 1); +} diff --git a/test/input/prio45-3.l b/test/input/prio45-3.l new file mode 100644 index 0000000..5adb3a7 --- /dev/null +++ b/test/input/prio45-3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(12 < 11 + 100); +} diff --git a/test/input/prio45-4.l b/test/input/prio45-4.l new file mode 100644 index 0000000..4e5398f --- /dev/null +++ b/test/input/prio45-4.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(21 - 21 < 1); +} diff --git a/test/input/prio56-1.l b/test/input/prio56-1.l new file mode 100644 index 0000000..62a4354 --- /dev/null +++ b/test/input/prio56-1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(1 = 2 & vrai); +} diff --git a/test/input/prio56-2.l b/test/input/prio56-2.l new file mode 100644 index 0000000..83f2ec7 --- /dev/null +++ b/test/input/prio56-2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai | faux = vrai); +} diff --git a/test/input/prio67-1.l b/test/input/prio67-1.l new file mode 100644 index 0000000..6ef5a73 --- /dev/null +++ b/test/input/prio67-1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(faux & vrai | vrai); +} diff --git a/test/input/prio67-2.l b/test/input/prio67-2.l new file mode 100644 index 0000000..d35a1a0 --- /dev/null +++ b/test/input/prio67-2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai | vrai & faux); +} diff --git a/test/input/rec1.l b/test/input/rec1.l new file mode 100644 index 0000000..aad2b96 --- /dev/null +++ b/test/input/rec1.l @@ -0,0 +1,14 @@ +entier f(entier a) +{ +si (a = 1) alors { +retour(1); +} +sinon{ +retour(1 + f(a-1)); +} +} + +main() +{ +ecrire(f(100)); +} diff --git a/test/input/si1.l b/test/input/si1.l new file mode 100644 index 0000000..e722414 --- /dev/null +++ b/test/input/si1.l @@ -0,0 +1,6 @@ +main() +{ +si (vrai) alors { +ecrire(vrai); +} +} diff --git a/test/input/si2.l b/test/input/si2.l new file mode 100644 index 0000000..e607615 --- /dev/null +++ b/test/input/si2.l @@ -0,0 +1,9 @@ +main() +{ +si (faux) alors { +ecrire(1); +} +sinon{ +ecrire(0); +} +} diff --git a/test/input/si3.l b/test/input/si3.l new file mode 100644 index 0000000..1872b14 --- /dev/null +++ b/test/input/si3.l @@ -0,0 +1,10 @@ +main() +{ +si (vrai) alors { +ecrire(vrai); +} +sinon{ +ecrire(faux); +} +ecrire(vrai); +} diff --git a/test/input/si4.l b/test/input/si4.l new file mode 100644 index 0000000..5fe6f1b --- /dev/null +++ b/test/input/si4.l @@ -0,0 +1,10 @@ +main() +{ +si (faux) alors { +ecrire(vrai); +} +sinon{ +ecrire(faux); +} +ecrire(vrai); +} diff --git a/test/input/si5.l b/test/input/si5.l new file mode 100644 index 0000000..d3c5759 --- /dev/null +++ b/test/input/si5.l @@ -0,0 +1,13 @@ +main() +{ + si (vrai) alors + { + ecrire(vrai); + si (vrai) alors + { + ecrire(vrai); + } + } + ecrire(vrai); +} + diff --git a/test/input/sub1.l b/test/input/sub1.l new file mode 100644 index 0000000..32394ae --- /dev/null +++ b/test/input/sub1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(10 - 5); +} diff --git a/test/input/sub2.l b/test/input/sub2.l new file mode 100644 index 0000000..6733990 --- /dev/null +++ b/test/input/sub2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(7 - 20); +} diff --git a/test/input/sub3.l b/test/input/sub3.l new file mode 100644 index 0000000..e37d955 --- /dev/null +++ b/test/input/sub3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(2 - 1 - 1); +} diff --git a/test/input/tab1.l b/test/input/tab1.l new file mode 100644 index 0000000..ebaf73f --- /dev/null +++ b/test/input/tab1.l @@ -0,0 +1,10 @@ +entier tab[3] +main() +{ +tab[0] = 0; +tab[1] = 1; +tab[2] = 2; +ecrire(tab[0]); +ecrire(tab[1]); +ecrire(tab[2]); +} diff --git a/test/input/tab2.l b/test/input/tab2.l new file mode 100644 index 0000000..dcb20bd --- /dev/null +++ b/test/input/tab2.l @@ -0,0 +1,12 @@ +entier tab[5] +main() +entier base +{ +base = 2; +tab[base + 0] = 34; +tab[base + 1] = 74; +tab[base + 2] = 16; +ecrire(tab[2]); +ecrire(tab[3]); +ecrire(tab[4]); +} diff --git a/test/input/tab3.l b/test/input/tab3.l new file mode 100644 index 0000000..aecacad --- /dev/null +++ b/test/input/tab3.l @@ -0,0 +1,15 @@ +entier tab[5] +main() +entier base, entier offset +{ +base = 2; +offset = 0; +tab[base + offset] = 34; +offset = 1; +tab[base + offset] = 74; +offset = 2; +tab[base + offset] = 16; +ecrire(tab[2]); +ecrire(tab[3]); +ecrire(tab[4]); +} diff --git a/test/input/tab4.l b/test/input/tab4.l new file mode 100644 index 0000000..1a41cba --- /dev/null +++ b/test/input/tab4.l @@ -0,0 +1,10 @@ +entier tab[3] +main() +{ +tab[0] = 1; +tab[tab[0]] = 12; +tab[tab[0]+1] = 13; +ecrire(tab[0]); +ecrire(tab[1]); +ecrire(tab[2]); +} diff --git a/test/input/tantque1.l b/test/input/tantque1.l new file mode 100644 index 0000000..4af77aa --- /dev/null +++ b/test/input/tantque1.l @@ -0,0 +1,10 @@ +main() +entier a +{ +a = 10; +tantque (0 < a) faire { +ecrire(a); +a = a - 1; +} +ecrire(0); +} diff --git a/test/input/tantque2.l b/test/input/tantque2.l new file mode 100644 index 0000000..4b1c59c --- /dev/null +++ b/test/input/tantque2.l @@ -0,0 +1,14 @@ +main() + entier a, entier b + { + a = 0; + tantque (a < 4) faire { + b = 0; + tantque (b < 4) faire { + ecrire(a); + ecrire(b); + b = b + 1; + } + a = a + 1; + } +} diff --git a/test/input/tri.l b/test/input/tri.l new file mode 100644 index 0000000..ea46356 --- /dev/null +++ b/test/input/tri.l @@ -0,0 +1,57 @@ +entier tab[ 10 ] + +initialiser() +{ + tab[0] = 8; tab[1] = 6; tab[2] = 9; + tab[3] = 9; tab[4] = 4; tab[5] = 2; + tab[6] = 3; tab[7] = 1; tab[8] = 4; + tab[9] = 5; +} + +afficher( entier n ) +entier i +{ + i = 0; + tantque i < n faire { + ecrire( tab[ i ] ); + i = i + 1; + } + ecrire( 0 ); # marqueur fin de tableau +} + +echanger( entier i, entier j ) +entier temp +{ + temp = tab[ j ]; + tab[ j ] = tab[ i ]; + tab[ i ] = temp; +} + +trier( entier n ) +entier echange, entier j, entier m +{ + m = n; + echange = 1; + tantque echange = 1 faire + { + echange = 0; + j = 0; + tantque j < m - 1 faire + { + si tab[ j + 1 ] < tab[ j ] alors { + echanger( j, j + 1 ); + echange = 1; + } + j = j + 1; + } + m = m - 1; + } +} + +main() +{ + initialiser(); + afficher( 10 ); + trier( 10 ); + afficher( 10 ); +} diff --git a/test/input/varglob1.l b/test/input/varglob1.l new file mode 100644 index 0000000..c8dc7af --- /dev/null +++ b/test/input/varglob1.l @@ -0,0 +1,6 @@ +entier variable +main() +{ +variable = 6834; +ecrire(variable); +} diff --git a/test/input/varglob2.l b/test/input/varglob2.l new file mode 100644 index 0000000..30f2aad --- /dev/null +++ b/test/input/varglob2.l @@ -0,0 +1,6 @@ +entier variable +main() +{ +variable = 10; +ecrire(variable + 50 ); +} diff --git a/test/input/varglob3.l b/test/input/varglob3.l new file mode 100644 index 0000000..8211c24 --- /dev/null +++ b/test/input/varglob3.l @@ -0,0 +1,8 @@ +entier var1, entier var2 +main() +{ +var1 = 10; +var2 = 34; +ecrire(var1); +ecrire(var2); +} diff --git a/test/input/varglob4.l b/test/input/varglob4.l new file mode 100644 index 0000000..fa170c9 --- /dev/null +++ b/test/input/varglob4.l @@ -0,0 +1,7 @@ +entier var1, entier var2 +main() +{ +var1 = 10; +var2 = 34; +ecrire(var1 + var2); +} diff --git a/test/input/varloc1.l b/test/input/varloc1.l new file mode 100644 index 0000000..babef23 --- /dev/null +++ b/test/input/varloc1.l @@ -0,0 +1,6 @@ +main() +entier variable +{ +variable = 6834; +ecrire(variable); +} diff --git a/test/input/varloc2.l b/test/input/varloc2.l new file mode 100644 index 0000000..7899e08 --- /dev/null +++ b/test/input/varloc2.l @@ -0,0 +1,6 @@ +main() +entier variable +{ +variable = 10; +ecrire(variable + 50 ); +} diff --git a/test/input/varloc3.l b/test/input/varloc3.l new file mode 100644 index 0000000..34125a0 --- /dev/null +++ b/test/input/varloc3.l @@ -0,0 +1,8 @@ +main() +entier var1, entier var2 +{ +var1 = 10; +var2 = 30; +ecrire(var1); +ecrire(var2); +} diff --git a/test/input/varloc4.l b/test/input/varloc4.l new file mode 100644 index 0000000..5b315ab --- /dev/null +++ b/test/input/varloc4.l @@ -0,0 +1,7 @@ +main() +entier var1, entier var2 +{ +var1 = 10; +var2 = 30; +ecrire(var1 + var2); +} diff --git a/test/input/varloc5.l b/test/input/varloc5.l new file mode 100644 index 0000000..d595344 --- /dev/null +++ b/test/input/varloc5.l @@ -0,0 +1,15 @@ +entier var1 + +f() +entier var1 +{ +var1 = 10; +ecrire(var1); +} + +main() +{ +var1 = 20; +f(); +ecrire(var1); +} diff --git a/test/input_err_ts/double_dec1.l b/test/input_err_ts/double_dec1.l new file mode 100644 index 0000000..5f55b85 --- /dev/null +++ b/test/input_err_ts/double_dec1.l @@ -0,0 +1,4 @@ +entier a, bool a +main(){ + +} diff --git a/test/input_err_ts/double_dec2.l b/test/input_err_ts/double_dec2.l new file mode 100644 index 0000000..3929133 --- /dev/null +++ b/test/input_err_ts/double_dec2.l @@ -0,0 +1,4 @@ +entier a, bool a[10] +main(){ + +} diff --git a/test/input_err_ts/double_dec3.l b/test/input_err_ts/double_dec3.l new file mode 100644 index 0000000..bb9b7e3 --- /dev/null +++ b/test/input_err_ts/double_dec3.l @@ -0,0 +1,7 @@ +f(entier a) +entier a +{ +} +main(){ + +} diff --git a/test/input_err_ts/double_dec4.l b/test/input_err_ts/double_dec4.l new file mode 100644 index 0000000..36d911c --- /dev/null +++ b/test/input_err_ts/double_dec4.l @@ -0,0 +1,10 @@ +f(entier a) +{ +} + +f(entier b) +{ +} +main(){ + +} diff --git a/test/input_err_ts/fct_inconnue1.l b/test/input_err_ts/fct_inconnue1.l new file mode 100644 index 0000000..f1a3992 --- /dev/null +++ b/test/input_err_ts/fct_inconnue1.l @@ -0,0 +1,3 @@ +main(){ +f(2); +} diff --git a/test/input_err_ts/mauvais_nb_arg1.l b/test/input_err_ts/mauvais_nb_arg1.l new file mode 100644 index 0000000..7281910 --- /dev/null +++ b/test/input_err_ts/mauvais_nb_arg1.l @@ -0,0 +1,7 @@ +entier f(entier a, entier b) +{ +} + +main(){ +f(2); +} diff --git a/test/input_err_ts/var_inconnue1.l b/test/input_err_ts/var_inconnue1.l new file mode 100644 index 0000000..5257ff8 --- /dev/null +++ b/test/input_err_ts/var_inconnue1.l @@ -0,0 +1,3 @@ +main(){ +a = 1; +} diff --git a/test/input_err_type/add1.l b/test/input_err_type/add1.l new file mode 100644 index 0000000..a030276 --- /dev/null +++ b/test/input_err_type/add1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(1 + vrai); +} diff --git a/test/input_err_type/add2.l b/test/input_err_type/add2.l new file mode 100644 index 0000000..b96ee72 --- /dev/null +++ b/test/input_err_type/add2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai + 1); +} diff --git a/test/input_err_type/add3.l b/test/input_err_type/add3.l new file mode 100644 index 0000000..93bcee1 --- /dev/null +++ b/test/input_err_type/add3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai + faux); +} diff --git a/test/input_err_type/add4.l b/test/input_err_type/add4.l new file mode 100644 index 0000000..e71571e --- /dev/null +++ b/test/input_err_type/add4.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(!(1 + 1)); +} diff --git a/test/input_err_type/affect1.l b/test/input_err_type/affect1.l new file mode 100644 index 0000000..0a0a692 --- /dev/null +++ b/test/input_err_type/affect1.l @@ -0,0 +1,5 @@ +entier a +main() +{ +a = vrai; +} diff --git a/test/input_err_type/affect2.l b/test/input_err_type/affect2.l new file mode 100644 index 0000000..b9b8586 --- /dev/null +++ b/test/input_err_type/affect2.l @@ -0,0 +1,5 @@ +bool a +main() +{ +a = 1; +} diff --git a/test/input_err_type/affect3.l b/test/input_err_type/affect3.l new file mode 100644 index 0000000..4ce9a7b --- /dev/null +++ b/test/input_err_type/affect3.l @@ -0,0 +1,5 @@ +entier t[1] +main() +{ +t[1] = vrai; +} diff --git a/test/input_err_type/affect4.l b/test/input_err_type/affect4.l new file mode 100644 index 0000000..d2791d8 --- /dev/null +++ b/test/input_err_type/affect4.l @@ -0,0 +1,5 @@ +bool t[1] +main() +{ +t[1] = 1; +} diff --git a/test/input_err_type/and1.l b/test/input_err_type/and1.l new file mode 100644 index 0000000..3dccb99 --- /dev/null +++ b/test/input_err_type/and1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai & 1); +} diff --git a/test/input_err_type/and2.l b/test/input_err_type/and2.l new file mode 100644 index 0000000..b42f40a --- /dev/null +++ b/test/input_err_type/and2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(1 & vrai); +} diff --git a/test/input_err_type/and3.l b/test/input_err_type/and3.l new file mode 100644 index 0000000..3444bc0 --- /dev/null +++ b/test/input_err_type/and3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(1 & 1); +} diff --git a/test/input_err_type/and4.l b/test/input_err_type/and4.l new file mode 100644 index 0000000..21f7fc2 --- /dev/null +++ b/test/input_err_type/and4.l @@ -0,0 +1,4 @@ +main() +{ +ecrire((vrai & vrai) + 1); +} diff --git a/test/input_err_type/appel1.l b/test/input_err_type/appel1.l new file mode 100644 index 0000000..4c91222 --- /dev/null +++ b/test/input_err_type/appel1.l @@ -0,0 +1,8 @@ +entier f(entier a) +{ +} + +main() +{ +f(vrai); +} diff --git a/test/input_err_type/appel2.l b/test/input_err_type/appel2.l new file mode 100644 index 0000000..196542b --- /dev/null +++ b/test/input_err_type/appel2.l @@ -0,0 +1,8 @@ +bool f(bool a) +{ +} + +main() +{ +f(1); +} diff --git a/test/input_err_type/appel3.l b/test/input_err_type/appel3.l new file mode 100644 index 0000000..f4254ae --- /dev/null +++ b/test/input_err_type/appel3.l @@ -0,0 +1,8 @@ +bool f(bool a, bool b) +{ +} + +main() +{ +f(vrai, 1); +} diff --git a/test/input_err_type/appel4.l b/test/input_err_type/appel4.l new file mode 100644 index 0000000..2ccd99f --- /dev/null +++ b/test/input_err_type/appel4.l @@ -0,0 +1,8 @@ +bool f(entier a, entier b) +{ +} + +main() +{ +f(1, faux); +} diff --git a/test/input_err_type/div1.l b/test/input_err_type/div1.l new file mode 100644 index 0000000..321b3c8 --- /dev/null +++ b/test/input_err_type/div1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(1 / vrai); +} diff --git a/test/input_err_type/div2.l b/test/input_err_type/div2.l new file mode 100644 index 0000000..10e5ab3 --- /dev/null +++ b/test/input_err_type/div2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai / 1); +} diff --git a/test/input_err_type/div3.l b/test/input_err_type/div3.l new file mode 100644 index 0000000..5bc1aab --- /dev/null +++ b/test/input_err_type/div3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai / faux); +} diff --git a/test/input_err_type/div4.l b/test/input_err_type/div4.l new file mode 100644 index 0000000..f9b3c30 --- /dev/null +++ b/test/input_err_type/div4.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(!(1 / 1)); +} diff --git a/test/input_err_type/egal1.l b/test/input_err_type/egal1.l new file mode 100644 index 0000000..bcbc766 --- /dev/null +++ b/test/input_err_type/egal1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(1 = vrai); +} diff --git a/test/input_err_type/egal2.l b/test/input_err_type/egal2.l new file mode 100644 index 0000000..e33cf97 --- /dev/null +++ b/test/input_err_type/egal2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai = 1); +} diff --git a/test/input_err_type/egal3.l b/test/input_err_type/egal3.l new file mode 100644 index 0000000..923e15d --- /dev/null +++ b/test/input_err_type/egal3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire((1 = 1) + 1); +} diff --git a/test/input_err_type/egal3.nasm b/test/input_err_type/egal3.nasm new file mode 100644 index 0000000..9e9eac4 --- /dev/null +++ b/test/input_err_type/egal3.nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main ; + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 ; +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov ebx, 0 ;Affect +l0 : mov eax, ebx ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret ; diff --git a/test/input_err_type/inf1.l b/test/input_err_type/inf1.l new file mode 100644 index 0000000..80b0a60 --- /dev/null +++ b/test/input_err_type/inf1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(1 < vrai); +} diff --git a/test/input_err_type/inf2.l b/test/input_err_type/inf2.l new file mode 100644 index 0000000..28ce301 --- /dev/null +++ b/test/input_err_type/inf2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai < 1); +} diff --git a/test/input_err_type/inf3.l b/test/input_err_type/inf3.l new file mode 100644 index 0000000..a57d7f4 --- /dev/null +++ b/test/input_err_type/inf3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai < faux); +} diff --git a/test/input_err_type/inf3.nasm b/test/input_err_type/inf3.nasm new file mode 100644 index 0000000..cd004aa --- /dev/null +++ b/test/input_err_type/inf3.nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main ; + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 ; +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 1 ;JumpIfLess 1 + cmp eax, 0 ;on passe par un registre temporaire + jl l0 ;JumpIfLess 2 + mov ebx, 0 ;Affect +l0 : mov eax, ebx ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret ; diff --git a/test/input_err_type/inf4.l b/test/input_err_type/inf4.l new file mode 100644 index 0000000..f0301e2 --- /dev/null +++ b/test/input_err_type/inf4.l @@ -0,0 +1,4 @@ +main() +{ +ecrire((1 < 1) + 1); +} diff --git a/test/input_err_type/mult1.l b/test/input_err_type/mult1.l new file mode 100644 index 0000000..8f4d378 --- /dev/null +++ b/test/input_err_type/mult1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(1 * vrai); +} diff --git a/test/input_err_type/mult2.l b/test/input_err_type/mult2.l new file mode 100644 index 0000000..48f4598 --- /dev/null +++ b/test/input_err_type/mult2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai * 1); +} diff --git a/test/input_err_type/mult3.l b/test/input_err_type/mult3.l new file mode 100644 index 0000000..b836a33 --- /dev/null +++ b/test/input_err_type/mult3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai * faux); +} diff --git a/test/input_err_type/mult4.l b/test/input_err_type/mult4.l new file mode 100644 index 0000000..07a49bb --- /dev/null +++ b/test/input_err_type/mult4.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(!(1 * 1)); +} diff --git a/test/input_err_type/not1.l b/test/input_err_type/not1.l new file mode 100644 index 0000000..12d8b42 --- /dev/null +++ b/test/input_err_type/not1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(! 1); +} diff --git a/test/input_err_type/or1.l b/test/input_err_type/or1.l new file mode 100644 index 0000000..4c9d129 --- /dev/null +++ b/test/input_err_type/or1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai | 1); +} diff --git a/test/input_err_type/or2.l b/test/input_err_type/or2.l new file mode 100644 index 0000000..f4324ff --- /dev/null +++ b/test/input_err_type/or2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(1 | faux); +} diff --git a/test/input_err_type/or3.l b/test/input_err_type/or3.l new file mode 100644 index 0000000..7bfcff9 --- /dev/null +++ b/test/input_err_type/or3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire((vrai | vrai) + 1); +} diff --git a/test/input_err_type/or4.l b/test/input_err_type/or4.l new file mode 100644 index 0000000..7bfcff9 --- /dev/null +++ b/test/input_err_type/or4.l @@ -0,0 +1,4 @@ +main() +{ +ecrire((vrai | vrai) + 1); +} diff --git a/test/input_err_type/retour1.l b/test/input_err_type/retour1.l new file mode 100644 index 0000000..dd2a19b --- /dev/null +++ b/test/input_err_type/retour1.l @@ -0,0 +1,9 @@ +bool f(entier a) +{ +retour(a); +} + +main() +{ +f(3712); +} diff --git a/test/input_err_type/retour2.l b/test/input_err_type/retour2.l new file mode 100644 index 0000000..beedbe7 --- /dev/null +++ b/test/input_err_type/retour2.l @@ -0,0 +1,9 @@ +entier f(bool a) +{ +retour(a); +} + +main() +{ +f(vrai); +} diff --git a/test/input_err_type/retour3.l b/test/input_err_type/retour3.l new file mode 100644 index 0000000..76ced64 --- /dev/null +++ b/test/input_err_type/retour3.l @@ -0,0 +1,9 @@ +f(entier a) +{ +retour(a); +} + +main() +{ +f(3712); +} diff --git a/test/input_err_type/si1.l b/test/input_err_type/si1.l new file mode 100644 index 0000000..cb24148 --- /dev/null +++ b/test/input_err_type/si1.l @@ -0,0 +1,5 @@ +main() +{ +si (1) alors { +} +} diff --git a/test/input_err_type/sub1.l b/test/input_err_type/sub1.l new file mode 100644 index 0000000..8b8dd55 --- /dev/null +++ b/test/input_err_type/sub1.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(1 - vrai); +} diff --git a/test/input_err_type/sub2.l b/test/input_err_type/sub2.l new file mode 100644 index 0000000..252c03f --- /dev/null +++ b/test/input_err_type/sub2.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai - 1); +} diff --git a/test/input_err_type/sub3.l b/test/input_err_type/sub3.l new file mode 100644 index 0000000..c36f785 --- /dev/null +++ b/test/input_err_type/sub3.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(vrai - vrai); +} diff --git a/test/input_err_type/sub4.l b/test/input_err_type/sub4.l new file mode 100644 index 0000000..b6b7bfb --- /dev/null +++ b/test/input_err_type/sub4.l @@ -0,0 +1,4 @@ +main() +{ +ecrire(!( 1 - 1)); +} diff --git a/test/input_err_type/tantque1.l b/test/input_err_type/tantque1.l new file mode 100644 index 0000000..6344c62 --- /dev/null +++ b/test/input_err_type/tantque1.l @@ -0,0 +1,5 @@ +main() +{ +tantque (1) faire { +} +} diff --git a/test/io.asm b/test/io.asm new file mode 100644 index 0000000..cee4da2 --- /dev/null +++ b/test/io.asm @@ -0,0 +1,205 @@ + global iprintLF +;------------------------------------------ +; void readline +; Read a line from stdin, store string after [$eax] +; WARNING: does not check for buffer overflow - insecure! +readline: + push edx ; preserve edx on stack to be restored after function + push ecx ; preserve ecx on stack to be restored after function + push ebx ; preserve ebx on stack to be restored after function + push eax ; preserve eax on stack to be restored after function + mov ecx, eax ; address where store result +continue_reading: + mov eax, 3 ; syscall is read = 3 + mov ebx, 0 ; fd is stdin = 0 + mov edx, 1 ; nb. of bytes to read + int 80h ; call interruption + cmp eax, 0 ; if no byte read, then we reached EOF, stop + je end_reading + cmp BYTE [ecx], 10 ; Found '\n', stop reading string + je end_reading + cmp BYTE [ecx], 13 ; Found '\r', stop reading string + je end_reading + inc ecx ; None of above, increment pointer and read next byte + jmp continue_reading +end_reading: + mov BYTE [ecx], 0 ; Add zero to yield null-terminated string + pop eax ; restore eax from value pushed onto stack at start + pop ebx ; restore eax from value pushed onto stack at start + pop ecx ; restore eax from value pushed onto stack at start + pop edx ; restore eax from value pushed onto stack at start + ret + +;------------------------------------------ +; void iprint(Integer number) +; Integer printing function (itoa) +iprint: + push eax ; preserve eax on the stack to be restored after function runs + push ecx ; preserve ecx on the stack to be restored after function runs + push edx ; preserve edx on the stack to be restored after function runs + push esi ; preserve esi on the stack to be restored after function runs + + cmp eax, 0 + jge positive + push eax ; preserve eax value + mov ebx, '-' + push ebx + mov eax, esp + call sprint + pop eax ; remove '-' sign + pop eax ; retrieve eax value + neg eax +positive: + mov ecx, 0 ; counter of how many bytes we need to print in the end +divideLoop: + inc ecx ; count each byte to print - number of characters + mov edx, 0 ; empty edx + mov esi, 10 ; mov 10 into esi + idiv esi ; divide eax by esi + add edx, 48 ; convert edx to it's ascii representation - edx holds the remainder after a divide instruction + push edx ; push edx (string representation of an intger) onto the stack + cmp eax, 0 ; can the integer be divided anymore? + jnz divideLoop ; jump if not zero to the label divideLoop + +printLoop: + dec ecx ; count down each byte that we put on the stack + mov eax, esp ; mov the stack pointer into eax for printing + call sprint ; call our string print function + pop eax ; remove last character from the stack to move esp forward + cmp ecx, 0 ; have we printed all bytes we pushed onto the stack? + jnz printLoop ; jump is not zero to the label printLoop + + pop esi ; restore esi from the value we pushed onto the stack at the start + pop edx ; restore edx from the value we pushed onto the stack at the start + pop ecx ; restore ecx from the value we pushed onto the stack at the start + pop eax ; restore eax from the value we pushed onto the stack at the start + ret + + +;------------------------------------------ +; void iprintLF(Integer number) +; Integer printing function with linefeed (itoa) +iprintLF: + call iprint ; call our integer printing function + + push eax ; push eax onto the stack to preserve it while we use the eax register in this function + mov eax, 0Ah ; move 0Ah into eax - 0Ah is the ascii character for a linefeed + push eax ; push the linefeed onto the stack so we can get the address + mov eax, esp ; move the address of the current stack pointer into eax for sprint + call sprint ; call our sprint function + pop eax ; remove our linefeed character from the stack + pop eax ; restore the original value of eax before our function was called + ret + + +;------------------------------------------ +; int slen(String message) +; String length calculation function +slen: + push ebx + mov ebx, eax + +nextchar: + cmp byte [eax], 0 + jz finished + inc eax + jmp nextchar + +finished: + sub eax, ebx + pop ebx + ret + + +;------------------------------------------ +; void sprint(String message) +; String printing function +sprint: + push edx + push ecx + push ebx + push eax + call slen + + mov edx, eax + pop eax + + mov ecx, eax + mov ebx, 1 + mov eax, 4 + int 80h + + pop ebx + pop ecx + pop edx + ret + + +;------------------------------------------ +; void sprintLF(String message) +; String printing with line feed function +sprintLF: + call sprint + + push eax + mov eax, 0AH + push eax + mov eax, esp + call sprint + pop eax + pop eax + ret + + +;------------------------------------------ +; void exit() +; Exit program and restore resources +quit: + mov ebx, 0 + mov eax, 1 + int 80h + ret + +;------------------------------------------ +; int atoi(Integer number) +; Ascii to integer function (atoi) +atoi: + push ebx ; preserve ebx on the stack to be restored after function runs + push ecx ; preserve ecx on the stack to be restored after function runs + push edx ; preserve edx on the stack to be restored after function runs + push esi ; preserve esi on the stack to be restored after function runs + xor ebx, ebx ; initialize forming answer + xor ecx, ecx ; initialize sign flag + mov esi, eax +atoi1: + lodsb ; scan off whitespace + cmp al, ' ' ; ignore leading blanks + je atoi1 + cmp al, '+' ; if + sign proceed + je atoi2 + cmp al, '-' ; is it - sign? + jne atoi3 ; no, test if numeric + dec ecx ; was - sign, set flag for negative result +atoi2: + lodsb ; get next character +atoi3: + cmp al,'0' ; is character valid? + jb atoi4 ; jump if not '0' to '9' + cmp al,'9' + ja atoi4 ; jump if not '0' to '9' + and eax, 000fh ; isolate lower four bits + xchg ebx, eax ; multiply answer x 10 + mov edx, 10 + mul edx + add ebx, eax ; add this digit + jmp atoi2 ; convert next digit +atoi4: + mov eax,ebx ; result into AX + jcxz atoi5 ; jump if sign flag clear + neg eax ; make result negative +atoi5: + pop esi ; restore esi from the value we pushed onto the stack at the start + pop edx ; restore edx from the value we pushed onto the stack at the start + pop ecx ; restore ecx from the value we pushed onto the stack at the start + pop ebx ; restore ebx from the value we pushed onto the stack at the start + ret diff --git a/test/nasm-ref/add1.nasm b/test/nasm-ref/add1.nasm new file mode 100644 index 0000000..bc09d48 --- /dev/null +++ b/test/nasm-ref/add1.nasm @@ -0,0 +1,32 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 3 + add eax, 10 + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/add2.nasm b/test/nasm-ref/add2.nasm new file mode 100644 index 0000000..4410bca --- /dev/null +++ b/test/nasm-ref/add2.nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 2 + add eax, 4 + mov eax, eax + add eax, 8 + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/affect1.nasm b/test/nasm-ref/affect1.nasm new file mode 100644 index 0000000..7279263 --- /dev/null +++ b/test/nasm-ref/affect1.nasm @@ -0,0 +1,32 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +a : resd 4 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov dword [a], 1 ;Affect + mov eax, dword [a] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/affect2.nasm b/test/nasm-ref/affect2.nasm new file mode 100644 index 0000000..13e0f37 --- /dev/null +++ b/test/nasm-ref/affect2.nasm @@ -0,0 +1,31 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov dword [ebp-4], 1 ;Affect + mov eax, dword [ebp-4] ;Write 1 + call iprintLF ;Write 2 + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/affect3.nasm b/test/nasm-ref/affect3.nasm new file mode 100644 index 0000000..0a52b93 --- /dev/null +++ b/test/nasm-ref/affect3.nasm @@ -0,0 +1,50 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov dword [ebp+12], 1 ;Affect + mov eax, dword [ebp+12] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + push 3 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop eax ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/and1.nasm b/test/nasm-ref/and1.nasm new file mode 100644 index 0000000..a4246bc --- /dev/null +++ b/test/nasm-ref/and1.nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov eax, 1 ;Affect + jmp l0 ;Jump +l1 : mov eax, 0 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/and2.nasm b/test/nasm-ref/and2.nasm new file mode 100644 index 0000000..c1132c6 --- /dev/null +++ b/test/nasm-ref/and2.nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov eax, 0 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov eax, 1 ;Affect + jmp l0 ;Jump +l1 : mov eax, 0 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/and3.nasm b/test/nasm-ref/and3.nasm new file mode 100644 index 0000000..47d936c --- /dev/null +++ b/test/nasm-ref/and3.nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 0 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov eax, 1 ;Affect + jmp l0 ;Jump +l1 : mov eax, 0 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/and4.nasm b/test/nasm-ref/and4.nasm new file mode 100644 index 0000000..ae6df09 --- /dev/null +++ b/test/nasm-ref/and4.nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 0 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov eax, 0 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov eax, 1 ;Affect + jmp l0 ;Jump +l1 : mov eax, 0 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/and5.nasm b/test/nasm-ref/and5.nasm new file mode 100644 index 0000000..fa2e52f --- /dev/null +++ b/test/nasm-ref/and5.nasm @@ -0,0 +1,47 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov eax, 0 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov eax, 1 ;Affect + jmp l2 ;Jump +l3 : mov eax, 0 ;Affect +l2 : cmp eax, 0 ;JumpIfEqual 1 + je l1 ;JumpIfEqual 2 + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov eax, 1 ;Affect + jmp l0 ;Jump +l1 : mov eax, 0 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/appel-param1.nasm b/test/nasm-ref/appel-param1.nasm new file mode 100644 index 0000000..54428e3 --- /dev/null +++ b/test/nasm-ref/appel-param1.nasm @@ -0,0 +1,49 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, dword [ebp+12] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + push 1 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop eax ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/appel-param2.nasm b/test/nasm-ref/appel-param2.nasm new file mode 100644 index 0000000..0ebec5e --- /dev/null +++ b/test/nasm-ref/appel-param2.nasm @@ -0,0 +1,52 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, dword [ebp+16] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp+12] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + push 1 ;Param + push 456 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop eax ;récupération de la valeur de retour + add esp, 8 ;désallocation des arguments + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/appel-param3.nasm b/test/nasm-ref/appel-param3.nasm new file mode 100644 index 0000000..efa0855 --- /dev/null +++ b/test/nasm-ref/appel-param3.nasm @@ -0,0 +1,61 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, dword [ebp+28] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp+24] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp+20] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp+16] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp+12] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + push 1 ;Param + push 2 ;Param + push 3 ;Param + push 4 ;Param + push 5 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop eax ;récupération de la valeur de retour + add esp, 20 ;désallocation des arguments + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/appel-retour1.nasm b/test/nasm-ref/appel-retour1.nasm new file mode 100644 index 0000000..45a6fd9 --- /dev/null +++ b/test/nasm-ref/appel-retour1.nasm @@ -0,0 +1,58 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, dword [ebp+12] ;ecriture de la valeur de retour + mov dword [ebp+8], eax ;on passe par un registre temporaire + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + push 3712 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop eax ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/appel1.nasm b/test/nasm-ref/appel1.nasm new file mode 100644 index 0000000..6759776 --- /dev/null +++ b/test/nasm-ref/appel1.nasm @@ -0,0 +1,47 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop eax ;récupération de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/appel2.nasm b/test/nasm-ref/appel2.nasm new file mode 100644 index 0000000..7cc2d8f --- /dev/null +++ b/test/nasm-ref/appel2.nasm @@ -0,0 +1,66 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +g : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + sub esp, 4 ;allocation mémoire pour la valeur de retour + call g + pop eax ;récupération de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop eax ;récupération de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/appel3.nasm b/test/nasm-ref/appel3.nasm new file mode 100644 index 0000000..2b9a9df --- /dev/null +++ b/test/nasm-ref/appel3.nasm @@ -0,0 +1,66 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +g : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop eax ;récupération de la valeur de retour + sub esp, 4 ;allocation mémoire pour la valeur de retour + call g + pop eax ;récupération de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/div1.nasm b/test/nasm-ref/div1.nasm new file mode 100644 index 0000000..ef462e7 --- /dev/null +++ b/test/nasm-ref/div1.nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, 4 ;affectation des bits de poids faible du dividende + mov ebx, 2 + idiv ebx + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov eax, eax + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/div2.nasm b/test/nasm-ref/div2.nasm new file mode 100644 index 0000000..e861d6e --- /dev/null +++ b/test/nasm-ref/div2.nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, 0 ;affectation des bits de poids faible du dividende + mov ebx, 712 + idiv ebx + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov eax, eax + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/div3.nasm b/test/nasm-ref/div3.nasm new file mode 100644 index 0000000..ffabe24 --- /dev/null +++ b/test/nasm-ref/div3.nasm @@ -0,0 +1,42 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, 4 ;affectation des bits de poids faible du dividende + mov ebx, 2 + idiv ebx + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov ebx, eax + mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, ebx ;affectation des bits de poids faible du dividende + mov ebx, 2 + idiv ebx + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov eax, eax + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/div4.nasm b/test/nasm-ref/div4.nasm new file mode 100644 index 0000000..f5097bb --- /dev/null +++ b/test/nasm-ref/div4.nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, 2 ;affectation des bits de poids faible du dividende + mov ebx, 3 + idiv ebx + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov eax, eax + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/ecrire1.nasm b/test/nasm-ref/ecrire1.nasm new file mode 100644 index 0000000..b54f3ee --- /dev/null +++ b/test/nasm-ref/ecrire1.nasm @@ -0,0 +1,30 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 3456 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/ecrire2.nasm b/test/nasm-ref/ecrire2.nasm new file mode 100644 index 0000000..f1e10ef --- /dev/null +++ b/test/nasm-ref/ecrire2.nasm @@ -0,0 +1,30 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 0 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/egal1.nasm b/test/nasm-ref/egal1.nasm new file mode 100644 index 0000000..2f92dc2 --- /dev/null +++ b/test/nasm-ref/egal1.nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 123 ;JumpIfEqual 1 + cmp eax, 123 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov ebx, 0 ;Affect +l0 : mov eax, ebx ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/egal2.nasm b/test/nasm-ref/egal2.nasm new file mode 100644 index 0000000..e18e7e7 --- /dev/null +++ b/test/nasm-ref/egal2.nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 412 ;JumpIfEqual 1 + cmp eax, 34 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov ebx, 0 ;Affect +l0 : mov eax, ebx ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/egal3.nasm b/test/nasm-ref/egal3.nasm new file mode 100644 index 0000000..ad070f9 --- /dev/null +++ b/test/nasm-ref/egal3.nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 2 ;JumpIfEqual 1 + cmp eax, 2 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov ebx, 0 ;Affect +l1 : mov eax, 1 ;Affect + cmp ebx, 1 ;JumpIfEqual 1 + je l0 ;JumpIfEqual 2 + mov eax, 0 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/fibo.nasm b/test/nasm-ref/fibo.nasm new file mode 100644 index 0000000..ec408a3 --- /dev/null +++ b/test/nasm-ref/fibo.nasm @@ -0,0 +1,88 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +fibo : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;Affect + cmp dword [ebp+12], 2 ;JumpIfLess 1 + jl l2 ;JumpIfLess 2 + mov eax, 0 ;Affect +l2 : cmp eax, 0 ;JumpIfEqual 1 + je l0 ;JumpIfEqual 2 + mov dword [ebp+8], 1 ;ecriture de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret + jmp l1 ;Jump +l0 : mov eax, dword [ebp+12] + sub eax, 1 + push eax ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call fibo + pop ecx ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + mov eax, dword [ebp+12] + sub eax, 2 + push eax ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call fibo + pop ebx ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + mov eax, ecx + add eax, ebx + mov dword [ebp+8], eax ;ecriture de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +l1 : add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + push 9 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call fibo + pop eax ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/inf1.nasm b/test/nasm-ref/inf1.nasm new file mode 100644 index 0000000..bd13a5f --- /dev/null +++ b/test/nasm-ref/inf1.nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 3 ;JumpIfLess 1 + cmp eax, 3 ;on passe par un registre temporaire + jl l0 ;JumpIfLess 2 + mov ebx, 0 ;Affect +l0 : mov eax, ebx ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/inf2.nasm b/test/nasm-ref/inf2.nasm new file mode 100644 index 0000000..affb58c --- /dev/null +++ b/test/nasm-ref/inf2.nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 4 ;JumpIfLess 1 + cmp eax, 1 ;on passe par un registre temporaire + jl l0 ;JumpIfLess 2 + mov ebx, 0 ;Affect +l0 : mov eax, ebx ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/inf3.nasm b/test/nasm-ref/inf3.nasm new file mode 100644 index 0000000..5885172 --- /dev/null +++ b/test/nasm-ref/inf3.nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 312 ;JumpIfLess 1 + cmp eax, 475 ;on passe par un registre temporaire + jl l0 ;JumpIfLess 2 + mov ebx, 0 ;Affect +l0 : mov eax, ebx ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/inf4.nasm b/test/nasm-ref/inf4.nasm new file mode 100644 index 0000000..013435e --- /dev/null +++ b/test/nasm-ref/inf4.nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main ; + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 ; +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 3 ;JumpIfLess 1 + cmp eax, 2 ;on passe par un registre temporaire + jl l1 ;JumpIfLess 2 + mov ebx, 0 ;Affect +l1 : mov eax, 1 ;Affect + cmp ebx, 1 ;JumpIfLess 1 + jl l0 ;JumpIfLess 2 + mov eax, 0 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret ; diff --git a/test/nasm-ref/mult1.nasm b/test/nasm-ref/mult1.nasm new file mode 100644 index 0000000..f76c441 --- /dev/null +++ b/test/nasm-ref/mult1.nasm @@ -0,0 +1,32 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 2 + imul eax, 3 + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/mult2.nasm b/test/nasm-ref/mult2.nasm new file mode 100644 index 0000000..6e1901e --- /dev/null +++ b/test/nasm-ref/mult2.nasm @@ -0,0 +1,32 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 0 + imul eax, 321 + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/mult3.nasm b/test/nasm-ref/mult3.nasm new file mode 100644 index 0000000..63f4199 --- /dev/null +++ b/test/nasm-ref/mult3.nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 3 + imul eax, 3 + mov eax, eax + imul eax, 2 + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/not1.nasm b/test/nasm-ref/not1.nasm new file mode 100644 index 0000000..fa6921f --- /dev/null +++ b/test/nasm-ref/not1.nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov ebx, 0 ;Affect +l0 : mov eax, ebx ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/not2.nasm b/test/nasm-ref/not2.nasm new file mode 100644 index 0000000..7f55870 --- /dev/null +++ b/test/nasm-ref/not2.nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 0 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov ebx, 0 ;Affect +l0 : mov eax, ebx ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/not3.nasm b/test/nasm-ref/not3.nasm new file mode 100644 index 0000000..a2c8f2e --- /dev/null +++ b/test/nasm-ref/not3.nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 0 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov ebx, 0 ;Affect +l1 : mov eax, 1 ;Affect + cmp ebx, 0 ;JumpIfEqual 1 + je l0 ;JumpIfEqual 2 + mov eax, 0 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/or1.nasm b/test/nasm-ref/or1.nasm new file mode 100644 index 0000000..7573ac5 --- /dev/null +++ b/test/nasm-ref/or1.nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;jumpIfNotEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov eax, 1 ;jumpIfNotEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov eax, 0 ;Affect + jmp l0 ;Jump +l1 : mov eax, 1 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/or2.nasm b/test/nasm-ref/or2.nasm new file mode 100644 index 0000000..49b925d --- /dev/null +++ b/test/nasm-ref/or2.nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;jumpIfNotEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov eax, 0 ;jumpIfNotEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov eax, 0 ;Affect + jmp l0 ;Jump +l1 : mov eax, 1 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/or3.nasm b/test/nasm-ref/or3.nasm new file mode 100644 index 0000000..03655bc --- /dev/null +++ b/test/nasm-ref/or3.nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 0 ;jumpIfNotEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov eax, 1 ;jumpIfNotEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov eax, 0 ;Affect + jmp l0 ;Jump +l1 : mov eax, 1 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/or4.nasm b/test/nasm-ref/or4.nasm new file mode 100644 index 0000000..aab7000 --- /dev/null +++ b/test/nasm-ref/or4.nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 0 ;jumpIfNotEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov eax, 0 ;jumpIfNotEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov eax, 0 ;Affect + jmp l0 ;Jump +l1 : mov eax, 1 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/or5.nasm b/test/nasm-ref/or5.nasm new file mode 100644 index 0000000..f5d577d --- /dev/null +++ b/test/nasm-ref/or5.nasm @@ -0,0 +1,47 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 0 ;jumpIfNotEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + jne l3 ;jumpIfNotEqual 2 + mov eax, 1 ;jumpIfNotEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + jne l3 ;jumpIfNotEqual 2 + mov eax, 0 ;Affect + jmp l2 ;Jump +l3 : mov eax, 1 ;Affect +l2 : cmp eax, 0 ;jumpIfNotEqual 1 + jne l1 ;jumpIfNotEqual 2 + mov eax, 0 ;jumpIfNotEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov eax, 0 ;Affect + jmp l0 ;Jump +l1 : mov eax, 1 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/parenth1.nasm b/test/nasm-ref/parenth1.nasm new file mode 100644 index 0000000..62131a5 --- /dev/null +++ b/test/nasm-ref/parenth1.nasm @@ -0,0 +1,30 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/parenth2.nasm b/test/nasm-ref/parenth2.nasm new file mode 100644 index 0000000..a0a06fc --- /dev/null +++ b/test/nasm-ref/parenth2.nasm @@ -0,0 +1,30 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/prio23-1.nasm b/test/nasm-ref/prio23-1.nasm new file mode 100644 index 0000000..fe42a0a --- /dev/null +++ b/test/nasm-ref/prio23-1.nasm @@ -0,0 +1,37 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main ; + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 ; +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 0 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov ebx, 0 ;Affect +l0 : mov eax, ebx ; + imul eax, 10 ; + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret ; diff --git a/test/nasm-ref/prio23-2.nasm b/test/nasm-ref/prio23-2.nasm new file mode 100644 index 0000000..3534b14 --- /dev/null +++ b/test/nasm-ref/prio23-2.nasm @@ -0,0 +1,37 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main ; + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 ; +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 10 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov ebx, 0 ;Affect +l0 : mov eax, 3 ; + imul eax, ebx ; + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret ; diff --git a/test/nasm-ref/prio23-3.nasm b/test/nasm-ref/prio23-3.nasm new file mode 100644 index 0000000..1eaf5d1 --- /dev/null +++ b/test/nasm-ref/prio23-3.nasm @@ -0,0 +1,41 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main ; + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 ; +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ecx, 1 ;Affect + mov ebx, 0 ;JumpIfEqual 1 + cmp ebx, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov ecx, 0 ;Affect +l0 : mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, ecx ;affectation des bits de poids faible du dividende + mov ebx, 1 ; + idiv ebx ; + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov eax, eax ; + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret ; diff --git a/test/nasm-ref/prio23-4.nasm b/test/nasm-ref/prio23-4.nasm new file mode 100644 index 0000000..e4ffdc7 --- /dev/null +++ b/test/nasm-ref/prio23-4.nasm @@ -0,0 +1,45 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main ; + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 ; +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ecx, 1 ;Affect + mov ebx, 1 ;JumpIfEqual 1 + cmp ebx, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov ecx, 0 ;Affect +l0 : mov ebx, 1 ;Affect + mov edx, 0 ;JumpIfEqual 1 + cmp edx, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov ebx, 0 ;Affect +l1 : mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, ecx ;affectation des bits de poids faible du dividende + idiv ebx ; + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov eax, eax ; + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret ; diff --git a/test/nasm-ref/prio34-1.nasm b/test/nasm-ref/prio34-1.nasm new file mode 100644 index 0000000..cd6c5ee --- /dev/null +++ b/test/nasm-ref/prio34-1.nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 3 + imul ebx, 4 + mov eax, 2 + add eax, ebx + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/prio34-2.nasm b/test/nasm-ref/prio34-2.nasm new file mode 100644 index 0000000..7021326 --- /dev/null +++ b/test/nasm-ref/prio34-2.nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 2 + imul eax, 3 + mov eax, eax + sub eax, 4 + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/prio34-3.nasm b/test/nasm-ref/prio34-3.nasm new file mode 100644 index 0000000..1f40cf8 --- /dev/null +++ b/test/nasm-ref/prio34-3.nasm @@ -0,0 +1,38 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, 6 ;affectation des bits de poids faible du dividende + mov ebx, 3 + idiv ebx + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov eax, eax + mov eax, eax + sub eax, 72 + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/prio34-4.nasm b/test/nasm-ref/prio34-4.nasm new file mode 100644 index 0000000..3de8b05 --- /dev/null +++ b/test/nasm-ref/prio34-4.nasm @@ -0,0 +1,38 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, 20 ;affectation des bits de poids faible du dividende + mov ebx, 10 + idiv ebx + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov ebx, eax + mov eax, 6 + add eax, ebx + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/prio45-1.nasm b/test/nasm-ref/prio45-1.nasm new file mode 100644 index 0000000..16084c6 --- /dev/null +++ b/test/nasm-ref/prio45-1.nasm @@ -0,0 +1,37 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 0 + add ebx, 1 + mov ecx, 1 ;Affect + mov eax, 2 ;JumpIfEqual 1 + cmp eax, ebx ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov ecx, 0 ;Affect +l0 : mov eax, ecx ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/prio45-2.nasm b/test/nasm-ref/prio45-2.nasm new file mode 100644 index 0000000..1df1bfc --- /dev/null +++ b/test/nasm-ref/prio45-2.nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 + add eax, 234 + mov ebx, 1 ;Affect + cmp eax, 1 ;JumpIfEqual 1 + je l0 ;JumpIfEqual 2 + mov ebx, 0 ;Affect +l0 : mov eax, ebx ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/prio45-3.nasm b/test/nasm-ref/prio45-3.nasm new file mode 100644 index 0000000..866931f --- /dev/null +++ b/test/nasm-ref/prio45-3.nasm @@ -0,0 +1,37 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 11 + add ebx, 100 + mov ecx, 1 ;Affect + mov eax, 12 ;JumpIfLess 1 + cmp eax, ebx ;on passe par un registre temporaire + jl l0 ;JumpIfLess 2 + mov ecx, 0 ;Affect +l0 : mov eax, ecx ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/prio45-4.nasm b/test/nasm-ref/prio45-4.nasm new file mode 100644 index 0000000..64778dc --- /dev/null +++ b/test/nasm-ref/prio45-4.nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 21 + sub eax, 21 + mov ebx, 1 ;Affect + cmp eax, 1 ;JumpIfLess 1 + jl l0 ;JumpIfLess 2 + mov ebx, 0 ;Affect +l0 : mov eax, ebx ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/prio56-1.nasm b/test/nasm-ref/prio56-1.nasm new file mode 100644 index 0000000..dad8599 --- /dev/null +++ b/test/nasm-ref/prio56-1.nasm @@ -0,0 +1,43 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 2 ;on passe par un registre temporaire + je l2 ;JumpIfEqual 2 + mov ebx, 0 ;Affect +l2 : cmp ebx, 0 ;JumpIfEqual 1 + je l1 ;JumpIfEqual 2 + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov eax, 1 ;Affect + jmp l0 ;Jump +l1 : mov eax, 0 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/prio56-2.nasm b/test/nasm-ref/prio56-2.nasm new file mode 100644 index 0000000..5b41fc4 --- /dev/null +++ b/test/nasm-ref/prio56-2.nasm @@ -0,0 +1,43 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov ebx, 1 ;Affect + mov eax, 0 ;JumpIfEqual 1 + cmp eax, 1 ;on passe par un registre temporaire + je l2 ;JumpIfEqual 2 + mov ebx, 0 ;Affect +l2 : mov eax, 1 ;jumpIfNotEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + cmp ebx, 0 ;jumpIfNotEqual 1 + jne l1 ;jumpIfNotEqual 2 + mov eax, 0 ;Affect + jmp l0 ;Jump +l1 : mov eax, 1 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/prio67-1.nasm b/test/nasm-ref/prio67-1.nasm new file mode 100644 index 0000000..dd5f56b --- /dev/null +++ b/test/nasm-ref/prio67-1.nasm @@ -0,0 +1,47 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 0 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov eax, 1 ;Affect + jmp l2 ;Jump +l3 : mov eax, 0 ;Affect +l2 : cmp eax, 0 ;jumpIfNotEqual 1 + jne l1 ;jumpIfNotEqual 2 + mov eax, 1 ;jumpIfNotEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov eax, 0 ;Affect + jmp l0 ;Jump +l1 : mov eax, 1 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/prio67-2.nasm b/test/nasm-ref/prio67-2.nasm new file mode 100644 index 0000000..94d07a6 --- /dev/null +++ b/test/nasm-ref/prio67-2.nasm @@ -0,0 +1,47 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov eax, 0 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov ebx, 1 ;Affect + jmp l2 ;Jump +l3 : mov ebx, 0 ;Affect +l2 : mov eax, 1 ;jumpIfNotEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + cmp ebx, 0 ;jumpIfNotEqual 1 + jne l1 ;jumpIfNotEqual 2 + mov eax, 0 ;Affect + jmp l0 ;Jump +l1 : mov eax, 1 ;Affect +l0 : mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/rec1.nasm b/test/nasm-ref/rec1.nasm new file mode 100644 index 0000000..c0f7379 --- /dev/null +++ b/test/nasm-ref/rec1.nasm @@ -0,0 +1,81 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;Affect + cmp dword [ebp+12], 1 ;JumpIfEqual 1 + je l2 ;JumpIfEqual 2 + mov eax, 0 ;Affect +l2 : cmp eax, 0 ;JumpIfEqual 1 + je l0 ;JumpIfEqual 2 + mov dword [ebp+8], 1 ;ecriture de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret + jmp l1 ;Jump +l0 : mov eax, dword [ebp+12] + sub eax, 1 + push eax ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop ebx ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + mov eax, 1 + add eax, ebx + mov dword [ebp+8], eax ;ecriture de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +l1 : add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + push 100 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop eax ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/si1.nasm b/test/nasm-ref/si1.nasm new file mode 100644 index 0000000..cc1e237 --- /dev/null +++ b/test/nasm-ref/si1.nasm @@ -0,0 +1,33 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 +l1 : add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/si2.nasm b/test/nasm-ref/si2.nasm new file mode 100644 index 0000000..a79e6a0 --- /dev/null +++ b/test/nasm-ref/si2.nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 0 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + jmp l1 ;Jump +l0 : mov eax, 0 ;Write 1 + call iprintLF ;Write 2 +l1 : add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/si3.nasm b/test/nasm-ref/si3.nasm new file mode 100644 index 0000000..4f10ce8 --- /dev/null +++ b/test/nasm-ref/si3.nasm @@ -0,0 +1,38 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + jmp l1 ;Jump +l0 : mov eax, 0 ;Write 1 + call iprintLF ;Write 2 +l1 : mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/si4.nasm b/test/nasm-ref/si4.nasm new file mode 100644 index 0000000..4af0c4e --- /dev/null +++ b/test/nasm-ref/si4.nasm @@ -0,0 +1,38 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 0 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + jmp l1 ;Jump +l0 : mov eax, 0 ;Write 1 + call iprintLF ;Write 2 +l1 : mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/si5.nasm b/test/nasm-ref/si5.nasm new file mode 100644 index 0000000..0676633 --- /dev/null +++ b/test/nasm-ref/si5.nasm @@ -0,0 +1,40 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + mov eax, 1 ;JumpIfEqual 1 + cmp eax, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 +l3 : mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/sub1.nasm b/test/nasm-ref/sub1.nasm new file mode 100644 index 0000000..70cc077 --- /dev/null +++ b/test/nasm-ref/sub1.nasm @@ -0,0 +1,32 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 10 + sub eax, 5 + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/sub2.nasm b/test/nasm-ref/sub2.nasm new file mode 100644 index 0000000..f8201ed --- /dev/null +++ b/test/nasm-ref/sub2.nasm @@ -0,0 +1,32 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 7 + sub eax, 20 + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/sub3.nasm b/test/nasm-ref/sub3.nasm new file mode 100644 index 0000000..f45bc07 --- /dev/null +++ b/test/nasm-ref/sub3.nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 2 + sub eax, 1 + mov eax, eax + sub eax, 1 + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/tab1.nasm b/test/nasm-ref/tab1.nasm new file mode 100644 index 0000000..c5ab2ad --- /dev/null +++ b/test/nasm-ref/tab1.nasm @@ -0,0 +1,50 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +tab : resd 12 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 0 + imul eax, 4 + mov dword [tab+eax], 0 ;Affect + mov eax, 1 + imul eax, 4 + mov dword [tab+eax], 1 ;Affect + mov eax, 2 + imul eax, 4 + mov dword [tab+eax], 2 ;Affect + mov eax, 0 + imul eax, 4 + mov eax, dword [tab+eax] ;Write 1 + call iprintLF ;Write 2 + mov eax, 1 + imul eax, 4 + mov eax, dword [tab+eax] ;Write 1 + call iprintLF ;Write 2 + mov eax, 2 + imul eax, 4 + mov eax, dword [tab+eax] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/tab2.nasm b/test/nasm-ref/tab2.nasm new file mode 100644 index 0000000..11220cb --- /dev/null +++ b/test/nasm-ref/tab2.nasm @@ -0,0 +1,57 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +tab : resd 20 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov dword [ebp-4], 2 ;Affect + mov eax, dword [ebp-4] + add eax, 0 + mov eax, eax + imul eax, 4 + mov dword [tab+eax], 34 ;Affect + mov eax, dword [ebp-4] + add eax, 1 + mov eax, eax + imul eax, 4 + mov dword [tab+eax], 74 ;Affect + mov eax, dword [ebp-4] + add eax, 2 + mov eax, eax + imul eax, 4 + mov dword [tab+eax], 16 ;Affect + mov eax, 2 + imul eax, 4 + mov eax, dword [tab+eax] ;Write 1 + call iprintLF ;Write 2 + mov eax, 3 + imul eax, 4 + mov eax, dword [tab+eax] ;Write 1 + call iprintLF ;Write 2 + mov eax, 4 + imul eax, 4 + mov eax, dword [tab+eax] ;Write 1 + call iprintLF ;Write 2 + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/tab3.nasm b/test/nasm-ref/tab3.nasm new file mode 100644 index 0000000..a992cbd --- /dev/null +++ b/test/nasm-ref/tab3.nasm @@ -0,0 +1,60 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +tab : resd 20 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 8 ;allocation des variables locales + mov dword [ebp-4], 2 ;Affect + mov dword [ebp-8], 0 ;Affect + mov eax, dword [ebp-4] + add eax, dword [ebp-8] + mov eax, eax + imul eax, 4 + mov dword [tab+eax], 34 ;Affect + mov dword [ebp-8], 1 ;Affect + mov eax, dword [ebp-4] + add eax, dword [ebp-8] + mov eax, eax + imul eax, 4 + mov dword [tab+eax], 74 ;Affect + mov dword [ebp-8], 2 ;Affect + mov eax, dword [ebp-4] + add eax, dword [ebp-8] + mov eax, eax + imul eax, 4 + mov dword [tab+eax], 16 ;Affect + mov eax, 2 + imul eax, 4 + mov eax, dword [tab+eax] ;Write 1 + call iprintLF ;Write 2 + mov eax, 3 + imul eax, 4 + mov eax, dword [tab+eax] ;Write 1 + call iprintLF ;Write 2 + mov eax, 4 + imul eax, 4 + mov eax, dword [tab+eax] ;Write 1 + call iprintLF ;Write 2 + add esp, 8 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/tab4.nasm b/test/nasm-ref/tab4.nasm new file mode 100644 index 0000000..ebef473 --- /dev/null +++ b/test/nasm-ref/tab4.nasm @@ -0,0 +1,56 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +tab : resd 12 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 0 + imul eax, 4 + mov dword [tab+eax], 1 ;Affect + mov eax, 0 + imul eax, 4 + mov eax, dword [tab+eax] + imul eax, 4 + mov dword [tab+eax], 12 ;Affect + mov eax, 0 + imul eax, 4 + mov eax, dword [tab+eax] + add eax, 1 + mov eax, eax + imul eax, 4 + mov dword [tab+eax], 13 ;Affect + mov eax, 0 + imul eax, 4 + mov eax, dword [tab+eax] ;Write 1 + call iprintLF ;Write 2 + mov eax, 1 + imul eax, 4 + mov eax, dword [tab+eax] ;Write 1 + call iprintLF ;Write 2 + mov eax, 2 + imul eax, 4 + mov eax, dword [tab+eax] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/tantque1.nasm b/test/nasm-ref/tantque1.nasm new file mode 100644 index 0000000..7d86ffb --- /dev/null +++ b/test/nasm-ref/tantque1.nasm @@ -0,0 +1,44 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov dword [ebp-4], 10 ;Affect +l0 : mov ebx, 1 ;Affect + mov eax, 0 ;JumpIfLess 1 + cmp eax, dword [ebp-4] ;on passe par un registre temporaire + jl l2 ;JumpIfLess 2 + mov ebx, 0 ;Affect +l2 : cmp ebx, 0 ;JumpIfEqual 1 + je l1 ;JumpIfEqual 2 + mov eax, dword [ebp-4] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp-4] + sub eax, 1 + mov dword [ebp-4], eax ;Affect + jmp l0 ;Jump +l1 : mov eax, 0 ;Write 1 + call iprintLF ;Write 2 + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/tantque2.nasm b/test/nasm-ref/tantque2.nasm new file mode 100644 index 0000000..760a377 --- /dev/null +++ b/test/nasm-ref/tantque2.nasm @@ -0,0 +1,54 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 8 ;allocation des variables locales + mov dword [ebp-4], 0 ;Affect +l0 : mov eax, 1 ;Affect + cmp dword [ebp-4], 4 ;JumpIfLess 1 + jl l2 ;JumpIfLess 2 + mov eax, 0 ;Affect +l2 : cmp eax, 0 ;JumpIfEqual 1 + je l1 ;JumpIfEqual 2 + mov dword [ebp-8], 0 ;Affect +l3 : mov eax, 1 ;Affect + cmp dword [ebp-8], 4 ;JumpIfLess 1 + jl l5 ;JumpIfLess 2 + mov eax, 0 ;Affect +l5 : cmp eax, 0 ;JumpIfEqual 1 + je l4 ;JumpIfEqual 2 + mov eax, dword [ebp-4] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp-8] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp-8] + add eax, 1 + mov dword [ebp-8], eax ;Affect + jmp l3 ;Jump +l4 : mov eax, dword [ebp-4] + add eax, 1 + mov dword [ebp-4], eax ;Affect + jmp l0 ;Jump +l1 : add esp, 8 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/tri.nasm b/test/nasm-ref/tri.nasm new file mode 100644 index 0000000..ed7a9fd --- /dev/null +++ b/test/nasm-ref/tri.nasm @@ -0,0 +1,214 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +tab : resd 40 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +initialiser : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 0 + imul eax, 4 + mov dword [tab+eax], 8 ;Affect + mov eax, 1 + imul eax, 4 + mov dword [tab+eax], 6 ;Affect + mov eax, 2 + imul eax, 4 + mov dword [tab+eax], 9 ;Affect + mov eax, 3 + imul eax, 4 + mov dword [tab+eax], 9 ;Affect + mov eax, 4 + imul eax, 4 + mov dword [tab+eax], 4 ;Affect + mov eax, 5 + imul eax, 4 + mov dword [tab+eax], 2 ;Affect + mov eax, 6 + imul eax, 4 + mov dword [tab+eax], 3 ;Affect + mov eax, 7 + imul eax, 4 + mov dword [tab+eax], 1 ;Affect + mov eax, 8 + imul eax, 4 + mov dword [tab+eax], 4 ;Affect + mov eax, 9 + imul eax, 4 + mov dword [tab+eax], 5 ;Affect + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +afficher : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov dword [ebp-4], 0 ;Affect +l0 : mov ebx, 1 ;Affect + mov eax, dword [ebp-4] ;JumpIfLess 1 + cmp eax, dword [ebp+12] ;on passe par un registre temporaire + jl l2 ;JumpIfLess 2 + mov ebx, 0 ;Affect +l2 : cmp ebx, 0 ;JumpIfEqual 1 + je l1 ;JumpIfEqual 2 + mov eax, dword [ebp-4] + imul eax, 4 + mov eax, dword [tab+eax] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp-4] + add eax, 1 + mov dword [ebp-4], eax ;Affect + jmp l0 ;Jump +l1 : mov eax, 0 ;Write 1 + call iprintLF ;Write 2 + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +echanger : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov eax, dword [ebp+12] + imul eax, 4 + mov eax, dword [tab+eax] ;Affect + mov dword [ebp-4], eax ;on passe par un registre temporaire + mov eax, dword [ebp+16] + imul eax, 4 + mov ebx, dword [ebp+12] + imul ebx, 4 + mov eax, dword [tab+eax] ;Affect + mov dword [tab+ebx], eax ;on passe par un registre temporaire + mov ebx, dword [ebp+16] + imul ebx, 4 + mov eax, dword [ebp-4] ;Affect + mov dword [tab+ebx], eax ;on passe par un registre temporaire + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +trier : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 12 ;allocation des variables locales + mov eax, dword [ebp+12] ;Affect + mov dword [ebp-12], eax ;on passe par un registre temporaire + mov dword [ebp-4], 1 ;Affect +l3 : mov eax, 1 ;Affect + cmp dword [ebp-4], 1 ;JumpIfEqual 1 + je l5 ;JumpIfEqual 2 + mov eax, 0 ;Affect +l5 : cmp eax, 0 ;JumpIfEqual 1 + je l4 ;JumpIfEqual 2 + mov dword [ebp-4], 0 ;Affect + mov dword [ebp-8], 0 ;Affect +l6 : mov eax, dword [ebp-12] + sub eax, 1 + mov ebx, 1 ;Affect + cmp dword [ebp-8], eax ;JumpIfLess 1 + jl l8 ;JumpIfLess 2 + mov ebx, 0 ;Affect +l8 : cmp ebx, 0 ;JumpIfEqual 1 + je l7 ;JumpIfEqual 2 + mov ebx, dword [ebp-8] + add ebx, 1 + mov eax, 1 ;Affect + mov ebx, ebx + imul ebx, 4 + mov ecx, dword [ebp-8] + imul ecx, 4 + mov ebx, dword [tab+ebx] ;JumpIfLess 1 + cmp ebx, dword [tab+ecx] ;on passe par un registre temporaire + jl l11 ;JumpIfLess 2 + mov eax, 0 ;Affect +l11 : cmp eax, 0 ;JumpIfEqual 1 + je l10 ;JumpIfEqual 2 + push dword [ebp-8] ;Param + mov eax, dword [ebp-8] + add eax, 1 + push eax ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call echanger + pop eax ;récupération de la valeur de retour + add esp, 8 ;désallocation des arguments + mov dword [ebp-4], 1 ;Affect +l10 : mov eax, dword [ebp-8] + add eax, 1 + mov dword [ebp-8], eax ;Affect + jmp l6 ;Jump +l7 : mov eax, dword [ebp-12] + sub eax, 1 + mov dword [ebp-12], eax ;Affect + jmp l3 ;Jump +l4 : add esp, 12 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + sub esp, 4 ;allocation mémoire pour la valeur de retour + call initialiser + pop eax ;récupération de la valeur de retour + push 10 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call afficher + pop eax ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + push 10 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call trier + pop eax ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + push 10 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call afficher + pop eax ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/varglob1.nasm b/test/nasm-ref/varglob1.nasm new file mode 100644 index 0000000..f2d6bb5 --- /dev/null +++ b/test/nasm-ref/varglob1.nasm @@ -0,0 +1,32 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +variable : resd 4 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov dword [variable], 6834 ;Affect + mov eax, dword [variable] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/varglob2.nasm b/test/nasm-ref/varglob2.nasm new file mode 100644 index 0000000..0d3aa1a --- /dev/null +++ b/test/nasm-ref/varglob2.nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +variable : resd 4 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov dword [variable], 10 ;Affect + mov eax, dword [variable] + add eax, 50 + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/varglob3.nasm b/test/nasm-ref/varglob3.nasm new file mode 100644 index 0000000..3e82be4 --- /dev/null +++ b/test/nasm-ref/varglob3.nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +var2 : resd 4 ;variable globale +var1 : resd 4 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov dword [var1], 10 ;Affect + mov dword [var2], 34 ;Affect + mov eax, dword [var1] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [var2] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/varglob4.nasm b/test/nasm-ref/varglob4.nasm new file mode 100644 index 0000000..426256a --- /dev/null +++ b/test/nasm-ref/varglob4.nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +var2 : resd 4 ;variable globale +var1 : resd 4 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov dword [var1], 10 ;Affect + mov dword [var2], 34 ;Affect + mov eax, dword [var1] + add eax, dword [var2] + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/varloc1.nasm b/test/nasm-ref/varloc1.nasm new file mode 100644 index 0000000..f16e7b4 --- /dev/null +++ b/test/nasm-ref/varloc1.nasm @@ -0,0 +1,31 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov dword [ebp-4], 6834 ;Affect + mov eax, dword [ebp-4] ;Write 1 + call iprintLF ;Write 2 + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/varloc2.nasm b/test/nasm-ref/varloc2.nasm new file mode 100644 index 0000000..6fa1b7f --- /dev/null +++ b/test/nasm-ref/varloc2.nasm @@ -0,0 +1,33 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov dword [ebp-4], 10 ;Affect + mov eax, dword [ebp-4] + add eax, 50 + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/varloc3.nasm b/test/nasm-ref/varloc3.nasm new file mode 100644 index 0000000..821c6cd --- /dev/null +++ b/test/nasm-ref/varloc3.nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 8 ;allocation des variables locales + mov dword [ebp-4], 10 ;Affect + mov dword [ebp-8], 30 ;Affect + mov eax, dword [ebp-4] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp-8] ;Write 1 + call iprintLF ;Write 2 + add esp, 8 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/varloc4.nasm b/test/nasm-ref/varloc4.nasm new file mode 100644 index 0000000..931ea58 --- /dev/null +++ b/test/nasm-ref/varloc4.nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 8 ;allocation des variables locales + mov dword [ebp-4], 10 ;Affect + mov dword [ebp-8], 30 ;Affect + mov eax, dword [ebp-4] + add eax, dword [ebp-8] + mov eax, eax ;Write 1 + call iprintLF ;Write 2 + add esp, 8 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/nasm-ref/varloc5.nasm b/test/nasm-ref/varloc5.nasm new file mode 100644 index 0000000..58b8668 --- /dev/null +++ b/test/nasm-ref/varloc5.nasm @@ -0,0 +1,52 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +var1 : resd 4 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop eax ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov dword [ebp-4], 10 ;Affect + mov eax, dword [ebp-4] ;Write 1 + call iprintLF ;Write 2 + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov dword [var1], 20 ;Affect + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop eax ;récupération de la valeur de retour + mov eax, dword [var1] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/out-ref/add1.out b/test/out-ref/add1.out new file mode 100644 index 0000000..b1bd38b --- /dev/null +++ b/test/out-ref/add1.out @@ -0,0 +1 @@ +13 diff --git a/test/out-ref/add2.out b/test/out-ref/add2.out new file mode 100644 index 0000000..8351c19 --- /dev/null +++ b/test/out-ref/add2.out @@ -0,0 +1 @@ +14 diff --git a/test/out-ref/affect1.out b/test/out-ref/affect1.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/affect1.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/affect2.out b/test/out-ref/affect2.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/affect2.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/affect3.out b/test/out-ref/affect3.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/affect3.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/and1.out b/test/out-ref/and1.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/and1.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/and2.out b/test/out-ref/and2.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/and2.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/and3.out b/test/out-ref/and3.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/and3.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/and4.out b/test/out-ref/and4.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/and4.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/and5.out b/test/out-ref/and5.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/and5.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/appel-param1.out b/test/out-ref/appel-param1.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/appel-param1.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/appel-param2.out b/test/out-ref/appel-param2.out new file mode 100644 index 0000000..fe3862e --- /dev/null +++ b/test/out-ref/appel-param2.out @@ -0,0 +1,2 @@ +1 +456 diff --git a/test/out-ref/appel-param3.out b/test/out-ref/appel-param3.out new file mode 100644 index 0000000..8a1218a --- /dev/null +++ b/test/out-ref/appel-param3.out @@ -0,0 +1,5 @@ +1 +2 +3 +4 +5 diff --git a/test/out-ref/appel-retour1.out b/test/out-ref/appel-retour1.out new file mode 100644 index 0000000..810283d --- /dev/null +++ b/test/out-ref/appel-retour1.out @@ -0,0 +1 @@ +3712 diff --git a/test/out-ref/appel1.out b/test/out-ref/appel1.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/appel1.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/appel2.out b/test/out-ref/appel2.out new file mode 100644 index 0000000..1191247 --- /dev/null +++ b/test/out-ref/appel2.out @@ -0,0 +1,2 @@ +1 +2 diff --git a/test/out-ref/appel3.out b/test/out-ref/appel3.out new file mode 100644 index 0000000..1191247 --- /dev/null +++ b/test/out-ref/appel3.out @@ -0,0 +1,2 @@ +1 +2 diff --git a/test/out-ref/div1.out b/test/out-ref/div1.out new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/test/out-ref/div1.out @@ -0,0 +1 @@ +2 diff --git a/test/out-ref/div2.out b/test/out-ref/div2.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/div2.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/div3.out b/test/out-ref/div3.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/div3.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/div4.out b/test/out-ref/div4.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/div4.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/ecrire1.out b/test/out-ref/ecrire1.out new file mode 100644 index 0000000..169efa8 --- /dev/null +++ b/test/out-ref/ecrire1.out @@ -0,0 +1 @@ +3456 diff --git a/test/out-ref/ecrire2.out b/test/out-ref/ecrire2.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/ecrire2.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/egal1.out b/test/out-ref/egal1.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/egal1.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/egal2.out b/test/out-ref/egal2.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/egal2.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/egal3.out b/test/out-ref/egal3.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/egal3.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/err5.out b/test/out-ref/err5.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/err5.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/fibo.out b/test/out-ref/fibo.out new file mode 100644 index 0000000..c3f407c --- /dev/null +++ b/test/out-ref/fibo.out @@ -0,0 +1 @@ +55 diff --git a/test/out-ref/inf1.out b/test/out-ref/inf1.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/inf1.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/inf2.out b/test/out-ref/inf2.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/inf2.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/inf3.out b/test/out-ref/inf3.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/inf3.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/inf4.out b/test/out-ref/inf4.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/inf4.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/mult1.out b/test/out-ref/mult1.out new file mode 100644 index 0000000..1e8b314 --- /dev/null +++ b/test/out-ref/mult1.out @@ -0,0 +1 @@ +6 diff --git a/test/out-ref/mult2.out b/test/out-ref/mult2.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/mult2.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/mult3.out b/test/out-ref/mult3.out new file mode 100644 index 0000000..3c03207 --- /dev/null +++ b/test/out-ref/mult3.out @@ -0,0 +1 @@ +18 diff --git a/test/out-ref/not1.out b/test/out-ref/not1.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/not1.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/not2.out b/test/out-ref/not2.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/not2.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/not3.out b/test/out-ref/not3.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/not3.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/or1.out b/test/out-ref/or1.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/or1.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/or2.out b/test/out-ref/or2.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/or2.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/or3.out b/test/out-ref/or3.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/or3.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/or4.out b/test/out-ref/or4.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/or4.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/or5.out b/test/out-ref/or5.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/or5.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/parenth1.out b/test/out-ref/parenth1.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/parenth1.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/parenth2.out b/test/out-ref/parenth2.out new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/test/out-ref/parenth2.out @@ -0,0 +1 @@ +2 diff --git a/test/out-ref/prio23-1.out b/test/out-ref/prio23-1.out new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/test/out-ref/prio23-1.out @@ -0,0 +1 @@ +10 diff --git a/test/out-ref/prio23-2.out b/test/out-ref/prio23-2.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/prio23-2.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/prio23-3.out b/test/out-ref/prio23-3.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/prio23-3.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/prio23-4.out b/test/out-ref/prio23-4.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/prio23-4.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/prio34-1.out b/test/out-ref/prio34-1.out new file mode 100644 index 0000000..8351c19 --- /dev/null +++ b/test/out-ref/prio34-1.out @@ -0,0 +1 @@ +14 diff --git a/test/out-ref/prio34-2.out b/test/out-ref/prio34-2.out new file mode 100644 index 0000000..0cfbf08 --- /dev/null +++ b/test/out-ref/prio34-2.out @@ -0,0 +1 @@ +2 diff --git a/test/out-ref/prio34-3.out b/test/out-ref/prio34-3.out new file mode 100644 index 0000000..6446481 --- /dev/null +++ b/test/out-ref/prio34-3.out @@ -0,0 +1 @@ +-70 diff --git a/test/out-ref/prio34-4.out b/test/out-ref/prio34-4.out new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/test/out-ref/prio34-4.out @@ -0,0 +1 @@ +8 diff --git a/test/out-ref/prio45-1.out b/test/out-ref/prio45-1.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/prio45-1.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/prio45-2.out b/test/out-ref/prio45-2.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/prio45-2.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/prio45-3.out b/test/out-ref/prio45-3.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/prio45-3.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/prio45-4.out b/test/out-ref/prio45-4.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/prio45-4.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/prio56-1.out b/test/out-ref/prio56-1.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/prio56-1.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/prio56-2.out b/test/out-ref/prio56-2.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/prio56-2.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/prio67-1.out b/test/out-ref/prio67-1.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/prio67-1.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/prio67-2.out b/test/out-ref/prio67-2.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/prio67-2.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/rec1.out b/test/out-ref/rec1.out new file mode 100644 index 0000000..29d6383 --- /dev/null +++ b/test/out-ref/rec1.out @@ -0,0 +1 @@ +100 diff --git a/test/out-ref/si1.out b/test/out-ref/si1.out new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/test/out-ref/si1.out @@ -0,0 +1 @@ +1 diff --git a/test/out-ref/si2.out b/test/out-ref/si2.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/si2.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/si3.out b/test/out-ref/si3.out new file mode 100644 index 0000000..6ed281c --- /dev/null +++ b/test/out-ref/si3.out @@ -0,0 +1,2 @@ +1 +1 diff --git a/test/out-ref/si4.out b/test/out-ref/si4.out new file mode 100644 index 0000000..0d66ea1 --- /dev/null +++ b/test/out-ref/si4.out @@ -0,0 +1,2 @@ +0 +1 diff --git a/test/out-ref/si5.out b/test/out-ref/si5.out new file mode 100644 index 0000000..e8183f0 --- /dev/null +++ b/test/out-ref/si5.out @@ -0,0 +1,3 @@ +1 +1 +1 diff --git a/test/out-ref/sub1.out b/test/out-ref/sub1.out new file mode 100644 index 0000000..7ed6ff8 --- /dev/null +++ b/test/out-ref/sub1.out @@ -0,0 +1 @@ +5 diff --git a/test/out-ref/sub2.out b/test/out-ref/sub2.out new file mode 100644 index 0000000..995f07c --- /dev/null +++ b/test/out-ref/sub2.out @@ -0,0 +1 @@ +-13 diff --git a/test/out-ref/sub3.out b/test/out-ref/sub3.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/test/out-ref/sub3.out @@ -0,0 +1 @@ +0 diff --git a/test/out-ref/tab1.out b/test/out-ref/tab1.out new file mode 100644 index 0000000..4539bbf --- /dev/null +++ b/test/out-ref/tab1.out @@ -0,0 +1,3 @@ +0 +1 +2 diff --git a/test/out-ref/tab2.out b/test/out-ref/tab2.out new file mode 100644 index 0000000..ecfe662 --- /dev/null +++ b/test/out-ref/tab2.out @@ -0,0 +1,3 @@ +34 +74 +16 diff --git a/test/out-ref/tab3.out b/test/out-ref/tab3.out new file mode 100644 index 0000000..ecfe662 --- /dev/null +++ b/test/out-ref/tab3.out @@ -0,0 +1,3 @@ +34 +74 +16 diff --git a/test/out-ref/tab4.out b/test/out-ref/tab4.out new file mode 100644 index 0000000..fa56b0b --- /dev/null +++ b/test/out-ref/tab4.out @@ -0,0 +1,3 @@ +1 +12 +13 diff --git a/test/out-ref/tantque1.out b/test/out-ref/tantque1.out new file mode 100644 index 0000000..30b148d --- /dev/null +++ b/test/out-ref/tantque1.out @@ -0,0 +1,11 @@ +10 +9 +8 +7 +6 +5 +4 +3 +2 +1 +0 diff --git a/test/out-ref/tantque2.out b/test/out-ref/tantque2.out new file mode 100644 index 0000000..4ee1d37 --- /dev/null +++ b/test/out-ref/tantque2.out @@ -0,0 +1,32 @@ +0 +0 +0 +1 +0 +2 +0 +3 +1 +0 +1 +1 +1 +2 +1 +3 +2 +0 +2 +1 +2 +2 +2 +3 +3 +0 +3 +1 +3 +2 +3 +3 diff --git a/test/out-ref/tri.out b/test/out-ref/tri.out new file mode 100644 index 0000000..d32f608 --- /dev/null +++ b/test/out-ref/tri.out @@ -0,0 +1,22 @@ +8 +6 +9 +9 +4 +2 +3 +1 +4 +5 +0 +1 +2 +3 +4 +4 +5 +6 +8 +9 +9 +0 diff --git a/test/out-ref/varglob1.out b/test/out-ref/varglob1.out new file mode 100644 index 0000000..0f94b34 --- /dev/null +++ b/test/out-ref/varglob1.out @@ -0,0 +1 @@ +6834 diff --git a/test/out-ref/varglob2.out b/test/out-ref/varglob2.out new file mode 100644 index 0000000..abdfb05 --- /dev/null +++ b/test/out-ref/varglob2.out @@ -0,0 +1 @@ +60 diff --git a/test/out-ref/varglob3.out b/test/out-ref/varglob3.out new file mode 100644 index 0000000..8ba133e --- /dev/null +++ b/test/out-ref/varglob3.out @@ -0,0 +1,2 @@ +10 +34 diff --git a/test/out-ref/varglob4.out b/test/out-ref/varglob4.out new file mode 100644 index 0000000..c739b42 --- /dev/null +++ b/test/out-ref/varglob4.out @@ -0,0 +1 @@ +44 diff --git a/test/out-ref/varloc1.out b/test/out-ref/varloc1.out new file mode 100644 index 0000000..0f94b34 --- /dev/null +++ b/test/out-ref/varloc1.out @@ -0,0 +1 @@ +6834 diff --git a/test/out-ref/varloc2.out b/test/out-ref/varloc2.out new file mode 100644 index 0000000..abdfb05 --- /dev/null +++ b/test/out-ref/varloc2.out @@ -0,0 +1 @@ +60 diff --git a/test/out-ref/varloc3.out b/test/out-ref/varloc3.out new file mode 100644 index 0000000..3d1851c --- /dev/null +++ b/test/out-ref/varloc3.out @@ -0,0 +1,2 @@ +10 +30 diff --git a/test/out-ref/varloc4.out b/test/out-ref/varloc4.out new file mode 100644 index 0000000..425151f --- /dev/null +++ b/test/out-ref/varloc4.out @@ -0,0 +1 @@ +40 diff --git a/test/out-ref/varloc5.out b/test/out-ref/varloc5.out new file mode 100644 index 0000000..3b86147 --- /dev/null +++ b/test/out-ref/varloc5.out @@ -0,0 +1,2 @@ +10 +20 diff --git a/test/pre-nasm-ref/add1.pre-nasm b/test/pre-nasm-ref/add1.pre-nasm new file mode 100644 index 0000000..a85129f --- /dev/null +++ b/test/pre-nasm-ref/add1.pre-nasm @@ -0,0 +1,32 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 3 + add @1, 10 + mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/add2.pre-nasm b/test/pre-nasm-ref/add2.pre-nasm new file mode 100644 index 0000000..c32aa25 --- /dev/null +++ b/test/pre-nasm-ref/add2.pre-nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 2 + add @1, 4 + mov @2, @1 + add @2, 8 + mov eax, @2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/affect1.pre-nasm b/test/pre-nasm-ref/affect1.pre-nasm new file mode 100644 index 0000000..58fe6a9 --- /dev/null +++ b/test/pre-nasm-ref/affect1.pre-nasm @@ -0,0 +1,32 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +a : resd 4 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov dword [a], 1 ;Affect + mov eax, dword [a] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/affect2.pre-nasm b/test/pre-nasm-ref/affect2.pre-nasm new file mode 100644 index 0000000..c5e4bb7 --- /dev/null +++ b/test/pre-nasm-ref/affect2.pre-nasm @@ -0,0 +1,31 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov dword [ebp-4], 1 ;Affect + mov eax, dword [ebp-4] ;Write 1 + call iprintLF ;Write 2 + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/affect3.pre-nasm b/test/pre-nasm-ref/affect3.pre-nasm new file mode 100644 index 0000000..cad08c4 --- /dev/null +++ b/test/pre-nasm-ref/affect3.pre-nasm @@ -0,0 +1,50 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov dword [ebp+12], 1 ;Affect + mov eax, dword [ebp+12] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + push 3 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop @1 ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/and1.pre-nasm b/test/pre-nasm-ref/and1.pre-nasm new file mode 100644 index 0000000..13ff14a --- /dev/null +++ b/test/pre-nasm-ref/and1.pre-nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @8, 1 ;JumpIfEqual 1 + cmp @8, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov @9, 1 ;JumpIfEqual 1 + cmp @9, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov @1, 1 ;Affect + jmp l0 ;Jump +l1 : mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/and2.pre-nasm b/test/pre-nasm-ref/and2.pre-nasm new file mode 100644 index 0000000..cc749c5 --- /dev/null +++ b/test/pre-nasm-ref/and2.pre-nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @8, 1 ;JumpIfEqual 1 + cmp @8, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov @9, 0 ;JumpIfEqual 1 + cmp @9, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov @1, 1 ;Affect + jmp l0 ;Jump +l1 : mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/and3.pre-nasm b/test/pre-nasm-ref/and3.pre-nasm new file mode 100644 index 0000000..9629341 --- /dev/null +++ b/test/pre-nasm-ref/and3.pre-nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @8, 0 ;JumpIfEqual 1 + cmp @8, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov @9, 1 ;JumpIfEqual 1 + cmp @9, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov @1, 1 ;Affect + jmp l0 ;Jump +l1 : mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/and4.pre-nasm b/test/pre-nasm-ref/and4.pre-nasm new file mode 100644 index 0000000..99c1ee1 --- /dev/null +++ b/test/pre-nasm-ref/and4.pre-nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @8, 0 ;JumpIfEqual 1 + cmp @8, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov @9, 0 ;JumpIfEqual 1 + cmp @9, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov @1, 1 ;Affect + jmp l0 ;Jump +l1 : mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/and5.pre-nasm b/test/pre-nasm-ref/and5.pre-nasm new file mode 100644 index 0000000..cace673 --- /dev/null +++ b/test/pre-nasm-ref/and5.pre-nasm @@ -0,0 +1,47 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @9, 1 ;JumpIfEqual 1 + cmp @9, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov @10, 0 ;JumpIfEqual 1 + cmp @10, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov @2, 1 ;Affect + jmp l2 ;Jump +l3 : mov @2, 0 ;Affect +l2 : cmp @2, 0 ;JumpIfEqual 1 + je l1 ;JumpIfEqual 2 + mov @11, 1 ;JumpIfEqual 1 + cmp @11, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov @1, 1 ;Affect + jmp l0 ;Jump +l1 : mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/appel-param1.pre-nasm b/test/pre-nasm-ref/appel-param1.pre-nasm new file mode 100644 index 0000000..fd584ca --- /dev/null +++ b/test/pre-nasm-ref/appel-param1.pre-nasm @@ -0,0 +1,49 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, dword [ebp+12] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + push 1 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop @1 ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/appel-param2.pre-nasm b/test/pre-nasm-ref/appel-param2.pre-nasm new file mode 100644 index 0000000..1a57087 --- /dev/null +++ b/test/pre-nasm-ref/appel-param2.pre-nasm @@ -0,0 +1,52 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, dword [ebp+16] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp+12] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + push 1 ;Param + push 456 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop @1 ;récupération de la valeur de retour + add esp, 8 ;désallocation des arguments + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/appel-param3.pre-nasm b/test/pre-nasm-ref/appel-param3.pre-nasm new file mode 100644 index 0000000..78e7ab7 --- /dev/null +++ b/test/pre-nasm-ref/appel-param3.pre-nasm @@ -0,0 +1,61 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, dword [ebp+28] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp+24] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp+20] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp+16] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp+12] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + push 1 ;Param + push 2 ;Param + push 3 ;Param + push 4 ;Param + push 5 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop @1 ;récupération de la valeur de retour + add esp, 20 ;désallocation des arguments + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/appel-retour1.pre-nasm b/test/pre-nasm-ref/appel-retour1.pre-nasm new file mode 100644 index 0000000..0841180 --- /dev/null +++ b/test/pre-nasm-ref/appel-retour1.pre-nasm @@ -0,0 +1,58 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @8, dword [ebp+12] ;ecriture de la valeur de retour + mov dword [ebp+8], @8 ;on passe par un registre temporaire + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + push 3712 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop @1 ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/appel1.pre-nasm b/test/pre-nasm-ref/appel1.pre-nasm new file mode 100644 index 0000000..ff03435 --- /dev/null +++ b/test/pre-nasm-ref/appel1.pre-nasm @@ -0,0 +1,47 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop @1 ;récupération de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/appel2.pre-nasm b/test/pre-nasm-ref/appel2.pre-nasm new file mode 100644 index 0000000..354f579 --- /dev/null +++ b/test/pre-nasm-ref/appel2.pre-nasm @@ -0,0 +1,66 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +g : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + sub esp, 4 ;allocation mémoire pour la valeur de retour + call g + pop @1 ;récupération de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop @2 ;récupération de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/appel3.pre-nasm b/test/pre-nasm-ref/appel3.pre-nasm new file mode 100644 index 0000000..6246b00 --- /dev/null +++ b/test/pre-nasm-ref/appel3.pre-nasm @@ -0,0 +1,66 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +g : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop @1 ;récupération de la valeur de retour + sub esp, 4 ;allocation mémoire pour la valeur de retour + call g + pop @2 ;récupération de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/div1.pre-nasm b/test/pre-nasm-ref/div1.pre-nasm new file mode 100644 index 0000000..fdbadf0 --- /dev/null +++ b/test/pre-nasm-ref/div1.pre-nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, 4 ;affectation des bits de poids faible du dividende + mov @10, 2 + idiv @10 + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov @1, eax + mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/div2.pre-nasm b/test/pre-nasm-ref/div2.pre-nasm new file mode 100644 index 0000000..03e43c7 --- /dev/null +++ b/test/pre-nasm-ref/div2.pre-nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, 0 ;affectation des bits de poids faible du dividende + mov @10, 712 + idiv @10 + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov @1, eax + mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/div3.pre-nasm b/test/pre-nasm-ref/div3.pre-nasm new file mode 100644 index 0000000..27cec5c --- /dev/null +++ b/test/pre-nasm-ref/div3.pre-nasm @@ -0,0 +1,42 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, 4 ;affectation des bits de poids faible du dividende + mov @11, 2 + idiv @11 + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov @1, eax + mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, @1 ;affectation des bits de poids faible du dividende + mov @15, 2 + idiv @15 + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov @2, eax + mov eax, @2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/div4.pre-nasm b/test/pre-nasm-ref/div4.pre-nasm new file mode 100644 index 0000000..af05666 --- /dev/null +++ b/test/pre-nasm-ref/div4.pre-nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, 2 ;affectation des bits de poids faible du dividende + mov @10, 3 + idiv @10 + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov @1, eax + mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/ecrire1.pre-nasm b/test/pre-nasm-ref/ecrire1.pre-nasm new file mode 100644 index 0000000..e49a65c --- /dev/null +++ b/test/pre-nasm-ref/ecrire1.pre-nasm @@ -0,0 +1,30 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 3456 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/ecrire2.pre-nasm b/test/pre-nasm-ref/ecrire2.pre-nasm new file mode 100644 index 0000000..cf9c039 --- /dev/null +++ b/test/pre-nasm-ref/ecrire2.pre-nasm @@ -0,0 +1,30 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 0 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/egal1.pre-nasm b/test/pre-nasm-ref/egal1.pre-nasm new file mode 100644 index 0000000..427c6ce --- /dev/null +++ b/test/pre-nasm-ref/egal1.pre-nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 1 ;Affect + mov @8, 123 ;JumpIfEqual 1 + cmp @8, 123 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/egal2.pre-nasm b/test/pre-nasm-ref/egal2.pre-nasm new file mode 100644 index 0000000..b85f93d --- /dev/null +++ b/test/pre-nasm-ref/egal2.pre-nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 1 ;Affect + mov @8, 412 ;JumpIfEqual 1 + cmp @8, 34 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/egal3.pre-nasm b/test/pre-nasm-ref/egal3.pre-nasm new file mode 100644 index 0000000..e0e2b89 --- /dev/null +++ b/test/pre-nasm-ref/egal3.pre-nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @2, 1 ;Affect + mov @9, 2 ;JumpIfEqual 1 + cmp @9, 2 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov @2, 0 ;Affect +l1 : mov @1, 1 ;Affect + cmp @2, 1 ;JumpIfEqual 1 + je l0 ;JumpIfEqual 2 + mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/fibo.pre-nasm b/test/pre-nasm-ref/fibo.pre-nasm new file mode 100644 index 0000000..bea531a --- /dev/null +++ b/test/pre-nasm-ref/fibo.pre-nasm @@ -0,0 +1,88 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +fibo : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 1 ;Affect + cmp dword [ebp+12], 2 ;JumpIfLess 1 + jl l2 ;JumpIfLess 2 + mov @1, 0 ;Affect +l2 : cmp @1, 0 ;JumpIfEqual 1 + je l0 ;JumpIfEqual 2 + mov dword [ebp+8], 1 ;ecriture de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret + jmp l1 ;Jump +l0 : mov @3, dword [ebp+12] + sub @3, 1 + push @3 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call fibo + pop @2 ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + mov @5, dword [ebp+12] + sub @5, 2 + push @5 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call fibo + pop @4 ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + mov @6, @2 + add @6, @4 + mov dword [ebp+8], @6 ;ecriture de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +l1 : add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + push 9 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call fibo + pop @7 ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + mov eax, @7 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/inf1.pre-nasm b/test/pre-nasm-ref/inf1.pre-nasm new file mode 100644 index 0000000..a0f0f2d --- /dev/null +++ b/test/pre-nasm-ref/inf1.pre-nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 1 ;Affect + mov @8, 3 ;JumpIfLess 1 + cmp @8, 3 ;on passe par un registre temporaire + jl l0 ;JumpIfLess 2 + mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/inf2.pre-nasm b/test/pre-nasm-ref/inf2.pre-nasm new file mode 100644 index 0000000..acd3a8a --- /dev/null +++ b/test/pre-nasm-ref/inf2.pre-nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 1 ;Affect + mov @8, 4 ;JumpIfLess 1 + cmp @8, 1 ;on passe par un registre temporaire + jl l0 ;JumpIfLess 2 + mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/inf3.pre-nasm b/test/pre-nasm-ref/inf3.pre-nasm new file mode 100644 index 0000000..eadc985 --- /dev/null +++ b/test/pre-nasm-ref/inf3.pre-nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 1 ;Affect + mov @8, 312 ;JumpIfLess 1 + cmp @8, 475 ;on passe par un registre temporaire + jl l0 ;JumpIfLess 2 + mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/inf4.pre-nasm b/test/pre-nasm-ref/inf4.pre-nasm new file mode 100644 index 0000000..9c90281 --- /dev/null +++ b/test/pre-nasm-ref/inf4.pre-nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main ; + pop r0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 ; +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov r2, 1 ;Affect + mov r9, 3 ;JumpIfLess 1 + cmp r9, 2 ;on passe par un registre temporaire + jl l1 ;JumpIfLess 2 + mov r2, 0 ;Affect +l1 : mov r1, 1 ;Affect + cmp r2, 1 ;JumpIfLess 1 + jl l0 ;JumpIfLess 2 + mov r1, 0 ;Affect +l0 : mov eax, r1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret ; diff --git a/test/pre-nasm-ref/mult1.pre-nasm b/test/pre-nasm-ref/mult1.pre-nasm new file mode 100644 index 0000000..1986d14 --- /dev/null +++ b/test/pre-nasm-ref/mult1.pre-nasm @@ -0,0 +1,32 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 2 + imul @1, 3 + mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/mult2.pre-nasm b/test/pre-nasm-ref/mult2.pre-nasm new file mode 100644 index 0000000..28d48a3 --- /dev/null +++ b/test/pre-nasm-ref/mult2.pre-nasm @@ -0,0 +1,32 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 0 + imul @1, 321 + mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/mult3.pre-nasm b/test/pre-nasm-ref/mult3.pre-nasm new file mode 100644 index 0000000..d9fbcbf --- /dev/null +++ b/test/pre-nasm-ref/mult3.pre-nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 3 + imul @1, 3 + mov @2, @1 + imul @2, 2 + mov eax, @2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/not1.pre-nasm b/test/pre-nasm-ref/not1.pre-nasm new file mode 100644 index 0000000..eb7b79f --- /dev/null +++ b/test/pre-nasm-ref/not1.pre-nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 1 ;Affect + mov @8, 1 ;JumpIfEqual 1 + cmp @8, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/not2.pre-nasm b/test/pre-nasm-ref/not2.pre-nasm new file mode 100644 index 0000000..2c7a875 --- /dev/null +++ b/test/pre-nasm-ref/not2.pre-nasm @@ -0,0 +1,35 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 1 ;Affect + mov @8, 0 ;JumpIfEqual 1 + cmp @8, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/not3.pre-nasm b/test/pre-nasm-ref/not3.pre-nasm new file mode 100644 index 0000000..f523d4f --- /dev/null +++ b/test/pre-nasm-ref/not3.pre-nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @2, 1 ;Affect + mov @9, 0 ;JumpIfEqual 1 + cmp @9, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov @2, 0 ;Affect +l1 : mov @1, 1 ;Affect + cmp @2, 0 ;JumpIfEqual 1 + je l0 ;JumpIfEqual 2 + mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/or1.pre-nasm b/test/pre-nasm-ref/or1.pre-nasm new file mode 100644 index 0000000..2e66876 --- /dev/null +++ b/test/pre-nasm-ref/or1.pre-nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @8, 1 ;jumpIfNotEqual 1 + cmp @8, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov @9, 1 ;jumpIfNotEqual 1 + cmp @9, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov @1, 0 ;Affect + jmp l0 ;Jump +l1 : mov @1, 1 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/or2.pre-nasm b/test/pre-nasm-ref/or2.pre-nasm new file mode 100644 index 0000000..600dd18 --- /dev/null +++ b/test/pre-nasm-ref/or2.pre-nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @8, 1 ;jumpIfNotEqual 1 + cmp @8, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov @9, 0 ;jumpIfNotEqual 1 + cmp @9, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov @1, 0 ;Affect + jmp l0 ;Jump +l1 : mov @1, 1 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/or3.pre-nasm b/test/pre-nasm-ref/or3.pre-nasm new file mode 100644 index 0000000..f34edd4 --- /dev/null +++ b/test/pre-nasm-ref/or3.pre-nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @8, 0 ;jumpIfNotEqual 1 + cmp @8, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov @9, 1 ;jumpIfNotEqual 1 + cmp @9, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov @1, 0 ;Affect + jmp l0 ;Jump +l1 : mov @1, 1 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/or4.pre-nasm b/test/pre-nasm-ref/or4.pre-nasm new file mode 100644 index 0000000..becebcc --- /dev/null +++ b/test/pre-nasm-ref/or4.pre-nasm @@ -0,0 +1,39 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @8, 0 ;jumpIfNotEqual 1 + cmp @8, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov @9, 0 ;jumpIfNotEqual 1 + cmp @9, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov @1, 0 ;Affect + jmp l0 ;Jump +l1 : mov @1, 1 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/or5.pre-nasm b/test/pre-nasm-ref/or5.pre-nasm new file mode 100644 index 0000000..46e2785 --- /dev/null +++ b/test/pre-nasm-ref/or5.pre-nasm @@ -0,0 +1,47 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @9, 0 ;jumpIfNotEqual 1 + cmp @9, 0 ;on passe par un registre temporaire + jne l3 ;jumpIfNotEqual 2 + mov @10, 1 ;jumpIfNotEqual 1 + cmp @10, 0 ;on passe par un registre temporaire + jne l3 ;jumpIfNotEqual 2 + mov @2, 0 ;Affect + jmp l2 ;Jump +l3 : mov @2, 1 ;Affect +l2 : cmp @2, 0 ;jumpIfNotEqual 1 + jne l1 ;jumpIfNotEqual 2 + mov @11, 0 ;jumpIfNotEqual 1 + cmp @11, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov @1, 0 ;Affect + jmp l0 ;Jump +l1 : mov @1, 1 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/parenth1.pre-nasm b/test/pre-nasm-ref/parenth1.pre-nasm new file mode 100644 index 0000000..27b03b8 --- /dev/null +++ b/test/pre-nasm-ref/parenth1.pre-nasm @@ -0,0 +1,30 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/parenth2.pre-nasm b/test/pre-nasm-ref/parenth2.pre-nasm new file mode 100644 index 0000000..8673e39 --- /dev/null +++ b/test/pre-nasm-ref/parenth2.pre-nasm @@ -0,0 +1,30 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov eax, 2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/prio23-1.pre-nasm b/test/pre-nasm-ref/prio23-1.pre-nasm new file mode 100644 index 0000000..8011242 --- /dev/null +++ b/test/pre-nasm-ref/prio23-1.pre-nasm @@ -0,0 +1,37 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main ; + pop r0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 ; +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov r1, 1 ;Affect + mov r9, 0 ;JumpIfEqual 1 + cmp r9, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov r1, 0 ;Affect +l0 : mov r2, r1 ; + imul r2, 10 ; + mov eax, r2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret ; diff --git a/test/pre-nasm-ref/prio23-2.pre-nasm b/test/pre-nasm-ref/prio23-2.pre-nasm new file mode 100644 index 0000000..762181d --- /dev/null +++ b/test/pre-nasm-ref/prio23-2.pre-nasm @@ -0,0 +1,37 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main ; + pop r0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 ; +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov r1, 1 ;Affect + mov r9, 10 ;JumpIfEqual 1 + cmp r9, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov r1, 0 ;Affect +l0 : mov r2, 3 ; + imul r2, r1 ; + mov eax, r2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret ; diff --git a/test/pre-nasm-ref/prio23-3.pre-nasm b/test/pre-nasm-ref/prio23-3.pre-nasm new file mode 100644 index 0000000..2892dc2 --- /dev/null +++ b/test/pre-nasm-ref/prio23-3.pre-nasm @@ -0,0 +1,41 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main ; + pop r0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 ; +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov r1, 1 ;Affect + mov r9, 0 ;JumpIfEqual 1 + cmp r9, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov r1, 0 ;Affect +l0 : mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, r1 ;affectation des bits de poids faible du dividende + mov r12, 1 ; + idiv r12 ; + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov r2, eax ; + mov eax, r2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret ; diff --git a/test/pre-nasm-ref/prio23-4.pre-nasm b/test/pre-nasm-ref/prio23-4.pre-nasm new file mode 100644 index 0000000..87dd906 --- /dev/null +++ b/test/pre-nasm-ref/prio23-4.pre-nasm @@ -0,0 +1,45 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main ; + pop r0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 ; +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov r1, 1 ;Affect + mov r10, 1 ;JumpIfEqual 1 + cmp r10, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov r1, 0 ;Affect +l0 : mov r2, 1 ;Affect + mov r11, 0 ;JumpIfEqual 1 + cmp r11, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov r2, 0 ;Affect +l1 : mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, r1 ;affectation des bits de poids faible du dividende + idiv r2 ; + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov r3, eax ; + mov eax, r3 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret ; diff --git a/test/pre-nasm-ref/prio34-1.pre-nasm b/test/pre-nasm-ref/prio34-1.pre-nasm new file mode 100644 index 0000000..f2da2ea --- /dev/null +++ b/test/pre-nasm-ref/prio34-1.pre-nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 3 + imul @1, 4 + mov @2, 2 + add @2, @1 + mov eax, @2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/prio34-2.pre-nasm b/test/pre-nasm-ref/prio34-2.pre-nasm new file mode 100644 index 0000000..b33bca1 --- /dev/null +++ b/test/pre-nasm-ref/prio34-2.pre-nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 2 + imul @1, 3 + mov @2, @1 + sub @2, 4 + mov eax, @2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/prio34-3.pre-nasm b/test/pre-nasm-ref/prio34-3.pre-nasm new file mode 100644 index 0000000..844ca42 --- /dev/null +++ b/test/pre-nasm-ref/prio34-3.pre-nasm @@ -0,0 +1,38 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, 6 ;affectation des bits de poids faible du dividende + mov @11, 3 + idiv @11 + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov @1, eax + mov @2, @1 + sub @2, 72 + mov eax, @2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/prio34-4.pre-nasm b/test/pre-nasm-ref/prio34-4.pre-nasm new file mode 100644 index 0000000..a7d2710 --- /dev/null +++ b/test/pre-nasm-ref/prio34-4.pre-nasm @@ -0,0 +1,38 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov edx, 0 ;mise à 0 des bits de poids fort du dividende + mov eax, 20 ;affectation des bits de poids faible du dividende + mov @11, 10 + idiv @11 + mov edx, edx ;rend explicite l'utilisation de edx pour ne pas que sa valeur soit modifiée + mov @1, eax + mov @2, 6 + add @2, @1 + mov eax, @2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/prio45-1.pre-nasm b/test/pre-nasm-ref/prio45-1.pre-nasm new file mode 100644 index 0000000..1fb4cb0 --- /dev/null +++ b/test/pre-nasm-ref/prio45-1.pre-nasm @@ -0,0 +1,37 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @2, 0 + add @2, 1 + mov @1, 1 ;Affect + mov @9, 2 ;JumpIfEqual 1 + cmp @9, @2 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/prio45-2.pre-nasm b/test/pre-nasm-ref/prio45-2.pre-nasm new file mode 100644 index 0000000..5e10950 --- /dev/null +++ b/test/pre-nasm-ref/prio45-2.pre-nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @2, 1 + add @2, 234 + mov @1, 1 ;Affect + cmp @2, 1 ;JumpIfEqual 1 + je l0 ;JumpIfEqual 2 + mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/prio45-3.pre-nasm b/test/pre-nasm-ref/prio45-3.pre-nasm new file mode 100644 index 0000000..d4ee4c1 --- /dev/null +++ b/test/pre-nasm-ref/prio45-3.pre-nasm @@ -0,0 +1,37 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @2, 11 + add @2, 100 + mov @1, 1 ;Affect + mov @9, 12 ;JumpIfLess 1 + cmp @9, @2 ;on passe par un registre temporaire + jl l0 ;JumpIfLess 2 + mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/prio45-4.pre-nasm b/test/pre-nasm-ref/prio45-4.pre-nasm new file mode 100644 index 0000000..3ffda46 --- /dev/null +++ b/test/pre-nasm-ref/prio45-4.pre-nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @2, 21 + sub @2, 21 + mov @1, 1 ;Affect + cmp @2, 1 ;JumpIfLess 1 + jl l0 ;JumpIfLess 2 + mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/prio56-1.pre-nasm b/test/pre-nasm-ref/prio56-1.pre-nasm new file mode 100644 index 0000000..add9a0d --- /dev/null +++ b/test/pre-nasm-ref/prio56-1.pre-nasm @@ -0,0 +1,43 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @2, 1 ;Affect + mov @9, 1 ;JumpIfEqual 1 + cmp @9, 2 ;on passe par un registre temporaire + je l2 ;JumpIfEqual 2 + mov @2, 0 ;Affect +l2 : cmp @2, 0 ;JumpIfEqual 1 + je l1 ;JumpIfEqual 2 + mov @10, 1 ;JumpIfEqual 1 + cmp @10, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov @1, 1 ;Affect + jmp l0 ;Jump +l1 : mov @1, 0 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/prio56-2.pre-nasm b/test/pre-nasm-ref/prio56-2.pre-nasm new file mode 100644 index 0000000..563d1d6 --- /dev/null +++ b/test/pre-nasm-ref/prio56-2.pre-nasm @@ -0,0 +1,43 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @2, 1 ;Affect + mov @9, 0 ;JumpIfEqual 1 + cmp @9, 1 ;on passe par un registre temporaire + je l2 ;JumpIfEqual 2 + mov @2, 0 ;Affect +l2 : mov @10, 1 ;jumpIfNotEqual 1 + cmp @10, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + cmp @2, 0 ;jumpIfNotEqual 1 + jne l1 ;jumpIfNotEqual 2 + mov @1, 0 ;Affect + jmp l0 ;Jump +l1 : mov @1, 1 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/prio67-1.pre-nasm b/test/pre-nasm-ref/prio67-1.pre-nasm new file mode 100644 index 0000000..b615ead --- /dev/null +++ b/test/pre-nasm-ref/prio67-1.pre-nasm @@ -0,0 +1,47 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @9, 0 ;JumpIfEqual 1 + cmp @9, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov @10, 1 ;JumpIfEqual 1 + cmp @10, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov @2, 1 ;Affect + jmp l2 ;Jump +l3 : mov @2, 0 ;Affect +l2 : cmp @2, 0 ;jumpIfNotEqual 1 + jne l1 ;jumpIfNotEqual 2 + mov @11, 1 ;jumpIfNotEqual 1 + cmp @11, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + mov @1, 0 ;Affect + jmp l0 ;Jump +l1 : mov @1, 1 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/prio67-2.pre-nasm b/test/pre-nasm-ref/prio67-2.pre-nasm new file mode 100644 index 0000000..872c059 --- /dev/null +++ b/test/pre-nasm-ref/prio67-2.pre-nasm @@ -0,0 +1,47 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @9, 1 ;JumpIfEqual 1 + cmp @9, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov @10, 0 ;JumpIfEqual 1 + cmp @10, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov @2, 1 ;Affect + jmp l2 ;Jump +l3 : mov @2, 0 ;Affect +l2 : mov @11, 1 ;jumpIfNotEqual 1 + cmp @11, 0 ;on passe par un registre temporaire + jne l1 ;jumpIfNotEqual 2 + cmp @2, 0 ;jumpIfNotEqual 1 + jne l1 ;jumpIfNotEqual 2 + mov @1, 0 ;Affect + jmp l0 ;Jump +l1 : mov @1, 1 ;Affect +l0 : mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/rec1.pre-nasm b/test/pre-nasm-ref/rec1.pre-nasm new file mode 100644 index 0000000..0e66dc7 --- /dev/null +++ b/test/pre-nasm-ref/rec1.pre-nasm @@ -0,0 +1,81 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 1 ;Affect + cmp dword [ebp+12], 1 ;JumpIfEqual 1 + je l2 ;JumpIfEqual 2 + mov @1, 0 ;Affect +l2 : cmp @1, 0 ;JumpIfEqual 1 + je l0 ;JumpIfEqual 2 + mov dword [ebp+8], 1 ;ecriture de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret + jmp l1 ;Jump +l0 : mov @3, dword [ebp+12] + sub @3, 1 + push @3 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop @2 ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + mov @4, 1 + add @4, @2 + mov dword [ebp+8], @4 ;ecriture de la valeur de retour + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +l1 : add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + push 100 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop @5 ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + mov eax, @5 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/si1.pre-nasm b/test/pre-nasm-ref/si1.pre-nasm new file mode 100644 index 0000000..dc1e313 --- /dev/null +++ b/test/pre-nasm-ref/si1.pre-nasm @@ -0,0 +1,33 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @7, 1 ;JumpIfEqual 1 + cmp @7, 0 ;on passe par un registre temporaire + je l1 ;JumpIfEqual 2 + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 +l1 : add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/si2.pre-nasm b/test/pre-nasm-ref/si2.pre-nasm new file mode 100644 index 0000000..4836fc5 --- /dev/null +++ b/test/pre-nasm-ref/si2.pre-nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @7, 0 ;JumpIfEqual 1 + cmp @7, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + jmp l1 ;Jump +l0 : mov eax, 0 ;Write 1 + call iprintLF ;Write 2 +l1 : add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/si3.pre-nasm b/test/pre-nasm-ref/si3.pre-nasm new file mode 100644 index 0000000..c8bc795 --- /dev/null +++ b/test/pre-nasm-ref/si3.pre-nasm @@ -0,0 +1,38 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @7, 1 ;JumpIfEqual 1 + cmp @7, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + jmp l1 ;Jump +l0 : mov eax, 0 ;Write 1 + call iprintLF ;Write 2 +l1 : mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/si4.pre-nasm b/test/pre-nasm-ref/si4.pre-nasm new file mode 100644 index 0000000..cac66d9 --- /dev/null +++ b/test/pre-nasm-ref/si4.pre-nasm @@ -0,0 +1,38 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @7, 0 ;JumpIfEqual 1 + cmp @7, 0 ;on passe par un registre temporaire + je l0 ;JumpIfEqual 2 + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + jmp l1 ;Jump +l0 : mov eax, 0 ;Write 1 + call iprintLF ;Write 2 +l1 : mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/si5.pre-nasm b/test/pre-nasm-ref/si5.pre-nasm new file mode 100644 index 0000000..1fda832 --- /dev/null +++ b/test/pre-nasm-ref/si5.pre-nasm @@ -0,0 +1,40 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @7, 1 ;JumpIfEqual 1 + cmp @7, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + mov @9, 1 ;JumpIfEqual 1 + cmp @9, 0 ;on passe par un registre temporaire + je l3 ;JumpIfEqual 2 + mov eax, 1 ;Write 1 + call iprintLF ;Write 2 +l3 : mov eax, 1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/sub1.pre-nasm b/test/pre-nasm-ref/sub1.pre-nasm new file mode 100644 index 0000000..4500825 --- /dev/null +++ b/test/pre-nasm-ref/sub1.pre-nasm @@ -0,0 +1,32 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 10 + sub @1, 5 + mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/sub2.pre-nasm b/test/pre-nasm-ref/sub2.pre-nasm new file mode 100644 index 0000000..4a4dd72 --- /dev/null +++ b/test/pre-nasm-ref/sub2.pre-nasm @@ -0,0 +1,32 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 7 + sub @1, 20 + mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/sub3.pre-nasm b/test/pre-nasm-ref/sub3.pre-nasm new file mode 100644 index 0000000..3d2edcb --- /dev/null +++ b/test/pre-nasm-ref/sub3.pre-nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @1, 2 + sub @1, 1 + mov @2, @1 + sub @2, 1 + mov eax, @2 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/tab1.pre-nasm b/test/pre-nasm-ref/tab1.pre-nasm new file mode 100644 index 0000000..d436569 --- /dev/null +++ b/test/pre-nasm-ref/tab1.pre-nasm @@ -0,0 +1,50 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +tab : resd 12 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @7, 0 + imul @7, 4 + mov dword [tab+@7], 0 ;Affect + mov @8, 1 + imul @8, 4 + mov dword [tab+@8], 1 ;Affect + mov @9, 2 + imul @9, 4 + mov dword [tab+@9], 2 ;Affect + mov @11, 0 + imul @11, 4 + mov eax, dword [tab+@11] ;Write 1 + call iprintLF ;Write 2 + mov @13, 1 + imul @13, 4 + mov eax, dword [tab+@13] ;Write 1 + call iprintLF ;Write 2 + mov @15, 2 + imul @15, 4 + mov eax, dword [tab+@15] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/tab2.pre-nasm b/test/pre-nasm-ref/tab2.pre-nasm new file mode 100644 index 0000000..cd9d7e3 --- /dev/null +++ b/test/pre-nasm-ref/tab2.pre-nasm @@ -0,0 +1,57 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +tab : resd 20 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov dword [ebp-4], 2 ;Affect + mov @1, dword [ebp-4] + add @1, 0 + mov @10, @1 + imul @10, 4 + mov dword [tab+@10], 34 ;Affect + mov @2, dword [ebp-4] + add @2, 1 + mov @11, @2 + imul @11, 4 + mov dword [tab+@11], 74 ;Affect + mov @3, dword [ebp-4] + add @3, 2 + mov @12, @3 + imul @12, 4 + mov dword [tab+@12], 16 ;Affect + mov @14, 2 + imul @14, 4 + mov eax, dword [tab+@14] ;Write 1 + call iprintLF ;Write 2 + mov @16, 3 + imul @16, 4 + mov eax, dword [tab+@16] ;Write 1 + call iprintLF ;Write 2 + mov @18, 4 + imul @18, 4 + mov eax, dword [tab+@18] ;Write 1 + call iprintLF ;Write 2 + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/tab3.pre-nasm b/test/pre-nasm-ref/tab3.pre-nasm new file mode 100644 index 0000000..f285d1a --- /dev/null +++ b/test/pre-nasm-ref/tab3.pre-nasm @@ -0,0 +1,60 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +tab : resd 20 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 8 ;allocation des variables locales + mov dword [ebp-4], 2 ;Affect + mov dword [ebp-8], 0 ;Affect + mov @1, dword [ebp-4] + add @1, dword [ebp-8] + mov @10, @1 + imul @10, 4 + mov dword [tab+@10], 34 ;Affect + mov dword [ebp-8], 1 ;Affect + mov @2, dword [ebp-4] + add @2, dword [ebp-8] + mov @11, @2 + imul @11, 4 + mov dword [tab+@11], 74 ;Affect + mov dword [ebp-8], 2 ;Affect + mov @3, dword [ebp-4] + add @3, dword [ebp-8] + mov @12, @3 + imul @12, 4 + mov dword [tab+@12], 16 ;Affect + mov @14, 2 + imul @14, 4 + mov eax, dword [tab+@14] ;Write 1 + call iprintLF ;Write 2 + mov @16, 3 + imul @16, 4 + mov eax, dword [tab+@16] ;Write 1 + call iprintLF ;Write 2 + mov @18, 4 + imul @18, 4 + mov eax, dword [tab+@18] ;Write 1 + call iprintLF ;Write 2 + add esp, 8 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/tab4.pre-nasm b/test/pre-nasm-ref/tab4.pre-nasm new file mode 100644 index 0000000..19f610c --- /dev/null +++ b/test/pre-nasm-ref/tab4.pre-nasm @@ -0,0 +1,56 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +tab : resd 12 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @8, 0 + imul @8, 4 + mov dword [tab+@8], 1 ;Affect + mov @10, 0 + imul @10, 4 + mov @9, dword [tab+@10] + imul @9, 4 + mov dword [tab+@9], 12 ;Affect + mov @11, 0 + imul @11, 4 + mov @1, dword [tab+@11] + add @1, 1 + mov @12, @1 + imul @12, 4 + mov dword [tab+@12], 13 ;Affect + mov @14, 0 + imul @14, 4 + mov eax, dword [tab+@14] ;Write 1 + call iprintLF ;Write 2 + mov @16, 1 + imul @16, 4 + mov eax, dword [tab+@16] ;Write 1 + call iprintLF ;Write 2 + mov @18, 2 + imul @18, 4 + mov eax, dword [tab+@18] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/tantque1.pre-nasm b/test/pre-nasm-ref/tantque1.pre-nasm new file mode 100644 index 0000000..fa993f8 --- /dev/null +++ b/test/pre-nasm-ref/tantque1.pre-nasm @@ -0,0 +1,44 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov dword [ebp-4], 10 ;Affect +l0 : mov @1, 1 ;Affect + mov @9, 0 ;JumpIfLess 1 + cmp @9, dword [ebp-4] ;on passe par un registre temporaire + jl l2 ;JumpIfLess 2 + mov @1, 0 ;Affect +l2 : cmp @1, 0 ;JumpIfEqual 1 + je l1 ;JumpIfEqual 2 + mov eax, dword [ebp-4] ;Write 1 + call iprintLF ;Write 2 + mov @2, dword [ebp-4] + sub @2, 1 + mov dword [ebp-4], @2 ;Affect + jmp l0 ;Jump +l1 : mov eax, 0 ;Write 1 + call iprintLF ;Write 2 + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/tantque2.pre-nasm b/test/pre-nasm-ref/tantque2.pre-nasm new file mode 100644 index 0000000..02a466d --- /dev/null +++ b/test/pre-nasm-ref/tantque2.pre-nasm @@ -0,0 +1,54 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 8 ;allocation des variables locales + mov dword [ebp-4], 0 ;Affect +l0 : mov @1, 1 ;Affect + cmp dword [ebp-4], 4 ;JumpIfLess 1 + jl l2 ;JumpIfLess 2 + mov @1, 0 ;Affect +l2 : cmp @1, 0 ;JumpIfEqual 1 + je l1 ;JumpIfEqual 2 + mov dword [ebp-8], 0 ;Affect +l3 : mov @2, 1 ;Affect + cmp dword [ebp-8], 4 ;JumpIfLess 1 + jl l5 ;JumpIfLess 2 + mov @2, 0 ;Affect +l5 : cmp @2, 0 ;JumpIfEqual 1 + je l4 ;JumpIfEqual 2 + mov eax, dword [ebp-4] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp-8] ;Write 1 + call iprintLF ;Write 2 + mov @3, dword [ebp-8] + add @3, 1 + mov dword [ebp-8], @3 ;Affect + jmp l3 ;Jump +l4 : mov @4, dword [ebp-4] + add @4, 1 + mov dword [ebp-4], @4 ;Affect + jmp l0 ;Jump +l1 : add esp, 8 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/tri.pre-nasm b/test/pre-nasm-ref/tri.pre-nasm new file mode 100644 index 0000000..382fef7 --- /dev/null +++ b/test/pre-nasm-ref/tri.pre-nasm @@ -0,0 +1,214 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +tab : resd 40 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +initialiser : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov @22, 0 + imul @22, 4 + mov dword [tab+@22], 8 ;Affect + mov @23, 1 + imul @23, 4 + mov dword [tab+@23], 6 ;Affect + mov @24, 2 + imul @24, 4 + mov dword [tab+@24], 9 ;Affect + mov @25, 3 + imul @25, 4 + mov dword [tab+@25], 9 ;Affect + mov @26, 4 + imul @26, 4 + mov dword [tab+@26], 4 ;Affect + mov @27, 5 + imul @27, 4 + mov dword [tab+@27], 2 ;Affect + mov @28, 6 + imul @28, 4 + mov dword [tab+@28], 3 ;Affect + mov @29, 7 + imul @29, 4 + mov dword [tab+@29], 1 ;Affect + mov @30, 8 + imul @30, 4 + mov dword [tab+@30], 4 ;Affect + mov @31, 9 + imul @31, 4 + mov dword [tab+@31], 5 ;Affect + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +afficher : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov dword [ebp-4], 0 ;Affect +l0 : mov @1, 1 ;Affect + mov @40, dword [ebp-4] ;JumpIfLess 1 + cmp @40, dword [ebp+12] ;on passe par un registre temporaire + jl l2 ;JumpIfLess 2 + mov @1, 0 ;Affect +l2 : cmp @1, 0 ;JumpIfEqual 1 + je l1 ;JumpIfEqual 2 + mov @42, dword [ebp-4] + imul @42, 4 + mov eax, dword [tab+@42] ;Write 1 + call iprintLF ;Write 2 + mov @2, dword [ebp-4] + add @2, 1 + mov dword [ebp-4], @2 ;Affect + jmp l0 ;Jump +l1 : mov eax, 0 ;Write 1 + call iprintLF ;Write 2 + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +echanger : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov @52, dword [ebp+12] + imul @52, 4 + mov @53, dword [tab+@52] ;Affect + mov dword [ebp-4], @53 ;on passe par un registre temporaire + mov @54, dword [ebp+16] + imul @54, 4 + mov @55, dword [ebp+12] + imul @55, 4 + mov @56, dword [tab+@54] ;Affect + mov dword [tab+@55], @56 ;on passe par un registre temporaire + mov @57, dword [ebp+16] + imul @57, 4 + mov @58, dword [ebp-4] ;Affect + mov dword [tab+@57], @58 ;on passe par un registre temporaire + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +trier : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 12 ;allocation des variables locales + mov @67, dword [ebp+12] ;Affect + mov dword [ebp-12], @67 ;on passe par un registre temporaire + mov dword [ebp-4], 1 ;Affect +l3 : mov @3, 1 ;Affect + cmp dword [ebp-4], 1 ;JumpIfEqual 1 + je l5 ;JumpIfEqual 2 + mov @3, 0 ;Affect +l5 : cmp @3, 0 ;JumpIfEqual 1 + je l4 ;JumpIfEqual 2 + mov dword [ebp-4], 0 ;Affect + mov dword [ebp-8], 0 ;Affect +l6 : mov @5, dword [ebp-12] + sub @5, 1 + mov @4, 1 ;Affect + cmp dword [ebp-8], @5 ;JumpIfLess 1 + jl l8 ;JumpIfLess 2 + mov @4, 0 ;Affect +l8 : cmp @4, 0 ;JumpIfEqual 1 + je l7 ;JumpIfEqual 2 + mov @7, dword [ebp-8] + add @7, 1 + mov @6, 1 ;Affect + mov @68, @7 + imul @68, 4 + mov @69, dword [ebp-8] + imul @69, 4 + mov @70, dword [tab+@68] ;JumpIfLess 1 + cmp @70, dword [tab+@69] ;on passe par un registre temporaire + jl l11 ;JumpIfLess 2 + mov @6, 0 ;Affect +l11 : cmp @6, 0 ;JumpIfEqual 1 + je l10 ;JumpIfEqual 2 + push dword [ebp-8] ;Param + mov @9, dword [ebp-8] + add @9, 1 + push @9 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call echanger + pop @8 ;récupération de la valeur de retour + add esp, 8 ;désallocation des arguments + mov dword [ebp-4], 1 ;Affect +l10 : mov @10, dword [ebp-8] + add @10, 1 + mov dword [ebp-8], @10 ;Affect + jmp l6 ;Jump +l7 : mov @11, dword [ebp-12] + sub @11, 1 + mov dword [ebp-12], @11 ;Affect + jmp l3 ;Jump +l4 : add esp, 12 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + sub esp, 4 ;allocation mémoire pour la valeur de retour + call initialiser + pop @12 ;récupération de la valeur de retour + push 10 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call afficher + pop @13 ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + push 10 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call trier + pop @14 ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + push 10 ;Param + sub esp, 4 ;allocation mémoire pour la valeur de retour + call afficher + pop @15 ;récupération de la valeur de retour + add esp, 4 ;désallocation des arguments + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/varglob1.pre-nasm b/test/pre-nasm-ref/varglob1.pre-nasm new file mode 100644 index 0000000..99d5927 --- /dev/null +++ b/test/pre-nasm-ref/varglob1.pre-nasm @@ -0,0 +1,32 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +variable : resd 4 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov dword [variable], 6834 ;Affect + mov eax, dword [variable] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/varglob2.pre-nasm b/test/pre-nasm-ref/varglob2.pre-nasm new file mode 100644 index 0000000..a4e84c3 --- /dev/null +++ b/test/pre-nasm-ref/varglob2.pre-nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +variable : resd 4 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov dword [variable], 10 ;Affect + mov @1, dword [variable] + add @1, 50 + mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/varglob3.pre-nasm b/test/pre-nasm-ref/varglob3.pre-nasm new file mode 100644 index 0000000..8523503 --- /dev/null +++ b/test/pre-nasm-ref/varglob3.pre-nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +var2 : resd 4 ;variable globale +var1 : resd 4 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov dword [var1], 10 ;Affect + mov dword [var2], 34 ;Affect + mov eax, dword [var1] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [var2] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/varglob4.pre-nasm b/test/pre-nasm-ref/varglob4.pre-nasm new file mode 100644 index 0000000..8ca2926 --- /dev/null +++ b/test/pre-nasm-ref/varglob4.pre-nasm @@ -0,0 +1,36 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +var2 : resd 4 ;variable globale +var1 : resd 4 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov dword [var1], 10 ;Affect + mov dword [var2], 34 ;Affect + mov @1, dword [var1] + add @1, dword [var2] + mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/varloc1.pre-nasm b/test/pre-nasm-ref/varloc1.pre-nasm new file mode 100644 index 0000000..2b2479e --- /dev/null +++ b/test/pre-nasm-ref/varloc1.pre-nasm @@ -0,0 +1,31 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov dword [ebp-4], 6834 ;Affect + mov eax, dword [ebp-4] ;Write 1 + call iprintLF ;Write 2 + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/varloc2.pre-nasm b/test/pre-nasm-ref/varloc2.pre-nasm new file mode 100644 index 0000000..8c40b74 --- /dev/null +++ b/test/pre-nasm-ref/varloc2.pre-nasm @@ -0,0 +1,33 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov dword [ebp-4], 10 ;Affect + mov @1, dword [ebp-4] + add @1, 50 + mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/varloc3.pre-nasm b/test/pre-nasm-ref/varloc3.pre-nasm new file mode 100644 index 0000000..bd7329d --- /dev/null +++ b/test/pre-nasm-ref/varloc3.pre-nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 8 ;allocation des variables locales + mov dword [ebp-4], 10 ;Affect + mov dword [ebp-8], 30 ;Affect + mov eax, dword [ebp-4] ;Write 1 + call iprintLF ;Write 2 + mov eax, dword [ebp-8] ;Write 1 + call iprintLF ;Write 2 + add esp, 8 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/varloc4.pre-nasm b/test/pre-nasm-ref/varloc4.pre-nasm new file mode 100644 index 0000000..01d032c --- /dev/null +++ b/test/pre-nasm-ref/varloc4.pre-nasm @@ -0,0 +1,34 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 8 ;allocation des variables locales + mov dword [ebp-4], 10 ;Affect + mov dword [ebp-8], 30 ;Affect + mov @1, dword [ebp-4] + add @1, dword [ebp-8] + mov eax, @1 ;Write 1 + call iprintLF ;Write 2 + add esp, 8 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/pre-nasm-ref/varloc5.pre-nasm b/test/pre-nasm-ref/varloc5.pre-nasm new file mode 100644 index 0000000..613c517 --- /dev/null +++ b/test/pre-nasm-ref/varloc5.pre-nasm @@ -0,0 +1,52 @@ +%include 'io.asm' + +section .bss +sinput : resb 255 ;reserve a 255 byte space in memory for the users input string +var1 : resd 4 ;variable globale + +section .text +global _start +_start: + sub esp, 4 ;allocation mémoire pour la valeur de retour + call main + pop @0 ;récupération de la valeur de retour + mov ebx, 0 ; valeur de retour du programme + mov eax, 1 ; code de sortie + int 0x80 +f : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 4 ;allocation des variables locales + mov dword [ebp-4], 10 ;Affect + mov eax, dword [ebp-4] ;Write 1 + call iprintLF ;Write 2 + add esp, 4 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret +main : push ebp ;sauvegarde la valeur de ebp + mov ebp, esp ;nouvelle valeur de ebp + push eax ;sauvegarde de eax + push ebx ;sauvegarde de ebx + push ecx ;sauvegarde de ecx + push edx ;sauvegarde de edx + sub esp, 0 ;allocation des variables locales + mov dword [var1], 20 ;Affect + sub esp, 4 ;allocation mémoire pour la valeur de retour + call f + pop @1 ;récupération de la valeur de retour + mov eax, dword [var1] ;Write 1 + call iprintLF ;Write 2 + add esp, 0 ;désallocation des variables locales + pop edx ;restaure edx + pop ecx ;restaure ecx + pop ebx ;restaure ebx + pop eax ;restaure eax + pop ebp ;restaure la valeur de ebp + ret diff --git a/test/sa-ref/add1.sa b/test/sa-ref/add1.sa new file mode 100644 index 0000000..5d44ab1 --- /dev/null +++ b/test/sa-ref/add1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpAdd 3 10)) null))) null)) diff --git a/test/sa-ref/add2.sa b/test/sa-ref/add2.sa new file mode 100644 index 0000000..1eaaf82 --- /dev/null +++ b/test/sa-ref/add2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpAdd (SaExpAdd 2 4) 8)) null))) null)) diff --git a/test/sa-ref/affect1.sa b/test/sa-ref/affect1.sa new file mode 100644 index 0000000..f1ab720 --- /dev/null +++ b/test/sa-ref/affect1.sa @@ -0,0 +1 @@ +(SaProg (SaLDecVar (SaDecVarSimple a entier) null) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple a) 1) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple a))) null)))) null)) diff --git a/test/sa-ref/affect2.sa b/test/sa-ref/affect2.sa new file mode 100644 index 0000000..c385bfe --- /dev/null +++ b/test/sa-ref/affect2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null (SaLDecVar (SaDecVarSimple a entier) null) (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple a) 1) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple a))) null)))) null)) diff --git a/test/sa-ref/affect3.sa b/test/sa-ref/affect3.sa new file mode 100644 index 0000000..8a9fc32 --- /dev/null +++ b/test/sa-ref/affect3.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc f nul (SaLDecVar (SaDecVarSimple a entier) null) null (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple a) 1) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple a))) null)))) (SaLDecFonc (SaDecFonc main nul null (SaLDecVar (SaDecVarSimple a entier) null) (SaInstBloc (SaLInst (SaAppel f (SaLExp 3 null)) null))) null))) diff --git a/test/sa-ref/and1.sa b/test/sa-ref/and1.sa new file mode 100644 index 0000000..441514f --- /dev/null +++ b/test/sa-ref/and1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpAnd vrai vrai)) null))) null)) diff --git a/test/sa-ref/and2.sa b/test/sa-ref/and2.sa new file mode 100644 index 0000000..b973e3f --- /dev/null +++ b/test/sa-ref/and2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpAnd vrai faux)) null))) null)) diff --git a/test/sa-ref/and3.sa b/test/sa-ref/and3.sa new file mode 100644 index 0000000..64e377e --- /dev/null +++ b/test/sa-ref/and3.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpAnd faux vrai)) null))) null)) diff --git a/test/sa-ref/and4.sa b/test/sa-ref/and4.sa new file mode 100644 index 0000000..af3a8c1 --- /dev/null +++ b/test/sa-ref/and4.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpAnd faux faux)) null))) null)) diff --git a/test/sa-ref/and5.sa b/test/sa-ref/and5.sa new file mode 100644 index 0000000..67fbb82 --- /dev/null +++ b/test/sa-ref/and5.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpAnd (SaExpAnd vrai faux) vrai)) null))) null)) diff --git a/test/sa-ref/appel-param1.sa b/test/sa-ref/appel-param1.sa new file mode 100644 index 0000000..f8f48cd --- /dev/null +++ b/test/sa-ref/appel-param1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc f nul (SaLDecVar (SaDecVarSimple a entier) null) null (SaInstBloc (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple a))) null))) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaAppel f (SaLExp 1 null)) null))) null))) diff --git a/test/sa-ref/appel-param2.sa b/test/sa-ref/appel-param2.sa new file mode 100644 index 0000000..f39770f --- /dev/null +++ b/test/sa-ref/appel-param2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc f nul (SaLDecVar (SaDecVarSimple a entier) (SaLDecVar (SaDecVarSimple b entier) null)) null (SaInstBloc (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple a))) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple b))) null)))) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaAppel f (SaLExp 1 (SaLExp 456 null))) null))) null))) diff --git a/test/sa-ref/appel-param3.sa b/test/sa-ref/appel-param3.sa new file mode 100644 index 0000000..d022a66 --- /dev/null +++ b/test/sa-ref/appel-param3.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc f nul (SaLDecVar (SaDecVarSimple a entier) (SaLDecVar (SaDecVarSimple b entier) (SaLDecVar (SaDecVarSimple c entier) (SaLDecVar (SaDecVarSimple d entier) (SaLDecVar (SaDecVarSimple e entier) null))))) null (SaInstBloc (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple a))) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple b))) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple c))) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple d))) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple e))) null))))))) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaAppel f (SaLExp 1 (SaLExp 2 (SaLExp 3 (SaLExp 4 (SaLExp 5 null)))))) null))) null))) diff --git a/test/sa-ref/appel-retour1.sa b/test/sa-ref/appel-retour1.sa new file mode 100644 index 0000000..7bb6f84 --- /dev/null +++ b/test/sa-ref/appel-retour1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc f entier (SaLDecVar (SaDecVarSimple a entier) null) null (SaInstBloc (SaLInst (SaInstRetour (SaExpVar (SaVarSimple a))) null))) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpAppel (SaAppel f (SaLExp 3712 null)))) null))) null))) diff --git a/test/sa-ref/appel1.sa b/test/sa-ref/appel1.sa new file mode 100644 index 0000000..6de41b4 --- /dev/null +++ b/test/sa-ref/appel1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc f nul null null (SaInstBloc (SaLInst (SaInstEcriture 1) null))) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaAppel f null) null))) null))) diff --git a/test/sa-ref/appel2.sa b/test/sa-ref/appel2.sa new file mode 100644 index 0000000..891435b --- /dev/null +++ b/test/sa-ref/appel2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc g nul null null (SaInstBloc (SaLInst (SaInstEcriture 2) null))) (SaLDecFonc (SaDecFonc f nul null null (SaInstBloc (SaLInst (SaInstEcriture 1) (SaLInst (SaAppel g null) null)))) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaAppel f null) null))) null)))) diff --git a/test/sa-ref/appel3.sa b/test/sa-ref/appel3.sa new file mode 100644 index 0000000..63ad386 --- /dev/null +++ b/test/sa-ref/appel3.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc g nul null null (SaInstBloc (SaLInst (SaInstEcriture 2) null))) (SaLDecFonc (SaDecFonc f nul null null (SaInstBloc (SaLInst (SaInstEcriture 1) null))) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaAppel f null) (SaLInst (SaAppel g null) null)))) null)))) diff --git a/test/sa-ref/div1.sa b/test/sa-ref/div1.sa new file mode 100644 index 0000000..c688935 --- /dev/null +++ b/test/sa-ref/div1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpDiv 4 2)) null))) null)) diff --git a/test/sa-ref/div2.sa b/test/sa-ref/div2.sa new file mode 100644 index 0000000..d503166 --- /dev/null +++ b/test/sa-ref/div2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpDiv 0 712)) null))) null)) diff --git a/test/sa-ref/div3.sa b/test/sa-ref/div3.sa new file mode 100644 index 0000000..a2c6e4c --- /dev/null +++ b/test/sa-ref/div3.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpDiv (SaExpDiv 4 2) 2)) null))) null)) diff --git a/test/sa-ref/div4.sa b/test/sa-ref/div4.sa new file mode 100644 index 0000000..08acfe9 --- /dev/null +++ b/test/sa-ref/div4.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpDiv 2 3)) null))) null)) diff --git a/test/sa-ref/ecrire1.sa b/test/sa-ref/ecrire1.sa new file mode 100644 index 0000000..49def4a --- /dev/null +++ b/test/sa-ref/ecrire1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture 3456) null))) null)) diff --git a/test/sa-ref/ecrire2.sa b/test/sa-ref/ecrire2.sa new file mode 100644 index 0000000..1e1054c --- /dev/null +++ b/test/sa-ref/ecrire2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture 0) null))) null)) diff --git a/test/sa-ref/egal1.sa b/test/sa-ref/egal1.sa new file mode 100644 index 0000000..1453078 --- /dev/null +++ b/test/sa-ref/egal1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpEqual 123 123)) null))) null)) diff --git a/test/sa-ref/egal2.sa b/test/sa-ref/egal2.sa new file mode 100644 index 0000000..d049f59 --- /dev/null +++ b/test/sa-ref/egal2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpEqual 412 34)) null))) null)) diff --git a/test/sa-ref/egal3.sa b/test/sa-ref/egal3.sa new file mode 100644 index 0000000..cb1c0c4 --- /dev/null +++ b/test/sa-ref/egal3.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpEqual (SaExpEqual 2 2) vrai)) null))) null)) diff --git a/test/sa-ref/err1.sa b/test/sa-ref/err1.sa new file mode 100644 index 0000000..c796063 --- /dev/null +++ b/test/sa-ref/err1.sa @@ -0,0 +1,18 @@ +<SaProg> + <SaLDec> + <SaDecFonc> + <nom>main</nom> + <SaInstBloc> + <SaLInst> + <SaInstEcriture> + <SaExpVar> + <SaVarSimple> + <nom>var1</nom> + </SaVarSimple> + </SaExpVar> + </SaInstEcriture> + </SaLInst> + </SaInstBloc> + </SaDecFonc> + </SaLDec> +</SaProg> diff --git a/test/sa-ref/err2.sa b/test/sa-ref/err2.sa new file mode 100644 index 0000000..4409c76 --- /dev/null +++ b/test/sa-ref/err2.sa @@ -0,0 +1,13 @@ +<SaProg> + <SaLDec> + <SaDecFonc> + <nom>main</nom> + <SaInstBloc> + <SaLInst> + <SaAppel> + </SaAppel> + </SaLInst> + </SaInstBloc> + </SaDecFonc> + </SaLDec> +</SaProg> diff --git a/test/sa-ref/err3.sa b/test/sa-ref/err3.sa new file mode 100644 index 0000000..5b42731 --- /dev/null +++ b/test/sa-ref/err3.sa @@ -0,0 +1,23 @@ +<SaProg> + <SaLDec> + <SaDecFonc> + <nom>f</nom> + <SaLDec> + <SaDecVar> + <nom>a</nom> + </SaDecVar> + </SaLDec> + </SaDecFonc> + <SaLDec> + <SaDecFonc> + <nom>main</nom> + <SaInstBloc> + <SaLInst> + <SaAppel> + </SaAppel> + </SaLInst> + </SaInstBloc> + </SaDecFonc> + </SaLDec> + </SaLDec> +</SaProg> diff --git a/test/sa-ref/err4.sa b/test/sa-ref/err4.sa new file mode 100644 index 0000000..2044b50 --- /dev/null +++ b/test/sa-ref/err4.sa @@ -0,0 +1,33 @@ +<SaProg> + <SaLDec> + <SaDecFonc> + <nom>f</nom> + <SaLDec> + <SaDecVar> + <nom>a</nom> + </SaDecVar> + </SaLDec> + <SaLDec> + <SaDecVar> + <nom>a</nom> + </SaDecVar> + </SaLDec> + </SaDecFonc> + <SaLDec> + <SaDecFonc> + <nom>main</nom> + <SaInstBloc> + <SaLInst> + <SaAppel> + <SaLExp> + <SaExpInt> + <val>1</val> + </SaExpInt> + </SaLExp> + </SaAppel> + </SaLInst> + </SaInstBloc> + </SaDecFonc> + </SaLDec> + </SaLDec> +</SaProg> diff --git a/test/sa-ref/err5.sa b/test/sa-ref/err5.sa new file mode 100644 index 0000000..f8226c8 --- /dev/null +++ b/test/sa-ref/err5.sa @@ -0,0 +1,39 @@ +<SaProg> + <SaLDec> + <SaDecFonc> + <nom>f</nom> + <SaInstBloc> + <SaLInst> + <SaInstEcriture> + <SaExpInt> + <val>1</val> + </SaExpInt> + </SaInstEcriture> + </SaLInst> + </SaInstBloc> + </SaDecFonc> + <SaLDec> + <SaDecFonc> + <nom>main</nom> + <SaLDec> + <SaDecVar> + <nom>f</nom> + </SaDecVar> + </SaLDec> + <SaInstBloc> + <SaLInst> + <SaInstAffect> + <SaVarSimple> + <nom>f</nom> + </SaVarSimple> + <SaExpAppel> + <SaAppel> + </SaAppel> + </SaExpAppel> + </SaInstAffect> + </SaLInst> + </SaInstBloc> + </SaDecFonc> + </SaLDec> + </SaLDec> +</SaProg> diff --git a/test/sa-ref/fibo.sa b/test/sa-ref/fibo.sa new file mode 100644 index 0000000..407ebde --- /dev/null +++ b/test/sa-ref/fibo.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc fibo entier (SaLDecVar (SaDecVarSimple n entier) null) null (SaInstBloc (SaLInst (SaInstSi (SaExpInf (SaExpVar (SaVarSimple n)) 2) (SaInstBloc (SaLInst (SaInstRetour 1) null)) (SaInstBloc (SaLInst (SaInstRetour (SaExpAdd (SaExpAppel (SaAppel fibo (SaLExp (SaExpSub (SaExpVar (SaVarSimple n)) 1) null))) (SaExpAppel (SaAppel fibo (SaLExp (SaExpSub (SaExpVar (SaVarSimple n)) 2) null))))) null))) null))) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpAppel (SaAppel fibo (SaLExp 9 null)))) null))) null))) diff --git a/test/sa-ref/inf1.sa b/test/sa-ref/inf1.sa new file mode 100644 index 0000000..f5a5868 --- /dev/null +++ b/test/sa-ref/inf1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpInf 3 3)) null))) null)) diff --git a/test/sa-ref/inf2.sa b/test/sa-ref/inf2.sa new file mode 100644 index 0000000..c66c665 --- /dev/null +++ b/test/sa-ref/inf2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpInf 4 1)) null))) null)) diff --git a/test/sa-ref/inf3.sa b/test/sa-ref/inf3.sa new file mode 100644 index 0000000..30eb35c --- /dev/null +++ b/test/sa-ref/inf3.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpInf 312 475)) null))) null)) diff --git a/test/sa-ref/inf4.sa b/test/sa-ref/inf4.sa new file mode 100644 index 0000000..58c322d --- /dev/null +++ b/test/sa-ref/inf4.sa @@ -0,0 +1,19 @@ +<programme type="SaProg"> + <fonctions type="SaLDec"> + <tete type="SaDecFonc" nom="main"> + <corps type="SaInstBloc"> + <val type="SaLInst"> + <tete type="SaInstEcriture"> + <arg type="SaExpInf"> + <op1 type="SaExpInf"> + <op1 type="SaExpInt" val="3"/> + <op2 type="SaExpInt" val="2"/> + </op1> + <op2 type="SaExpInt" val="1"/> + </arg> + </tete> + </val> + </corps> + </tete> + </fonctions> +</programme> diff --git a/test/sa-ref/mult1.sa b/test/sa-ref/mult1.sa new file mode 100644 index 0000000..d743995 --- /dev/null +++ b/test/sa-ref/mult1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpMult 2 3)) null))) null)) diff --git a/test/sa-ref/mult2.sa b/test/sa-ref/mult2.sa new file mode 100644 index 0000000..695c66c --- /dev/null +++ b/test/sa-ref/mult2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpMult 0 321)) null))) null)) diff --git a/test/sa-ref/mult3.sa b/test/sa-ref/mult3.sa new file mode 100644 index 0000000..012c0a6 --- /dev/null +++ b/test/sa-ref/mult3.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpMult (SaExpMult 3 3) 2)) null))) null)) diff --git a/test/sa-ref/not1.sa b/test/sa-ref/not1.sa new file mode 100644 index 0000000..2f6a8a2 --- /dev/null +++ b/test/sa-ref/not1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpNot vrai)) null))) null)) diff --git a/test/sa-ref/not2.sa b/test/sa-ref/not2.sa new file mode 100644 index 0000000..d955f61 --- /dev/null +++ b/test/sa-ref/not2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpNot faux)) null))) null)) diff --git a/test/sa-ref/not3.sa b/test/sa-ref/not3.sa new file mode 100644 index 0000000..1c04c2a --- /dev/null +++ b/test/sa-ref/not3.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpNot (SaExpNot faux))) null))) null)) diff --git a/test/sa-ref/or1.sa b/test/sa-ref/or1.sa new file mode 100644 index 0000000..fb4fe3c --- /dev/null +++ b/test/sa-ref/or1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpOr vrai vrai)) null))) null)) diff --git a/test/sa-ref/or2.sa b/test/sa-ref/or2.sa new file mode 100644 index 0000000..02cc96c --- /dev/null +++ b/test/sa-ref/or2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpOr vrai faux)) null))) null)) diff --git a/test/sa-ref/or3.sa b/test/sa-ref/or3.sa new file mode 100644 index 0000000..a023eef --- /dev/null +++ b/test/sa-ref/or3.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpOr faux vrai)) null))) null)) diff --git a/test/sa-ref/or4.sa b/test/sa-ref/or4.sa new file mode 100644 index 0000000..1b585b4 --- /dev/null +++ b/test/sa-ref/or4.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpOr faux faux)) null))) null)) diff --git a/test/sa-ref/or5.sa b/test/sa-ref/or5.sa new file mode 100644 index 0000000..c0030a3 --- /dev/null +++ b/test/sa-ref/or5.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpOr (SaExpOr faux vrai) faux)) null))) null)) diff --git a/test/sa-ref/parenth1.sa b/test/sa-ref/parenth1.sa new file mode 100644 index 0000000..fba5b65 --- /dev/null +++ b/test/sa-ref/parenth1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture 1) null))) null)) diff --git a/test/sa-ref/parenth2.sa b/test/sa-ref/parenth2.sa new file mode 100644 index 0000000..ddf44a1 --- /dev/null +++ b/test/sa-ref/parenth2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture 2) null))) null)) diff --git a/test/sa-ref/prio23-1.sa b/test/sa-ref/prio23-1.sa new file mode 100644 index 0000000..4a35127 --- /dev/null +++ b/test/sa-ref/prio23-1.sa @@ -0,0 +1,18 @@ +<programme type="SaProg"> + <fonctions type="SaLDec"> + <tete type="SaDecFonc" nom="main"> + <corps type="SaInstBloc"> + <val type="SaLInst"> + <tete type="SaInstEcriture"> + <arg type="SaExpMult"> + <op1 type="SaExpNot"> + <op1 type="SaExpInt" val="0"/> + </op1> + <op2 type="SaExpInt" val="10"/> + </arg> + </tete> + </val> + </corps> + </tete> + </fonctions> +</programme> diff --git a/test/sa-ref/prio23-2.sa b/test/sa-ref/prio23-2.sa new file mode 100644 index 0000000..31f61f2 --- /dev/null +++ b/test/sa-ref/prio23-2.sa @@ -0,0 +1,18 @@ +<programme type="SaProg"> + <fonctions type="SaLDec"> + <tete type="SaDecFonc" nom="main"> + <corps type="SaInstBloc"> + <val type="SaLInst"> + <tete type="SaInstEcriture"> + <arg type="SaExpMult"> + <op1 type="SaExpInt" val="3"/> + <op2 type="SaExpNot"> + <op1 type="SaExpInt" val="10"/> + </op2> + </arg> + </tete> + </val> + </corps> + </tete> + </fonctions> +</programme> diff --git a/test/sa-ref/prio23-3.sa b/test/sa-ref/prio23-3.sa new file mode 100644 index 0000000..b5c6158 --- /dev/null +++ b/test/sa-ref/prio23-3.sa @@ -0,0 +1,18 @@ +<programme type="SaProg"> + <fonctions type="SaLDec"> + <tete type="SaDecFonc" nom="main"> + <corps type="SaInstBloc"> + <val type="SaLInst"> + <tete type="SaInstEcriture"> + <arg type="SaExpDiv"> + <op1 type="SaExpNot"> + <op1 type="SaExpInt" val="0"/> + </op1> + <op2 type="SaExpInt" val="1"/> + </arg> + </tete> + </val> + </corps> + </tete> + </fonctions> +</programme> diff --git a/test/sa-ref/prio23-4.sa b/test/sa-ref/prio23-4.sa new file mode 100644 index 0000000..05c8c94 --- /dev/null +++ b/test/sa-ref/prio23-4.sa @@ -0,0 +1,20 @@ +<programme type="SaProg"> + <fonctions type="SaLDec"> + <tete type="SaDecFonc" nom="main"> + <corps type="SaInstBloc"> + <val type="SaLInst"> + <tete type="SaInstEcriture"> + <arg type="SaExpDiv"> + <op1 type="SaExpNot"> + <op1 type="SaExpInt" val="1"/> + </op1> + <op2 type="SaExpNot"> + <op1 type="SaExpInt" val="0"/> + </op2> + </arg> + </tete> + </val> + </corps> + </tete> + </fonctions> +</programme> diff --git a/test/sa-ref/prio34-1.sa b/test/sa-ref/prio34-1.sa new file mode 100644 index 0000000..14486ae --- /dev/null +++ b/test/sa-ref/prio34-1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpAdd 2 (SaExpMult 3 4))) null))) null)) diff --git a/test/sa-ref/prio34-2.sa b/test/sa-ref/prio34-2.sa new file mode 100644 index 0000000..4391e90 --- /dev/null +++ b/test/sa-ref/prio34-2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpSub (SaExpMult 2 3) 4)) null))) null)) diff --git a/test/sa-ref/prio34-3.sa b/test/sa-ref/prio34-3.sa new file mode 100644 index 0000000..93274cf --- /dev/null +++ b/test/sa-ref/prio34-3.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpSub (SaExpDiv 6 3) 72)) null))) null)) diff --git a/test/sa-ref/prio34-4.sa b/test/sa-ref/prio34-4.sa new file mode 100644 index 0000000..d0d61d7 --- /dev/null +++ b/test/sa-ref/prio34-4.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpAdd 6 (SaExpDiv 20 10))) null))) null)) diff --git a/test/sa-ref/prio45-1.sa b/test/sa-ref/prio45-1.sa new file mode 100644 index 0000000..74404e6 --- /dev/null +++ b/test/sa-ref/prio45-1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpEqual 2 (SaExpAdd 0 1))) null))) null)) diff --git a/test/sa-ref/prio45-2.sa b/test/sa-ref/prio45-2.sa new file mode 100644 index 0000000..7225d27 --- /dev/null +++ b/test/sa-ref/prio45-2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpEqual (SaExpAdd 1 234) 1)) null))) null)) diff --git a/test/sa-ref/prio45-3.sa b/test/sa-ref/prio45-3.sa new file mode 100644 index 0000000..f5fb6f0 --- /dev/null +++ b/test/sa-ref/prio45-3.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpInf 12 (SaExpAdd 11 100))) null))) null)) diff --git a/test/sa-ref/prio45-4.sa b/test/sa-ref/prio45-4.sa new file mode 100644 index 0000000..4613fe1 --- /dev/null +++ b/test/sa-ref/prio45-4.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpInf (SaExpSub 21 21) 1)) null))) null)) diff --git a/test/sa-ref/prio56-1.sa b/test/sa-ref/prio56-1.sa new file mode 100644 index 0000000..2b698f4 --- /dev/null +++ b/test/sa-ref/prio56-1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpAnd (SaExpEqual 1 2) vrai)) null))) null)) diff --git a/test/sa-ref/prio56-2.sa b/test/sa-ref/prio56-2.sa new file mode 100644 index 0000000..8a5cfa0 --- /dev/null +++ b/test/sa-ref/prio56-2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpOr vrai (SaExpEqual faux vrai))) null))) null)) diff --git a/test/sa-ref/prio67-1.sa b/test/sa-ref/prio67-1.sa new file mode 100644 index 0000000..3b05c3c --- /dev/null +++ b/test/sa-ref/prio67-1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpOr (SaExpAnd faux vrai) vrai)) null))) null)) diff --git a/test/sa-ref/prio67-2.sa b/test/sa-ref/prio67-2.sa new file mode 100644 index 0000000..0bd4435 --- /dev/null +++ b/test/sa-ref/prio67-2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpOr vrai (SaExpAnd vrai faux))) null))) null)) diff --git a/test/sa-ref/rec1.sa b/test/sa-ref/rec1.sa new file mode 100644 index 0000000..2819981 --- /dev/null +++ b/test/sa-ref/rec1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc f entier (SaLDecVar (SaDecVarSimple a entier) null) null (SaInstBloc (SaLInst (SaInstSi (SaExpEqual (SaExpVar (SaVarSimple a)) 1) (SaInstBloc (SaLInst (SaInstRetour 1) null)) (SaInstBloc (SaLInst (SaInstRetour (SaExpAdd 1 (SaExpAppel (SaAppel f (SaLExp (SaExpSub (SaExpVar (SaVarSimple a)) 1) null))))) null))) null))) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpAppel (SaAppel f (SaLExp 100 null)))) null))) null))) diff --git a/test/sa-ref/si1.sa b/test/sa-ref/si1.sa new file mode 100644 index 0000000..86d331e --- /dev/null +++ b/test/sa-ref/si1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstSi vrai (SaInstBloc (SaLInst (SaInstEcriture vrai) null)) null) null))) null)) diff --git a/test/sa-ref/si2.sa b/test/sa-ref/si2.sa new file mode 100644 index 0000000..609b54f --- /dev/null +++ b/test/sa-ref/si2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstSi faux (SaInstBloc (SaLInst (SaInstEcriture 1) null)) (SaInstBloc (SaLInst (SaInstEcriture 0) null))) null))) null)) diff --git a/test/sa-ref/si3.sa b/test/sa-ref/si3.sa new file mode 100644 index 0000000..517789a --- /dev/null +++ b/test/sa-ref/si3.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstSi vrai (SaInstBloc (SaLInst (SaInstEcriture vrai) null)) (SaInstBloc (SaLInst (SaInstEcriture faux) null))) (SaLInst (SaInstEcriture vrai) null)))) null)) diff --git a/test/sa-ref/si4.sa b/test/sa-ref/si4.sa new file mode 100644 index 0000000..fef8d2a --- /dev/null +++ b/test/sa-ref/si4.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstSi faux (SaInstBloc (SaLInst (SaInstEcriture vrai) null)) (SaInstBloc (SaLInst (SaInstEcriture faux) null))) (SaLInst (SaInstEcriture vrai) null)))) null)) diff --git a/test/sa-ref/si5.sa b/test/sa-ref/si5.sa new file mode 100644 index 0000000..546ff2d --- /dev/null +++ b/test/sa-ref/si5.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstSi vrai (SaInstBloc (SaLInst (SaInstEcriture vrai) (SaLInst (SaInstSi vrai (SaInstBloc (SaLInst (SaInstEcriture vrai) null)) null) null))) null) (SaLInst (SaInstEcriture vrai) null)))) null)) diff --git a/test/sa-ref/sub1.sa b/test/sa-ref/sub1.sa new file mode 100644 index 0000000..d03f222 --- /dev/null +++ b/test/sa-ref/sub1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpSub 10 5)) null))) null)) diff --git a/test/sa-ref/sub2.sa b/test/sa-ref/sub2.sa new file mode 100644 index 0000000..d1490e9 --- /dev/null +++ b/test/sa-ref/sub2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpSub 7 20)) null))) null)) diff --git a/test/sa-ref/sub3.sa b/test/sa-ref/sub3.sa new file mode 100644 index 0000000..9f30ba4 --- /dev/null +++ b/test/sa-ref/sub3.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstEcriture (SaExpSub (SaExpSub 2 1) 1)) null))) null)) diff --git a/test/sa-ref/tab1.sa b/test/sa-ref/tab1.sa new file mode 100644 index 0000000..e6c5fb0 --- /dev/null +++ b/test/sa-ref/tab1.sa @@ -0,0 +1 @@ +(SaProg (SaLDecVar (SaDecTab tab entier 3) null) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstAffect (SaVarIndicee tab 0) 0) (SaLInst (SaInstAffect (SaVarIndicee tab 1) 1) (SaLInst (SaInstAffect (SaVarIndicee tab 2) 2) (SaLInst (SaInstEcriture (SaExpVar (SaVarIndicee tab 0))) (SaLInst (SaInstEcriture (SaExpVar (SaVarIndicee tab 1))) (SaLInst (SaInstEcriture (SaExpVar (SaVarIndicee tab 2))) null)))))))) null)) diff --git a/test/sa-ref/tab2.sa b/test/sa-ref/tab2.sa new file mode 100644 index 0000000..0770615 --- /dev/null +++ b/test/sa-ref/tab2.sa @@ -0,0 +1 @@ +(SaProg (SaLDecVar (SaDecTab tab entier 5) null) (SaLDecFonc (SaDecFonc main nul null (SaLDecVar (SaDecVarSimple base entier) null) (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple base) 2) (SaLInst (SaInstAffect (SaVarIndicee tab (SaExpAdd (SaExpVar (SaVarSimple base)) 0)) 34) (SaLInst (SaInstAffect (SaVarIndicee tab (SaExpAdd (SaExpVar (SaVarSimple base)) 1)) 74) (SaLInst (SaInstAffect (SaVarIndicee tab (SaExpAdd (SaExpVar (SaVarSimple base)) 2)) 16) (SaLInst (SaInstEcriture (SaExpVar (SaVarIndicee tab 2))) (SaLInst (SaInstEcriture (SaExpVar (SaVarIndicee tab 3))) (SaLInst (SaInstEcriture (SaExpVar (SaVarIndicee tab 4))) null))))))))) null)) diff --git a/test/sa-ref/tab3.sa b/test/sa-ref/tab3.sa new file mode 100644 index 0000000..efb0fc0 --- /dev/null +++ b/test/sa-ref/tab3.sa @@ -0,0 +1 @@ +(SaProg (SaLDecVar (SaDecTab tab entier 5) null) (SaLDecFonc (SaDecFonc main nul null (SaLDecVar (SaDecVarSimple base entier) (SaLDecVar (SaDecVarSimple offset entier) null)) (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple base) 2) (SaLInst (SaInstAffect (SaVarSimple offset) 0) (SaLInst (SaInstAffect (SaVarIndicee tab (SaExpAdd (SaExpVar (SaVarSimple base)) (SaExpVar (SaVarSimple offset)))) 34) (SaLInst (SaInstAffect (SaVarSimple offset) 1) (SaLInst (SaInstAffect (SaVarIndicee tab (SaExpAdd (SaExpVar (SaVarSimple base)) (SaExpVar (SaVarSimple offset)))) 74) (SaLInst (SaInstAffect (SaVarSimple offset) 2) (SaLInst (SaInstAffect (SaVarIndicee tab (SaExpAdd (SaExpVar (SaVarSimple base)) (SaExpVar (SaVarSimple offset)))) 16) (SaLInst (SaInstEcriture (SaExpVar (SaVarIndicee tab 2))) (SaLInst (SaInstEcriture (SaExpVar (SaVarIndicee tab 3))) (SaLInst (SaInstEcriture (SaExpVar (SaVarIndicee tab 4))) null)))))))))))) null)) diff --git a/test/sa-ref/tab4.sa b/test/sa-ref/tab4.sa new file mode 100644 index 0000000..372b6bb --- /dev/null +++ b/test/sa-ref/tab4.sa @@ -0,0 +1 @@ +(SaProg (SaLDecVar (SaDecTab tab entier 3) null) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstAffect (SaVarIndicee tab 0) 1) (SaLInst (SaInstAffect (SaVarIndicee tab (SaExpVar (SaVarIndicee tab 0))) 12) (SaLInst (SaInstAffect (SaVarIndicee tab (SaExpAdd (SaExpVar (SaVarIndicee tab 0)) 1)) 13) (SaLInst (SaInstEcriture (SaExpVar (SaVarIndicee tab 0))) (SaLInst (SaInstEcriture (SaExpVar (SaVarIndicee tab 1))) (SaLInst (SaInstEcriture (SaExpVar (SaVarIndicee tab 2))) null)))))))) null)) diff --git a/test/sa-ref/tantque1.sa b/test/sa-ref/tantque1.sa new file mode 100644 index 0000000..676e5f6 --- /dev/null +++ b/test/sa-ref/tantque1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null (SaLDecVar (SaDecVarSimple a entier) null) (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple a) 10) (SaLInst (SaInstTantQue (SaExpInf 0 (SaExpVar (SaVarSimple a))) (SaInstBloc (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple a))) (SaLInst (SaInstAffect (SaVarSimple a) (SaExpSub (SaExpVar (SaVarSimple a)) 1)) null)))) (SaLInst (SaInstEcriture 0) null))))) null)) diff --git a/test/sa-ref/tantque2.sa b/test/sa-ref/tantque2.sa new file mode 100644 index 0000000..6482da5 --- /dev/null +++ b/test/sa-ref/tantque2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null (SaLDecVar (SaDecVarSimple a entier) (SaLDecVar (SaDecVarSimple b entier) null)) (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple a) 0) (SaLInst (SaInstTantQue (SaExpInf (SaExpVar (SaVarSimple a)) 4) (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple b) 0) (SaLInst (SaInstTantQue (SaExpInf (SaExpVar (SaVarSimple b)) 4) (SaInstBloc (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple a))) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple b))) (SaLInst (SaInstAffect (SaVarSimple b) (SaExpAdd (SaExpVar (SaVarSimple b)) 1)) null))))) (SaLInst (SaInstAffect (SaVarSimple a) (SaExpAdd (SaExpVar (SaVarSimple a)) 1)) null))))) null)))) null)) diff --git a/test/sa-ref/tri.sa b/test/sa-ref/tri.sa new file mode 100644 index 0000000..69b3753 --- /dev/null +++ b/test/sa-ref/tri.sa @@ -0,0 +1 @@ +(SaProg (SaLDecVar (SaDecTab tab entier 10) null) (SaLDecFonc (SaDecFonc initialiser nul null null (SaInstBloc (SaLInst (SaInstAffect (SaVarIndicee tab 0) 8) (SaLInst (SaInstAffect (SaVarIndicee tab 1) 6) (SaLInst (SaInstAffect (SaVarIndicee tab 2) 9) (SaLInst (SaInstAffect (SaVarIndicee tab 3) 9) (SaLInst (SaInstAffect (SaVarIndicee tab 4) 4) (SaLInst (SaInstAffect (SaVarIndicee tab 5) 2) (SaLInst (SaInstAffect (SaVarIndicee tab 6) 3) (SaLInst (SaInstAffect (SaVarIndicee tab 7) 1) (SaLInst (SaInstAffect (SaVarIndicee tab 8) 4) (SaLInst (SaInstAffect (SaVarIndicee tab 9) 5) null)))))))))))) (SaLDecFonc (SaDecFonc afficher nul (SaLDecVar (SaDecVarSimple n entier) null) (SaLDecVar (SaDecVarSimple i entier) null) (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple i) 0) (SaLInst (SaInstTantQue (SaExpInf (SaExpVar (SaVarSimple i)) (SaExpVar (SaVarSimple n))) (SaInstBloc (SaLInst (SaInstEcriture (SaExpVar (SaVarIndicee tab (SaExpVar (SaVarSimple i))))) (SaLInst (SaInstAffect (SaVarSimple i) (SaExpAdd (SaExpVar (SaVarSimple i)) 1)) null)))) (SaLInst (SaInstEcriture 0) null))))) (SaLDecFonc (SaDecFonc echanger nul (SaLDecVar (SaDecVarSimple i entier) (SaLDecVar (SaDecVarSimple j entier) null)) (SaLDecVar (SaDecVarSimple temp entier) null) (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple temp) (SaExpVar (SaVarIndicee tab (SaExpVar (SaVarSimple j))))) (SaLInst (SaInstAffect (SaVarIndicee tab (SaExpVar (SaVarSimple j))) (SaExpVar (SaVarIndicee tab (SaExpVar (SaVarSimple i))))) (SaLInst (SaInstAffect (SaVarIndicee tab (SaExpVar (SaVarSimple i))) (SaExpVar (SaVarSimple temp))) null))))) (SaLDecFonc (SaDecFonc trier nul (SaLDecVar (SaDecVarSimple n entier) null) (SaLDecVar (SaDecVarSimple echange entier) (SaLDecVar (SaDecVarSimple j entier) (SaLDecVar (SaDecVarSimple m entier) null))) (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple m) (SaExpVar (SaVarSimple n))) (SaLInst (SaInstAffect (SaVarSimple echange) 1) (SaLInst (SaInstTantQue (SaExpEqual (SaExpVar (SaVarSimple echange)) 1) (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple echange) 0) (SaLInst (SaInstAffect (SaVarSimple j) 0) (SaLInst (SaInstTantQue (SaExpInf (SaExpVar (SaVarSimple j)) (SaExpSub (SaExpVar (SaVarSimple m)) 1)) (SaInstBloc (SaLInst (SaInstSi (SaExpInf (SaExpVar (SaVarIndicee tab (SaExpAdd (SaExpVar (SaVarSimple j)) 1))) (SaExpVar (SaVarIndicee tab (SaExpVar (SaVarSimple j))))) (SaInstBloc (SaLInst (SaAppel echanger (SaLExp (SaExpVar (SaVarSimple j)) (SaLExp (SaExpAdd (SaExpVar (SaVarSimple j)) 1) null))) (SaLInst (SaInstAffect (SaVarSimple echange) 1) null))) null) (SaLInst (SaInstAffect (SaVarSimple j) (SaExpAdd (SaExpVar (SaVarSimple j)) 1)) null)))) (SaLInst (SaInstAffect (SaVarSimple m) (SaExpSub (SaExpVar (SaVarSimple m)) 1)) null)))))) null))))) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaAppel initialiser null) (SaLInst (SaAppel afficher (SaLExp 10 null)) (SaLInst (SaAppel trier (SaLExp 10 null)) (SaLInst (SaAppel afficher (SaLExp 10 null)) null)))))) null)))))) diff --git a/test/sa-ref/varglob1.sa b/test/sa-ref/varglob1.sa new file mode 100644 index 0000000..f0e56eb --- /dev/null +++ b/test/sa-ref/varglob1.sa @@ -0,0 +1 @@ +(SaProg (SaLDecVar (SaDecVarSimple variable entier) null) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple variable) 6834) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple variable))) null)))) null)) diff --git a/test/sa-ref/varglob2.sa b/test/sa-ref/varglob2.sa new file mode 100644 index 0000000..5f173ad --- /dev/null +++ b/test/sa-ref/varglob2.sa @@ -0,0 +1 @@ +(SaProg (SaLDecVar (SaDecVarSimple variable entier) null) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple variable) 10) (SaLInst (SaInstEcriture (SaExpAdd (SaExpVar (SaVarSimple variable)) 50)) null)))) null)) diff --git a/test/sa-ref/varglob3.sa b/test/sa-ref/varglob3.sa new file mode 100644 index 0000000..8466973 --- /dev/null +++ b/test/sa-ref/varglob3.sa @@ -0,0 +1 @@ +(SaProg (SaLDecVar (SaDecVarSimple var1 entier) (SaLDecVar (SaDecVarSimple var2 entier) null)) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple var1) 10) (SaLInst (SaInstAffect (SaVarSimple var2) 34) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple var1))) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple var2))) null)))))) null)) diff --git a/test/sa-ref/varglob4.sa b/test/sa-ref/varglob4.sa new file mode 100644 index 0000000..4d47fed --- /dev/null +++ b/test/sa-ref/varglob4.sa @@ -0,0 +1 @@ +(SaProg (SaLDecVar (SaDecVarSimple var1 entier) (SaLDecVar (SaDecVarSimple var2 entier) null)) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple var1) 10) (SaLInst (SaInstAffect (SaVarSimple var2) 34) (SaLInst (SaInstEcriture (SaExpAdd (SaExpVar (SaVarSimple var1)) (SaExpVar (SaVarSimple var2)))) null))))) null)) diff --git a/test/sa-ref/varloc1.sa b/test/sa-ref/varloc1.sa new file mode 100644 index 0000000..f73881a --- /dev/null +++ b/test/sa-ref/varloc1.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null (SaLDecVar (SaDecVarSimple variable entier) null) (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple variable) 6834) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple variable))) null)))) null)) diff --git a/test/sa-ref/varloc2.sa b/test/sa-ref/varloc2.sa new file mode 100644 index 0000000..35a55ff --- /dev/null +++ b/test/sa-ref/varloc2.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null (SaLDecVar (SaDecVarSimple variable entier) null) (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple variable) 10) (SaLInst (SaInstEcriture (SaExpAdd (SaExpVar (SaVarSimple variable)) 50)) null)))) null)) diff --git a/test/sa-ref/varloc3.sa b/test/sa-ref/varloc3.sa new file mode 100644 index 0000000..3c7878c --- /dev/null +++ b/test/sa-ref/varloc3.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null (SaLDecVar (SaDecVarSimple var1 entier) (SaLDecVar (SaDecVarSimple var2 entier) null)) (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple var1) 10) (SaLInst (SaInstAffect (SaVarSimple var2) 30) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple var1))) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple var2))) null)))))) null)) diff --git a/test/sa-ref/varloc4.sa b/test/sa-ref/varloc4.sa new file mode 100644 index 0000000..0578507 --- /dev/null +++ b/test/sa-ref/varloc4.sa @@ -0,0 +1 @@ +(SaProg null (SaLDecFonc (SaDecFonc main nul null (SaLDecVar (SaDecVarSimple var1 entier) (SaLDecVar (SaDecVarSimple var2 entier) null)) (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple var1) 10) (SaLInst (SaInstAffect (SaVarSimple var2) 30) (SaLInst (SaInstEcriture (SaExpAdd (SaExpVar (SaVarSimple var1)) (SaExpVar (SaVarSimple var2)))) null))))) null)) diff --git a/test/sa-ref/varloc5.sa b/test/sa-ref/varloc5.sa new file mode 100644 index 0000000..dbeb0be --- /dev/null +++ b/test/sa-ref/varloc5.sa @@ -0,0 +1 @@ +(SaProg (SaLDecVar (SaDecVarSimple var1 entier) null) (SaLDecFonc (SaDecFonc f nul null (SaLDecVar (SaDecVarSimple var1 entier) null) (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple var1) 10) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple var1))) null)))) (SaLDecFonc (SaDecFonc main nul null null (SaInstBloc (SaLInst (SaInstAffect (SaVarSimple var1) 20) (SaLInst (SaAppel f null) (SaLInst (SaInstEcriture (SaExpVar (SaVarSimple var1))) null))))) null))) diff --git a/test/sc-ref/add1.sc b/test/sc-ref/add1.sc new file mode 100644 index 0000000..5ba6a48 --- /dev/null +++ b/test/sc-ref/add1.sc @@ -0,0 +1,44 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/add2.sc b/test/sc-ref/add2.sc new file mode 100644 index 0000000..5447ac9 --- /dev/null +++ b/test/sc-ref/add2.sc @@ -0,0 +1,52 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/affect1.sc b/test/sc-ref/affect1.sc new file mode 100644 index 0000000..919a434 --- /dev/null +++ b/test/sc-ref/affect1.sc @@ -0,0 +1,66 @@ +<Start> + <ADecvarldecfoncProgramme> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ADecvarldecfoncProgramme> +</Start> diff --git a/test/sc-ref/affect2.sc b/test/sc-ref/affect2.sc new file mode 100644 index 0000000..55761e9 --- /dev/null +++ b/test/sc-ref/affect2.sc @@ -0,0 +1,66 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <ADecvarinstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </ADecvarinstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/affect3.sc b/test/sc-ref/affect3.sc new file mode 100644 index 0000000..6046f37 --- /dev/null +++ b/test/sc-ref/affect3.sc @@ -0,0 +1,106 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <AAvecparamListeparam> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AAvecparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncrecListedecfonc> + <ADecvarinstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrappelInstr> + <AInstrappel> + <AAppelfct> + <ARecursifListeexp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AFinalListeexpbis> + </AFinalListeexpbis> + </ARecursifListeexp> + </AAppelfct> + </AInstrappel> + </AInstrappelInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </ADecvarinstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/and1.sc b/test/sc-ref/and1.sc new file mode 100644 index 0000000..f3a30fb --- /dev/null +++ b/test/sc-ref/and1.sc @@ -0,0 +1,48 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AEtExp1> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AEtExp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/and2.sc b/test/sc-ref/and2.sc new file mode 100644 index 0000000..f3a30fb --- /dev/null +++ b/test/sc-ref/and2.sc @@ -0,0 +1,48 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AEtExp1> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AEtExp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/and3.sc b/test/sc-ref/and3.sc new file mode 100644 index 0000000..f3a30fb --- /dev/null +++ b/test/sc-ref/and3.sc @@ -0,0 +1,48 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AEtExp1> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AEtExp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/and4.sc b/test/sc-ref/and4.sc new file mode 100644 index 0000000..f3a30fb --- /dev/null +++ b/test/sc-ref/and4.sc @@ -0,0 +1,48 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AEtExp1> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AEtExp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/and5.sc b/test/sc-ref/and5.sc new file mode 100644 index 0000000..22cd18f --- /dev/null +++ b/test/sc-ref/and5.sc @@ -0,0 +1,60 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AEtExp1> + <AEtExp1> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AEtExp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AEtExp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/appel-param1.sc b/test/sc-ref/appel-param1.sc new file mode 100644 index 0000000..5f242e2 --- /dev/null +++ b/test/sc-ref/appel-param1.sc @@ -0,0 +1,78 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <AAvecparamListeparam> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AAvecparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrappelInstr> + <AInstrappel> + <AAppelfct> + <ARecursifListeexp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AFinalListeexpbis> + </AFinalListeexpbis> + </ARecursifListeexp> + </AAppelfct> + </AInstrappel> + </AInstrappelInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/appel-param2.sc b/test/sc-ref/appel-param2.sc new file mode 100644 index 0000000..c683b17 --- /dev/null +++ b/test/sc-ref/appel-param2.sc @@ -0,0 +1,120 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <AAvecparamListeparam> + <ADecvarldecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + <ADecvarListedecvarbis> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvarbis> + </ADecvarldecvarListedecvar> + </AAvecparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrappelInstr> + <AInstrappel> + <AAppelfct> + <ARecursifListeexp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <ARecursifListeexpbis> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AFinalListeexpbis> + </AFinalListeexpbis> + </ARecursifListeexpbis> + </ARecursifListeexp> + </AAppelfct> + </AInstrappel> + </AInstrappelInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/appel-param3.sc b/test/sc-ref/appel-param3.sc new file mode 100644 index 0000000..6aab83b --- /dev/null +++ b/test/sc-ref/appel-param3.sc @@ -0,0 +1,246 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <AAvecparamListeparam> + <ADecvarldecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + <ADecvarldecvarListedecvarbis> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + <ADecvarldecvarListedecvarbis> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + <ADecvarldecvarListedecvarbis> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + <ADecvarListedecvarbis> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvarbis> + </ADecvarldecvarListedecvarbis> + </ADecvarldecvarListedecvarbis> + </ADecvarldecvarListedecvarbis> + </ADecvarldecvarListedecvar> + </AAvecparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrappelInstr> + <AInstrappel> + <AAppelfct> + <ARecursifListeexp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <ARecursifListeexpbis> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <ARecursifListeexpbis> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <ARecursifListeexpbis> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <ARecursifListeexpbis> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AFinalListeexpbis> + </AFinalListeexpbis> + </ARecursifListeexpbis> + </ARecursifListeexpbis> + </ARecursifListeexpbis> + </ARecursifListeexpbis> + </ARecursifListeexp> + </AAppelfct> + </AInstrappel> + </AInstrappelInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/appel-retour1.sc b/test/sc-ref/appel-retour1.sc new file mode 100644 index 0000000..64940ad --- /dev/null +++ b/test/sc-ref/appel-retour1.sc @@ -0,0 +1,106 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <AAvecparamListeparam> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AAvecparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrretourInstr> + <AInstrretour> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrretour> + </AInstrretourInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AAppelfctExp6> + <AAppelfct> + <ARecursifListeexp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AFinalListeexpbis> + </AFinalListeexpbis> + </ARecursifListeexp> + </AAppelfct> + </AAppelfctExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/appel1.sc b/test/sc-ref/appel1.sc new file mode 100644 index 0000000..146cd4a --- /dev/null +++ b/test/sc-ref/appel1.sc @@ -0,0 +1,56 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrappelInstr> + <AInstrappel> + <AAppelfct> + <AFinalListeexp> + </AFinalListeexp> + </AAppelfct> + </AInstrappel> + </AInstrappelInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/appel2.sc b/test/sc-ref/appel2.sc new file mode 100644 index 0000000..b1e1d36 --- /dev/null +++ b/test/sc-ref/appel2.sc @@ -0,0 +1,96 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrappelInstr> + <AInstrappel> + <AAppelfct> + <AFinalListeexp> + </AFinalListeexp> + </AAppelfct> + </AInstrappel> + </AInstrappelInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrappelInstr> + <AInstrappel> + <AAppelfct> + <AFinalListeexp> + </AFinalListeexp> + </AAppelfct> + </AInstrappel> + </AInstrappelInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/appel3.sc b/test/sc-ref/appel3.sc new file mode 100644 index 0000000..1e1737c --- /dev/null +++ b/test/sc-ref/appel3.sc @@ -0,0 +1,96 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrappelInstr> + <AInstrappel> + <AAppelfct> + <AFinalListeexp> + </AFinalListeexp> + </AAppelfct> + </AInstrappel> + </AInstrappelInstr> + <ALinstrecListeinst> + <AInstrappelInstr> + <AInstrappel> + <AAppelfct> + <AFinalListeexp> + </AFinalListeexp> + </AAppelfct> + </AInstrappel> + </AInstrappelInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/div1.sc b/test/sc-ref/div1.sc new file mode 100644 index 0000000..3ce95c7 --- /dev/null +++ b/test/sc-ref/div1.sc @@ -0,0 +1,42 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <ADiviseExp4> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ADiviseExp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/div2.sc b/test/sc-ref/div2.sc new file mode 100644 index 0000000..3ce95c7 --- /dev/null +++ b/test/sc-ref/div2.sc @@ -0,0 +1,42 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <ADiviseExp4> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ADiviseExp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/div3.sc b/test/sc-ref/div3.sc new file mode 100644 index 0000000..2fe7922 --- /dev/null +++ b/test/sc-ref/div3.sc @@ -0,0 +1,48 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <ADiviseExp4> + <ADiviseExp4> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ADiviseExp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ADiviseExp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/div4.sc b/test/sc-ref/div4.sc new file mode 100644 index 0000000..3ce95c7 --- /dev/null +++ b/test/sc-ref/div4.sc @@ -0,0 +1,42 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <ADiviseExp4> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ADiviseExp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/ecrire1.sc b/test/sc-ref/ecrire1.sc new file mode 100644 index 0000000..03c62d1 --- /dev/null +++ b/test/sc-ref/ecrire1.sc @@ -0,0 +1,36 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/ecrire2.sc b/test/sc-ref/ecrire2.sc new file mode 100644 index 0000000..03c62d1 --- /dev/null +++ b/test/sc-ref/ecrire2.sc @@ -0,0 +1,36 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/egal1.sc b/test/sc-ref/egal1.sc new file mode 100644 index 0000000..19ab92d --- /dev/null +++ b/test/sc-ref/egal1.sc @@ -0,0 +1,46 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AEgalExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AEgalExp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/egal2.sc b/test/sc-ref/egal2.sc new file mode 100644 index 0000000..19ab92d --- /dev/null +++ b/test/sc-ref/egal2.sc @@ -0,0 +1,46 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AEgalExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AEgalExp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/egal3.sc b/test/sc-ref/egal3.sc new file mode 100644 index 0000000..4c55fe8 --- /dev/null +++ b/test/sc-ref/egal3.sc @@ -0,0 +1,56 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AEgalExp2> + <AEgalExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AEgalExp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AEgalExp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/err1.sc b/test/sc-ref/err1.sc new file mode 100644 index 0000000..2836d73 --- /dev/null +++ b/test/sc-ref/err1.sc @@ -0,0 +1,38 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/err2.sc b/test/sc-ref/err2.sc new file mode 100644 index 0000000..2eb2ef9 --- /dev/null +++ b/test/sc-ref/err2.sc @@ -0,0 +1,26 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrappelInstr> + <AInstrappel> + <AAppelfct> + <AFinalListeexp> + </AFinalListeexp> + </AAppelfct> + </AInstrappel> + </AInstrappelInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/err3.sc b/test/sc-ref/err3.sc new file mode 100644 index 0000000..b159de5 --- /dev/null +++ b/test/sc-ref/err3.sc @@ -0,0 +1,40 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <AAvecparamListeparam> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AAvecparamListeparam> + <AInstrbloc> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrappelInstr> + <AInstrappel> + <AAppelfct> + <AFinalListeexp> + </AFinalListeexp> + </AAppelfct> + </AInstrappel> + </AInstrappelInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/err4.sc b/test/sc-ref/err4.sc new file mode 100644 index 0000000..ae87ec4 --- /dev/null +++ b/test/sc-ref/err4.sc @@ -0,0 +1,62 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <ADecvarinstrDecfonc> + <AAvecparamListeparam> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AAvecparamListeparam> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <AInstrbloc> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </AInstrbloc> + </ADecvarinstrDecfonc> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrappelInstr> + <AInstrappel> + <AAppelfct> + <ARecursifListeexp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AFinalListeexpbis> + </AFinalListeexpbis> + </ARecursifListeexp> + </AAppelfct> + </AInstrappel> + </AInstrappelInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/err5.sc b/test/sc-ref/err5.sc new file mode 100644 index 0000000..6e98350 --- /dev/null +++ b/test/sc-ref/err5.sc @@ -0,0 +1,78 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncrecListedecfonc> + <ADecvarinstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AAppelfctExp6> + <AAppelfct> + <AFinalListeexp> + </AFinalListeexp> + </AAppelfct> + </AAppelfctExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </ADecvarinstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/fibo.sc b/test/sc-ref/fibo.sc new file mode 100644 index 0000000..f6f4346 --- /dev/null +++ b/test/sc-ref/fibo.sc @@ -0,0 +1,248 @@ +<Start> + <AProgramme> + <AVideListedecvar> + <AEpsilon> + </AEpsilon> + </AVideListedecvar> + <ARecursifListedecfonc> + <ADecfonc> + <AEntierOpttype> + </AEntierOpttype> + <APremierListedecvar> + <AScalaireDecvar> + <AEntierType> + </AEntierType> + </AScalaireDecvar> + <AFinalListedecvarbis> + <AEpsilon> + </AEpsilon> + </AFinalListedecvarbis> + </APremierListedecvar> + <AVideListedecvar> + <AEpsilon> + </AEpsilon> + </AVideListedecvar> + <AInstrbloc> + <ARecursifListeinst> + <ASinonInstr> + <AExp1Exp> + <AExp2Exp1> + <AInfExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <ASimpleVar> + </ASimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AInfExp2> + </AExp2Exp1> + </AExp1Exp> + <AInstrbloc> + <ARecursifListeinst> + <ARetourInstr> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </ARetourInstr> + <AFinalListeinst> + <AEpsilon> + </AEpsilon> + </AFinalListeinst> + </ARecursifListeinst> + </AInstrbloc> + <AInstrbloc> + <ARecursifListeinst> + <ARetourInstr> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AAppelfctExp6> + <AAppelfct> + <APremierListeexp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AMoinsExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <ASimpleVar> + </ASimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AMoinsExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AFinalListeexpbis> + <AEpsilon> + </AEpsilon> + </AFinalListeexpbis> + </APremierListeexp> + </AAppelfct> + </AAppelfctExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AAppelfctExp6> + <AAppelfct> + <APremierListeexp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AMoinsExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <ASimpleVar> + </ASimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AMoinsExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AFinalListeexpbis> + <AEpsilon> + </AEpsilon> + </AFinalListeexpbis> + </APremierListeexp> + </AAppelfct> + </AAppelfctExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </ARetourInstr> + <AFinalListeinst> + <AEpsilon> + </AEpsilon> + </AFinalListeinst> + </ARecursifListeinst> + </AInstrbloc> + </ASinonInstr> + <AFinalListeinst> + <AEpsilon> + </AEpsilon> + </AFinalListeinst> + </ARecursifListeinst> + </AInstrbloc> + </ADecfonc> + <ARecursifListedecfonc> + <ADecfonc> + <AVideOpttype> + </AVideOpttype> + <AVideListedecvar> + <AEpsilon> + </AEpsilon> + </AVideListedecvar> + <AVideListedecvar> + <AEpsilon> + </AEpsilon> + </AVideListedecvar> + <AInstrbloc> + <ARecursifListeinst> + <AEcritureInstr> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AAppelfctExp6> + <AAppelfct> + <APremierListeexp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AFinalListeexpbis> + <AEpsilon> + </AEpsilon> + </AFinalListeexpbis> + </APremierListeexp> + </AAppelfct> + </AAppelfctExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AEcritureInstr> + <AFinalListeinst> + <AEpsilon> + </AEpsilon> + </AFinalListeinst> + </ARecursifListeinst> + </AInstrbloc> + </ADecfonc> + <AFinalListedecfonc> + <AEpsilon> + </AEpsilon> + </AFinalListedecfonc> + </ARecursifListedecfonc> + </ARecursifListedecfonc> + </AProgramme> +</Start> diff --git a/test/sc-ref/inf1.sc b/test/sc-ref/inf1.sc new file mode 100644 index 0000000..6daf211 --- /dev/null +++ b/test/sc-ref/inf1.sc @@ -0,0 +1,46 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AInfExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AInfExp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/inf2.sc b/test/sc-ref/inf2.sc new file mode 100644 index 0000000..6daf211 --- /dev/null +++ b/test/sc-ref/inf2.sc @@ -0,0 +1,46 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AInfExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AInfExp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/inf3.sc b/test/sc-ref/inf3.sc new file mode 100644 index 0000000..6daf211 --- /dev/null +++ b/test/sc-ref/inf3.sc @@ -0,0 +1,46 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AInfExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AInfExp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/inf4.sc b/test/sc-ref/inf4.sc new file mode 100644 index 0000000..4804d6f --- /dev/null +++ b/test/sc-ref/inf4.sc @@ -0,0 +1,56 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AInfExp2> + <AInfExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AInfExp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AInfExp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/modulo1.sc b/test/sc-ref/modulo1.sc new file mode 100644 index 0000000..470dfbf --- /dev/null +++ b/test/sc-ref/modulo1.sc @@ -0,0 +1,42 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AModuloExp4> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AModuloExp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/mult1.sc b/test/sc-ref/mult1.sc new file mode 100644 index 0000000..43b5a18 --- /dev/null +++ b/test/sc-ref/mult1.sc @@ -0,0 +1,42 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AFoisExp4> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AFoisExp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/mult2.sc b/test/sc-ref/mult2.sc new file mode 100644 index 0000000..43b5a18 --- /dev/null +++ b/test/sc-ref/mult2.sc @@ -0,0 +1,42 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AFoisExp4> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AFoisExp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/mult3.sc b/test/sc-ref/mult3.sc new file mode 100644 index 0000000..ed24546 --- /dev/null +++ b/test/sc-ref/mult3.sc @@ -0,0 +1,48 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AFoisExp4> + <AFoisExp4> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AFoisExp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AFoisExp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/not1.sc b/test/sc-ref/not1.sc new file mode 100644 index 0000000..f1def7e --- /dev/null +++ b/test/sc-ref/not1.sc @@ -0,0 +1,38 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <ANonExp5> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ANonExp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/not2.sc b/test/sc-ref/not2.sc new file mode 100644 index 0000000..f1def7e --- /dev/null +++ b/test/sc-ref/not2.sc @@ -0,0 +1,38 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <ANonExp5> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ANonExp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/not3.sc b/test/sc-ref/not3.sc new file mode 100644 index 0000000..c72880b --- /dev/null +++ b/test/sc-ref/not3.sc @@ -0,0 +1,40 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <ANonExp5> + <ANonExp5> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ANonExp5> + </ANonExp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/or1.sc b/test/sc-ref/or1.sc new file mode 100644 index 0000000..35d8279 --- /dev/null +++ b/test/sc-ref/or1.sc @@ -0,0 +1,50 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AOuExp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AOuExp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/or2.sc b/test/sc-ref/or2.sc new file mode 100644 index 0000000..35d8279 --- /dev/null +++ b/test/sc-ref/or2.sc @@ -0,0 +1,50 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AOuExp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AOuExp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/or3.sc b/test/sc-ref/or3.sc new file mode 100644 index 0000000..35d8279 --- /dev/null +++ b/test/sc-ref/or3.sc @@ -0,0 +1,50 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AOuExp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AOuExp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/or4.sc b/test/sc-ref/or4.sc new file mode 100644 index 0000000..35d8279 --- /dev/null +++ b/test/sc-ref/or4.sc @@ -0,0 +1,50 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AOuExp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AOuExp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/or5.sc b/test/sc-ref/or5.sc new file mode 100644 index 0000000..954b836 --- /dev/null +++ b/test/sc-ref/or5.sc @@ -0,0 +1,64 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AOuExp> + <AOuExp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AOuExp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AOuExp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/parenth1.sc b/test/sc-ref/parenth1.sc new file mode 100644 index 0000000..6e5d8d2 --- /dev/null +++ b/test/sc-ref/parenth1.sc @@ -0,0 +1,50 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/parenth2.sc b/test/sc-ref/parenth2.sc new file mode 100644 index 0000000..eff72be --- /dev/null +++ b/test/sc-ref/parenth2.sc @@ -0,0 +1,64 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio23-1.sc b/test/sc-ref/prio23-1.sc new file mode 100644 index 0000000..d19611d --- /dev/null +++ b/test/sc-ref/prio23-1.sc @@ -0,0 +1,44 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AFoisExp4> + <AExp5Exp4> + <ANonExp5> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ANonExp5> + </AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AFoisExp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio23-2.sc b/test/sc-ref/prio23-2.sc new file mode 100644 index 0000000..41731ec --- /dev/null +++ b/test/sc-ref/prio23-2.sc @@ -0,0 +1,44 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AFoisExp4> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + <ANonExp5> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ANonExp5> + </AFoisExp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio23-3.sc b/test/sc-ref/prio23-3.sc new file mode 100644 index 0000000..fc90db4 --- /dev/null +++ b/test/sc-ref/prio23-3.sc @@ -0,0 +1,44 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <ADiviseExp4> + <AExp5Exp4> + <ANonExp5> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ANonExp5> + </AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ADiviseExp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio23-4.sc b/test/sc-ref/prio23-4.sc new file mode 100644 index 0000000..9e09675 --- /dev/null +++ b/test/sc-ref/prio23-4.sc @@ -0,0 +1,46 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <ADiviseExp4> + <AExp5Exp4> + <ANonExp5> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ANonExp5> + </AExp5Exp4> + <ANonExp5> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ANonExp5> + </ADiviseExp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio34-1.sc b/test/sc-ref/prio34-1.sc new file mode 100644 index 0000000..b91f1fb --- /dev/null +++ b/test/sc-ref/prio34-1.sc @@ -0,0 +1,50 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AFoisExp4> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AFoisExp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio34-2.sc b/test/sc-ref/prio34-2.sc new file mode 100644 index 0000000..83731e7 --- /dev/null +++ b/test/sc-ref/prio34-2.sc @@ -0,0 +1,50 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AMoinsExp3> + <AExp4Exp3> + <AFoisExp4> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AFoisExp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AMoinsExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio34-3.sc b/test/sc-ref/prio34-3.sc new file mode 100644 index 0000000..c2ea56d --- /dev/null +++ b/test/sc-ref/prio34-3.sc @@ -0,0 +1,50 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AMoinsExp3> + <AExp4Exp3> + <ADiviseExp4> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ADiviseExp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AMoinsExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio34-4.sc b/test/sc-ref/prio34-4.sc new file mode 100644 index 0000000..3e2860a --- /dev/null +++ b/test/sc-ref/prio34-4.sc @@ -0,0 +1,50 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <ADiviseExp4> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </ADiviseExp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio45-1.sc b/test/sc-ref/prio45-1.sc new file mode 100644 index 0000000..76d3b8d --- /dev/null +++ b/test/sc-ref/prio45-1.sc @@ -0,0 +1,54 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AEgalExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AEgalExp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio45-2.sc b/test/sc-ref/prio45-2.sc new file mode 100644 index 0000000..721d838 --- /dev/null +++ b/test/sc-ref/prio45-2.sc @@ -0,0 +1,54 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AEgalExp2> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AEgalExp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio45-3.sc b/test/sc-ref/prio45-3.sc new file mode 100644 index 0000000..5777f26 --- /dev/null +++ b/test/sc-ref/prio45-3.sc @@ -0,0 +1,54 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AInfExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AInfExp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio45-4.sc b/test/sc-ref/prio45-4.sc new file mode 100644 index 0000000..02dd9dd --- /dev/null +++ b/test/sc-ref/prio45-4.sc @@ -0,0 +1,54 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AInfExp2> + <AExp3Exp2> + <AMoinsExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AMoinsExp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AInfExp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio56-1.sc b/test/sc-ref/prio56-1.sc new file mode 100644 index 0000000..a59126e --- /dev/null +++ b/test/sc-ref/prio56-1.sc @@ -0,0 +1,58 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AEtExp1> + <AExp2Exp1> + <AEgalExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AEgalExp2> + </AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AEtExp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio56-2.sc b/test/sc-ref/prio56-2.sc new file mode 100644 index 0000000..480375b --- /dev/null +++ b/test/sc-ref/prio56-2.sc @@ -0,0 +1,58 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AEtExp1> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + <AEgalExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AEgalExp2> + </AEtExp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio67-1.sc b/test/sc-ref/prio67-1.sc new file mode 100644 index 0000000..f096c7c --- /dev/null +++ b/test/sc-ref/prio67-1.sc @@ -0,0 +1,62 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AOuExp> + <AExp1Exp> + <AEtExp1> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AEtExp1> + </AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AOuExp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/prio67-2.sc b/test/sc-ref/prio67-2.sc new file mode 100644 index 0000000..9bb0df8 --- /dev/null +++ b/test/sc-ref/prio67-2.sc @@ -0,0 +1,62 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AOuExp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AEtExp1> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AEtExp1> + </AOuExp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/rec1.sc b/test/sc-ref/rec1.sc new file mode 100644 index 0000000..1f75e39 --- /dev/null +++ b/test/sc-ref/rec1.sc @@ -0,0 +1,258 @@ +<Start> + <AProgramme> + <AVideListedecvar> + <AEpsilon> + </AEpsilon> + </AVideListedecvar> + <ARecursifListedecfonc> + <ADecfonc> + <AEntierOpttype> + </AEntierOpttype> + <APremierListedecvar> + <AScalaireDecvar> + <AEntierType> + </AEntierType> + </AScalaireDecvar> + <AFinalListedecvarbis> + <AEpsilon> + </AEpsilon> + </AFinalListedecvarbis> + </APremierListedecvar> + <AVideListedecvar> + <AEpsilon> + </AEpsilon> + </AVideListedecvar> + <AInstrbloc> + <ARecursifListeinst> + <ASinonInstr> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AEgalExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <ASimpleVar> + </ASimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AEgalExp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AInstrbloc> + <ARecursifListeinst> + <ARetourInstr> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </ARetourInstr> + <AFinalListeinst> + <AEpsilon> + </AEpsilon> + </AFinalListeinst> + </ARecursifListeinst> + </AInstrbloc> + <AInstrbloc> + <ARecursifListeinst> + <ARetourInstr> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AAppelfctExp6> + <AAppelfct> + <APremierListeexp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AMoinsExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <ASimpleVar> + </ASimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AMoinsExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AFinalListeexpbis> + <AEpsilon> + </AEpsilon> + </AFinalListeexpbis> + </APremierListeexp> + </AAppelfct> + </AAppelfctExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </ARetourInstr> + <AFinalListeinst> + <AEpsilon> + </AEpsilon> + </AFinalListeinst> + </ARecursifListeinst> + </AInstrbloc> + </ASinonInstr> + <AFinalListeinst> + <AEpsilon> + </AEpsilon> + </AFinalListeinst> + </ARecursifListeinst> + </AInstrbloc> + </ADecfonc> + <ARecursifListedecfonc> + <ADecfonc> + <AVideOpttype> + </AVideOpttype> + <AVideListedecvar> + <AEpsilon> + </AEpsilon> + </AVideListedecvar> + <AVideListedecvar> + <AEpsilon> + </AEpsilon> + </AVideListedecvar> + <AInstrbloc> + <ARecursifListeinst> + <AEcritureInstr> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AAppelfctExp6> + <AAppelfct> + <APremierListeexp> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AFinalListeexpbis> + <AEpsilon> + </AEpsilon> + </AFinalListeexpbis> + </APremierListeexp> + </AAppelfct> + </AAppelfctExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AEcritureInstr> + <AFinalListeinst> + <AEpsilon> + </AEpsilon> + </AFinalListeinst> + </ARecursifListeinst> + </AInstrbloc> + </ADecfonc> + <AFinalListedecfonc> + <AEpsilon> + </AEpsilon> + </AFinalListedecfonc> + </ARecursifListedecfonc> + </ARecursifListedecfonc> + </AProgramme> +</Start> diff --git a/test/sc-ref/si1.sc b/test/sc-ref/si1.sc new file mode 100644 index 0000000..f2146b7 --- /dev/null +++ b/test/sc-ref/si1.sc @@ -0,0 +1,74 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrsiInstr> + <ASanssinonInstrsi> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </ASanssinonInstrsi> + </AInstrsiInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/si2.sc b/test/sc-ref/si2.sc new file mode 100644 index 0000000..ac02bca --- /dev/null +++ b/test/sc-ref/si2.sc @@ -0,0 +1,100 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrsiInstr> + <AAvecsinonInstrsi> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + <AInstrsinon> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrsinon> + </AAvecsinonInstrsi> + </AInstrsiInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/si3.sc b/test/sc-ref/si3.sc new file mode 100644 index 0000000..d209790 --- /dev/null +++ b/test/sc-ref/si3.sc @@ -0,0 +1,120 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrsiInstr> + <AAvecsinonInstrsi> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + <AInstrsinon> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrsinon> + </AAvecsinonInstrsi> + </AInstrsiInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/si4.sc b/test/sc-ref/si4.sc new file mode 100644 index 0000000..d209790 --- /dev/null +++ b/test/sc-ref/si4.sc @@ -0,0 +1,120 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrsiInstr> + <AAvecsinonInstrsi> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + <AInstrsinon> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrsinon> + </AAvecsinonInstrsi> + </AInstrsiInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/si5.sc b/test/sc-ref/si5.sc new file mode 100644 index 0000000..63490b6 --- /dev/null +++ b/test/sc-ref/si5.sc @@ -0,0 +1,152 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrsiInstr> + <ASanssinonInstrsi> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrsiInstr> + <ASanssinonInstrsi> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </ASanssinonInstrsi> + </AInstrsiInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </ASanssinonInstrsi> + </AInstrsiInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/sub1.sc b/test/sc-ref/sub1.sc new file mode 100644 index 0000000..67c24ad --- /dev/null +++ b/test/sc-ref/sub1.sc @@ -0,0 +1,44 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AMoinsExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AMoinsExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/sub2.sc b/test/sc-ref/sub2.sc new file mode 100644 index 0000000..67c24ad --- /dev/null +++ b/test/sc-ref/sub2.sc @@ -0,0 +1,44 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AMoinsExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AMoinsExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/sub3.sc b/test/sc-ref/sub3.sc new file mode 100644 index 0000000..8cc3d2b --- /dev/null +++ b/test/sc-ref/sub3.sc @@ -0,0 +1,52 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AMoinsExp3> + <AMoinsExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AMoinsExp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AMoinsExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/tab1.sc b/test/sc-ref/tab1.sc new file mode 100644 index 0000000..566a603 --- /dev/null +++ b/test/sc-ref/tab1.sc @@ -0,0 +1,238 @@ +<Start> + <ADecvarldecfoncProgramme> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvartableauDecvar> + </ADecvartableauDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ADecvarldecfoncProgramme> +</Start> diff --git a/test/sc-ref/tab2.sc b/test/sc-ref/tab2.sc new file mode 100644 index 0000000..f0b76e5 --- /dev/null +++ b/test/sc-ref/tab2.sc @@ -0,0 +1,296 @@ +<Start> + <ADecvarldecfoncProgramme> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvartableauDecvar> + </ADecvartableauDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <ALdecfoncrecListedecfonc> + <ADecvarinstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </ADecvarinstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ADecvarldecfoncProgramme> +</Start> diff --git a/test/sc-ref/tab3.sc b/test/sc-ref/tab3.sc new file mode 100644 index 0000000..bc76393 --- /dev/null +++ b/test/sc-ref/tab3.sc @@ -0,0 +1,372 @@ +<Start> + <ADecvarldecfoncProgramme> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvartableauDecvar> + </ADecvartableauDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <ALdecfoncrecListedecfonc> + <ADecvarinstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AOptdecvar> + <ADecvarldecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + <ADecvarListedecvarbis> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvarbis> + </ADecvarldecvarListedecvar> + </AOptdecvar> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </ADecvarinstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ADecvarldecfoncProgramme> +</Start> diff --git a/test/sc-ref/tab4.sc b/test/sc-ref/tab4.sc new file mode 100644 index 0000000..b8a0b76 --- /dev/null +++ b/test/sc-ref/tab4.sc @@ -0,0 +1,278 @@ +<Start> + <ADecvarldecfoncProgramme> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvartableauDecvar> + </ADecvartableauDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVartabVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AVartabVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ADecvarldecfoncProgramme> +</Start> diff --git a/test/sc-ref/tantque1.sc b/test/sc-ref/tantque1.sc new file mode 100644 index 0000000..4f9e5eb --- /dev/null +++ b/test/sc-ref/tantque1.sc @@ -0,0 +1,168 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <ADecvarinstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrtantqueInstr> + <AInstrtantque> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AInfExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AInfExp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AMoinsExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AMoinsExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrtantque> + </AInstrtantqueInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </ADecvarinstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/tantque2.sc b/test/sc-ref/tantque2.sc new file mode 100644 index 0000000..bc41df0 --- /dev/null +++ b/test/sc-ref/tantque2.sc @@ -0,0 +1,278 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <ADecvarinstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AOptdecvar> + <ADecvarldecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + <ADecvarListedecvarbis> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvarbis> + </ADecvarldecvarListedecvar> + </AOptdecvar> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrtantqueInstr> + <AInstrtantque> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AInfExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AInfExp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrtantqueInstr> + <AInstrtantque> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AParenthesesExp6> + <AExp1Exp> + <AExp2Exp1> + <AInfExp2> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AInfExp2> + </AExp2Exp1> + </AExp1Exp> + </AParenthesesExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + <AInstrbloc> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrtantque> + </AInstrtantqueInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrtantque> + </AInstrtantqueInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </ADecvarinstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/varglob1.sc b/test/sc-ref/varglob1.sc new file mode 100644 index 0000000..919a434 --- /dev/null +++ b/test/sc-ref/varglob1.sc @@ -0,0 +1,66 @@ +<Start> + <ADecvarldecfoncProgramme> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ADecvarldecfoncProgramme> +</Start> diff --git a/test/sc-ref/varglob2.sc b/test/sc-ref/varglob2.sc new file mode 100644 index 0000000..96bbeca --- /dev/null +++ b/test/sc-ref/varglob2.sc @@ -0,0 +1,74 @@ +<Start> + <ADecvarldecfoncProgramme> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ADecvarldecfoncProgramme> +</Start> diff --git a/test/sc-ref/varglob3.sc b/test/sc-ref/varglob3.sc new file mode 100644 index 0000000..f4d5362 --- /dev/null +++ b/test/sc-ref/varglob3.sc @@ -0,0 +1,114 @@ +<Start> + <ADecvarldecfoncProgramme> + <AOptdecvar> + <ADecvarldecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + <ADecvarListedecvarbis> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvarbis> + </ADecvarldecvarListedecvar> + </AOptdecvar> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ADecvarldecfoncProgramme> +</Start> diff --git a/test/sc-ref/varglob4.sc b/test/sc-ref/varglob4.sc new file mode 100644 index 0000000..9cd9868 --- /dev/null +++ b/test/sc-ref/varglob4.sc @@ -0,0 +1,102 @@ +<Start> + <ADecvarldecfoncProgramme> + <AOptdecvar> + <ADecvarldecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + <ADecvarListedecvarbis> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvarbis> + </ADecvarldecvarListedecvar> + </AOptdecvar> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ADecvarldecfoncProgramme> +</Start> diff --git a/test/sc-ref/varloc1.sc b/test/sc-ref/varloc1.sc new file mode 100644 index 0000000..55761e9 --- /dev/null +++ b/test/sc-ref/varloc1.sc @@ -0,0 +1,66 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <ADecvarinstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </ADecvarinstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/varloc2.sc b/test/sc-ref/varloc2.sc new file mode 100644 index 0000000..87932be --- /dev/null +++ b/test/sc-ref/varloc2.sc @@ -0,0 +1,74 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <ADecvarinstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </ADecvarinstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/varloc3.sc b/test/sc-ref/varloc3.sc new file mode 100644 index 0000000..4d594da --- /dev/null +++ b/test/sc-ref/varloc3.sc @@ -0,0 +1,114 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <ADecvarinstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AOptdecvar> + <ADecvarldecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + <ADecvarListedecvarbis> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvarbis> + </ADecvarldecvarListedecvar> + </AOptdecvar> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </ADecvarinstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/varloc4.sc b/test/sc-ref/varloc4.sc new file mode 100644 index 0000000..e6e9d7d --- /dev/null +++ b/test/sc-ref/varloc4.sc @@ -0,0 +1,102 @@ +<Start> + <ALdecfoncProgramme> + <ALdecfoncrecListedecfonc> + <ADecvarinstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AOptdecvar> + <ADecvarldecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + <ADecvarListedecvarbis> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvarbis> + </ADecvarldecvarListedecvar> + </AOptdecvar> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <APlusExp3> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </APlusExp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </ADecvarinstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncProgramme> +</Start> diff --git a/test/sc-ref/varloc5.sc b/test/sc-ref/varloc5.sc new file mode 100644 index 0000000..92acf2b --- /dev/null +++ b/test/sc-ref/varloc5.sc @@ -0,0 +1,136 @@ +<Start> + <ADecvarldecfoncProgramme> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <ALdecfoncrecListedecfonc> + <ADecvarinstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AOptdecvar> + <ADecvarListedecvar> + <ADecvarentierDecvar> + </ADecvarentierDecvar> + </ADecvarListedecvar> + </AOptdecvar> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </ADecvarinstrDecfonc> + <ALdecfoncrecListedecfonc> + <AInstrDecfonc> + <ASansparamListeparam> + </ASansparamListeparam> + <AInstrbloc> + <ALinstrecListeinst> + <AInstraffectInstr> + <AInstraffect> + <AVarsimpleVar> + </AVarsimpleVar> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <ANombreExp6> + </ANombreExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstraffect> + </AInstraffectInstr> + <ALinstrecListeinst> + <AInstrappelInstr> + <AInstrappel> + <AAppelfct> + <AFinalListeexp> + </AFinalListeexp> + </AAppelfct> + </AInstrappel> + </AInstrappelInstr> + <ALinstrecListeinst> + <AInstrecritureInstr> + <AInstrecriture> + <AExp1Exp> + <AExp2Exp1> + <AExp3Exp2> + <AExp4Exp3> + <AExp5Exp4> + <AExp6Exp5> + <AVarExp6> + <AVarsimpleVar> + </AVarsimpleVar> + </AVarExp6> + </AExp6Exp5> + </AExp5Exp4> + </AExp4Exp3> + </AExp3Exp2> + </AExp2Exp1> + </AExp1Exp> + </AInstrecriture> + </AInstrecritureInstr> + <ALinstfinalListeinst> + </ALinstfinalListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </ALinstrecListeinst> + </AInstrbloc> + </AInstrDecfonc> + <ALdecfoncfinalListedecfonc> + </ALdecfoncfinalListedecfonc> + </ALdecfoncrecListedecfonc> + </ALdecfoncrecListedecfonc> + </ADecvarldecfoncProgramme> +</Start> diff --git a/test/ts-ref/add1.ts b/test/ts-ref/add1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/add1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/add2.ts b/test/ts-ref/add2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/add2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/affect1.ts b/test/ts-ref/affect1.ts new file mode 100644 index 0000000..f223443 --- /dev/null +++ b/test/ts-ref/affect1.ts @@ -0,0 +1,4 @@ +TABLE GLOBALE +a VAR entier 0 +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/affect2.ts b/test/ts-ref/affect2.ts new file mode 100644 index 0000000..53497cf --- /dev/null +++ b/test/ts-ref/affect2.ts @@ -0,0 +1,4 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main +a VAR entier 0 diff --git a/test/ts-ref/affect3.ts b/test/ts-ref/affect3.ts new file mode 100644 index 0000000..e4357a9 --- /dev/null +++ b/test/ts-ref/affect3.ts @@ -0,0 +1,7 @@ +TABLE GLOBALE +f FCT nul 1 +main FCT nul 0 +TABLE LOCALE : f +a PARAM entier 0 +TABLE LOCALE : main +a VAR entier 0 diff --git a/test/ts-ref/and1.ts b/test/ts-ref/and1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/and1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/and2.ts b/test/ts-ref/and2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/and2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/and3.ts b/test/ts-ref/and3.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/and3.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/and4.ts b/test/ts-ref/and4.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/and4.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/and5.ts b/test/ts-ref/and5.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/and5.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/appel-param1.ts b/test/ts-ref/appel-param1.ts new file mode 100644 index 0000000..cc61134 --- /dev/null +++ b/test/ts-ref/appel-param1.ts @@ -0,0 +1,6 @@ +TABLE GLOBALE +f FCT nul 1 +main FCT nul 0 +TABLE LOCALE : f +a PARAM entier 0 +TABLE LOCALE : main diff --git a/test/ts-ref/appel-param2.ts b/test/ts-ref/appel-param2.ts new file mode 100644 index 0000000..eced11b --- /dev/null +++ b/test/ts-ref/appel-param2.ts @@ -0,0 +1,7 @@ +TABLE GLOBALE +f FCT nul 2 +main FCT nul 0 +TABLE LOCALE : f +a PARAM entier 0 +b PARAM entier 4 +TABLE LOCALE : main diff --git a/test/ts-ref/appel-param3.ts b/test/ts-ref/appel-param3.ts new file mode 100644 index 0000000..c967f70 --- /dev/null +++ b/test/ts-ref/appel-param3.ts @@ -0,0 +1,10 @@ +TABLE GLOBALE +f FCT nul 5 +main FCT nul 0 +TABLE LOCALE : f +a PARAM entier 0 +b PARAM entier 4 +c PARAM entier 8 +d PARAM entier 12 +e PARAM entier 16 +TABLE LOCALE : main diff --git a/test/ts-ref/appel-retour1.ts b/test/ts-ref/appel-retour1.ts new file mode 100644 index 0000000..9b80e9a --- /dev/null +++ b/test/ts-ref/appel-retour1.ts @@ -0,0 +1,6 @@ +TABLE GLOBALE +f FCT entier 1 +main FCT nul 0 +TABLE LOCALE : f +a PARAM entier 0 +TABLE LOCALE : main diff --git a/test/ts-ref/appel1.ts b/test/ts-ref/appel1.ts new file mode 100644 index 0000000..0761e6d --- /dev/null +++ b/test/ts-ref/appel1.ts @@ -0,0 +1,5 @@ +TABLE GLOBALE +f FCT nul 0 +main FCT nul 0 +TABLE LOCALE : f +TABLE LOCALE : main diff --git a/test/ts-ref/appel2.ts b/test/ts-ref/appel2.ts new file mode 100644 index 0000000..9e966d9 --- /dev/null +++ b/test/ts-ref/appel2.ts @@ -0,0 +1,7 @@ +TABLE GLOBALE +f FCT nul 0 +g FCT nul 0 +main FCT nul 0 +TABLE LOCALE : f +TABLE LOCALE : g +TABLE LOCALE : main diff --git a/test/ts-ref/appel3.ts b/test/ts-ref/appel3.ts new file mode 100644 index 0000000..9e966d9 --- /dev/null +++ b/test/ts-ref/appel3.ts @@ -0,0 +1,7 @@ +TABLE GLOBALE +f FCT nul 0 +g FCT nul 0 +main FCT nul 0 +TABLE LOCALE : f +TABLE LOCALE : g +TABLE LOCALE : main diff --git a/test/ts-ref/div1.ts b/test/ts-ref/div1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/div1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/div2.ts b/test/ts-ref/div2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/div2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/div3.ts b/test/ts-ref/div3.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/div3.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/div4.ts b/test/ts-ref/div4.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/div4.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/ecrire1.ts b/test/ts-ref/ecrire1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/ecrire1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/ecrire2.ts b/test/ts-ref/ecrire2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/ecrire2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/egal1.ts b/test/ts-ref/egal1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/egal1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/egal2.ts b/test/ts-ref/egal2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/egal2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/egal3.ts b/test/ts-ref/egal3.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/egal3.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/err5.ts b/test/ts-ref/err5.ts new file mode 100644 index 0000000..f53ebb0 --- /dev/null +++ b/test/ts-ref/err5.ts @@ -0,0 +1,6 @@ +TABLE GLOBALE +f FCT 0 +main FCT 0 +TABLE LOCALE : f +TABLE LOCALE : main +f VAR 1 0 diff --git a/test/ts-ref/fibo.ts b/test/ts-ref/fibo.ts new file mode 100644 index 0000000..49fbafb --- /dev/null +++ b/test/ts-ref/fibo.ts @@ -0,0 +1,6 @@ +TABLE GLOBALE +fibo FCT entier 1 +main FCT nul 0 +TABLE LOCALE : fibo +n PARAM entier 0 +TABLE LOCALE : main diff --git a/test/ts-ref/inf1.ts b/test/ts-ref/inf1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/inf1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/inf2.ts b/test/ts-ref/inf2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/inf2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/inf3.ts b/test/ts-ref/inf3.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/inf3.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/inf4.ts b/test/ts-ref/inf4.ts new file mode 100644 index 0000000..4e8bb82 --- /dev/null +++ b/test/ts-ref/inf4.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT 0 +TABLE LOCALE : main diff --git a/test/ts-ref/modulo1.ts b/test/ts-ref/modulo1.ts new file mode 100644 index 0000000..4e8bb82 --- /dev/null +++ b/test/ts-ref/modulo1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT 0 +TABLE LOCALE : main diff --git a/test/ts-ref/mult1.ts b/test/ts-ref/mult1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/mult1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/mult2.ts b/test/ts-ref/mult2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/mult2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/mult3.ts b/test/ts-ref/mult3.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/mult3.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/not1.ts b/test/ts-ref/not1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/not1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/not2.ts b/test/ts-ref/not2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/not2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/not3.ts b/test/ts-ref/not3.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/not3.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/or1.ts b/test/ts-ref/or1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/or1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/or2.ts b/test/ts-ref/or2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/or2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/or3.ts b/test/ts-ref/or3.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/or3.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/or4.ts b/test/ts-ref/or4.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/or4.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/or5.ts b/test/ts-ref/or5.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/or5.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/parenth1.ts b/test/ts-ref/parenth1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/parenth1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/parenth2.ts b/test/ts-ref/parenth2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/parenth2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio23-1.ts b/test/ts-ref/prio23-1.ts new file mode 100644 index 0000000..4e8bb82 --- /dev/null +++ b/test/ts-ref/prio23-1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio23-2.ts b/test/ts-ref/prio23-2.ts new file mode 100644 index 0000000..4e8bb82 --- /dev/null +++ b/test/ts-ref/prio23-2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio23-3.ts b/test/ts-ref/prio23-3.ts new file mode 100644 index 0000000..4e8bb82 --- /dev/null +++ b/test/ts-ref/prio23-3.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio23-4.ts b/test/ts-ref/prio23-4.ts new file mode 100644 index 0000000..4e8bb82 --- /dev/null +++ b/test/ts-ref/prio23-4.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio34-1.ts b/test/ts-ref/prio34-1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/prio34-1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio34-2.ts b/test/ts-ref/prio34-2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/prio34-2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio34-3.ts b/test/ts-ref/prio34-3.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/prio34-3.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio34-4.ts b/test/ts-ref/prio34-4.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/prio34-4.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio45-1.ts b/test/ts-ref/prio45-1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/prio45-1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio45-2.ts b/test/ts-ref/prio45-2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/prio45-2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio45-3.ts b/test/ts-ref/prio45-3.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/prio45-3.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio45-4.ts b/test/ts-ref/prio45-4.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/prio45-4.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio56-1.ts b/test/ts-ref/prio56-1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/prio56-1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio56-2.ts b/test/ts-ref/prio56-2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/prio56-2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio67-1.ts b/test/ts-ref/prio67-1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/prio67-1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/prio67-2.ts b/test/ts-ref/prio67-2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/prio67-2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/rec1.ts b/test/ts-ref/rec1.ts new file mode 100644 index 0000000..9b80e9a --- /dev/null +++ b/test/ts-ref/rec1.ts @@ -0,0 +1,6 @@ +TABLE GLOBALE +f FCT entier 1 +main FCT nul 0 +TABLE LOCALE : f +a PARAM entier 0 +TABLE LOCALE : main diff --git a/test/ts-ref/si1.ts b/test/ts-ref/si1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/si1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/si2.ts b/test/ts-ref/si2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/si2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/si3.ts b/test/ts-ref/si3.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/si3.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/si4.ts b/test/ts-ref/si4.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/si4.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/si5.ts b/test/ts-ref/si5.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/si5.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/sub1.ts b/test/ts-ref/sub1.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/sub1.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/sub2.ts b/test/ts-ref/sub2.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/sub2.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/sub3.ts b/test/ts-ref/sub3.ts new file mode 100644 index 0000000..6b21c85 --- /dev/null +++ b/test/ts-ref/sub3.ts @@ -0,0 +1,3 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/tab1.ts b/test/ts-ref/tab1.ts new file mode 100644 index 0000000..1b4c646 --- /dev/null +++ b/test/ts-ref/tab1.ts @@ -0,0 +1,4 @@ +TABLE GLOBALE +tab TAB entier 0 3 +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/tab2.ts b/test/ts-ref/tab2.ts new file mode 100644 index 0000000..5a98869 --- /dev/null +++ b/test/ts-ref/tab2.ts @@ -0,0 +1,5 @@ +TABLE GLOBALE +tab TAB entier 0 5 +main FCT nul 0 +TABLE LOCALE : main +base VAR entier 0 diff --git a/test/ts-ref/tab3.ts b/test/ts-ref/tab3.ts new file mode 100644 index 0000000..f04742b --- /dev/null +++ b/test/ts-ref/tab3.ts @@ -0,0 +1,6 @@ +TABLE GLOBALE +tab TAB entier 0 5 +main FCT nul 0 +TABLE LOCALE : main +base VAR entier 0 +offset VAR entier 4 diff --git a/test/ts-ref/tab4.ts b/test/ts-ref/tab4.ts new file mode 100644 index 0000000..1b4c646 --- /dev/null +++ b/test/ts-ref/tab4.ts @@ -0,0 +1,4 @@ +TABLE GLOBALE +tab TAB entier 0 3 +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/tantque1.ts b/test/ts-ref/tantque1.ts new file mode 100644 index 0000000..53497cf --- /dev/null +++ b/test/ts-ref/tantque1.ts @@ -0,0 +1,4 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main +a VAR entier 0 diff --git a/test/ts-ref/tantque2.ts b/test/ts-ref/tantque2.ts new file mode 100644 index 0000000..1c4be04 --- /dev/null +++ b/test/ts-ref/tantque2.ts @@ -0,0 +1,5 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main +a VAR entier 0 +b VAR entier 4 diff --git a/test/ts-ref/tri.ts b/test/ts-ref/tri.ts new file mode 100644 index 0000000..d1113f4 --- /dev/null +++ b/test/ts-ref/tri.ts @@ -0,0 +1,21 @@ +TABLE GLOBALE +tab TAB entier 0 10 +afficher FCT nul 1 +echanger FCT nul 2 +initialiser FCT nul 0 +main FCT nul 0 +trier FCT nul 1 +TABLE LOCALE : afficher +i VAR entier 0 +n PARAM entier 0 +TABLE LOCALE : echanger +i PARAM entier 0 +j PARAM entier 4 +temp VAR entier 0 +TABLE LOCALE : initialiser +TABLE LOCALE : main +TABLE LOCALE : trier +echange VAR entier 0 +j VAR entier 4 +m VAR entier 8 +n PARAM entier 0 diff --git a/test/ts-ref/varglob1.ts b/test/ts-ref/varglob1.ts new file mode 100644 index 0000000..18438c4 --- /dev/null +++ b/test/ts-ref/varglob1.ts @@ -0,0 +1,4 @@ +TABLE GLOBALE +variable VAR entier 0 +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/varglob2.ts b/test/ts-ref/varglob2.ts new file mode 100644 index 0000000..18438c4 --- /dev/null +++ b/test/ts-ref/varglob2.ts @@ -0,0 +1,4 @@ +TABLE GLOBALE +variable VAR entier 0 +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/varglob3.ts b/test/ts-ref/varglob3.ts new file mode 100644 index 0000000..9095069 --- /dev/null +++ b/test/ts-ref/varglob3.ts @@ -0,0 +1,5 @@ +TABLE GLOBALE +var1 VAR entier 0 +var2 VAR entier 4 +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/varglob4.ts b/test/ts-ref/varglob4.ts new file mode 100644 index 0000000..9095069 --- /dev/null +++ b/test/ts-ref/varglob4.ts @@ -0,0 +1,5 @@ +TABLE GLOBALE +var1 VAR entier 0 +var2 VAR entier 4 +main FCT nul 0 +TABLE LOCALE : main diff --git a/test/ts-ref/varloc1.ts b/test/ts-ref/varloc1.ts new file mode 100644 index 0000000..43d6f3e --- /dev/null +++ b/test/ts-ref/varloc1.ts @@ -0,0 +1,4 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main +variable VAR entier 0 diff --git a/test/ts-ref/varloc2.ts b/test/ts-ref/varloc2.ts new file mode 100644 index 0000000..43d6f3e --- /dev/null +++ b/test/ts-ref/varloc2.ts @@ -0,0 +1,4 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main +variable VAR entier 0 diff --git a/test/ts-ref/varloc3.ts b/test/ts-ref/varloc3.ts new file mode 100644 index 0000000..1fcf021 --- /dev/null +++ b/test/ts-ref/varloc3.ts @@ -0,0 +1,5 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main +var1 VAR entier 0 +var2 VAR entier 4 diff --git a/test/ts-ref/varloc4.ts b/test/ts-ref/varloc4.ts new file mode 100644 index 0000000..1fcf021 --- /dev/null +++ b/test/ts-ref/varloc4.ts @@ -0,0 +1,5 @@ +TABLE GLOBALE +main FCT nul 0 +TABLE LOCALE : main +var1 VAR entier 0 +var2 VAR entier 4 diff --git a/test/ts-ref/varloc5.ts b/test/ts-ref/varloc5.ts new file mode 100644 index 0000000..dfa4f8a --- /dev/null +++ b/test/ts-ref/varloc5.ts @@ -0,0 +1,7 @@ +TABLE GLOBALE +var1 VAR entier 0 +f FCT nul 0 +main FCT nul 0 +TABLE LOCALE : f +var1 VAR entier 0 +TABLE LOCALE : main -- GitLab