diff --git a/src/c3a/Sa2c3a.java b/src/c3a/Sa2c3a.java index 36366481d18c6604eae8e392281ce0e3b120181d..eeaf5b3100b64d2f88c0e78c689d16b6bf20f2f1 100644 --- a/src/c3a/Sa2c3a.java +++ b/src/c3a/Sa2c3a.java @@ -176,10 +176,56 @@ public class Sa2c3a extends SaDepthFirstVisitor <C3aOperand> { @Override public C3aOperand visit(SaLDecVar node) throws Exception { defaultIn(node); + + + + + + defaultOut(node); return super.visit(node); } + @Override + public C3aOperand visit(SaIncr node) throws Exception { + defaultIn(node); + + C3aOperand var = node.getLhs().accept(this); + C3aOperand exp = node.getRhs().accept(this); + System.out.println(var); + System.out.println(exp); + C3aTemp temp = c3a.newTemp(); + + + c3a.ajouteInst(new C3aInstAdd(var, exp, temp, "")); + c3a.ajouteInst(new C3aInstAffect(temp, var, "")); + defaultOut(node); + + + + + defaultOut(node); + return null; + } + + @Override + public C3aOperand visit(SaExpModulo node) throws Exception { + defaultIn(node); + C3aOperand op1 = node.getOp1().accept(this); + C3aOperand op2 = node.getOp2().accept(this); + C3aOperand temp1 = c3a.newTemp(); + + + c3a.ajouteInst(new C3aInstDiv(op1, op2, temp1, "")); + C3aOperand temp2 = c3a.newTemp(); + c3a.ajouteInst(new C3aInstMult(op2, temp1, temp2, "")); + C3aOperand temp3 = c3a.newTemp(); + c3a.ajouteInst(new C3aInstSub(op1, temp2, temp3, "")); + + defaultOut(node); + return temp3; + } + @Override public C3aOperand visit(SaLDecFonc node) throws Exception { defaultIn(node); diff --git a/src/l.cfg b/src/l.cfg index bb5337165efb9de5a072b99353b8f29c7cd3c580..d673f053af639696082666b6d3cf2c8b62b68845 100644 --- a/src/l.cfg +++ b/src/l.cfg @@ -12,6 +12,7 @@ Tokens espaces = (' ' | 13 | 10)+; commentaire= '#' [[0 .. 0xffff] - [10 + 13]]* (10 | 13 | 10 13); add = '+'; +incr = '+='; sub = '-'; mult = '*'; div = '/'; @@ -30,6 +31,7 @@ gcro = '['; dcro = ']'; pvirg = ';'; virg = ','; +mod = '%'; si = 'si'; alors = 'alors'; sinon = 'sinon'; @@ -60,7 +62,7 @@ exp2 = {egal} exp2 egal exp3 | {inf} exp2 inf exp3 | {exp3} exp3; exp3 = {add} exp3 add exp4 | {sub} exp3 sub exp4 | {exp4} exp4; -exp4 = {mult} exp4 mult exp5 | {div} exp4 div exp5 | {exp5} exp5; +exp4 = {mult} exp4 mult exp5 | {div} exp4 div exp5 | {modulo} exp4 mod exp5 | {exp5} exp5; exp5 = {not} not exp5 | {exp6} exp6; @@ -68,6 +70,7 @@ exp6 = {parenthesis} gpar exp dpar | {nombre} nombre | {vrai} vrai | {faux} faux ins = {affectation} var egal exp pvirg| +{incrementation} var incr exp pvirg | {fairetantque} tantque exp faire bloc | {fonction} id gpar lexp dpar pvirg| {sialors} si exp alors bloc | diff --git a/src/sa.cfg b/src/sa.cfg index 60ff9b85148f3e6fe9b397212b275494b2853a94..142f147ef573426ca3fdf63fe0888335c6f46510 100644 --- a/src/sa.cfg +++ b/src/sa.cfg @@ -30,12 +30,14 @@ saexpinf = 'SaExpInf'; saexpint = 'SaExpInt'; saexplire = 'SaExpLire'; saexpmult = 'SaExpMult'; +saexpmodulo = 'SaExpModulo'; saexpnot = 'SaExpNot'; saexpor = 'SaExpOr'; saexpsub = 'SaExpSub'; saexpvar = 'SaExpVar'; saexpvrai = 'SaExpVrai'; sainstaffect = 'SaInstAffect'; +saincr= 'SaIncr'; sainstbloc = 'SaInstBloc'; sainstecriture = 'SaInstEcriture'; sainstretour = 'SaInstRetour'; @@ -73,6 +75,7 @@ exp = {add} po saexpadd [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 + | {modulo} po saexpmodulo [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 @@ -85,6 +88,7 @@ exp = {add} po saexpadd [op1]:exp [op2]:exp pf ; inst = {affect} po sainstaffect var exp pf + | {incr} po saincr var exp pf | {bloc} po sainstbloc linst pf | {ecriture} po sainstecriture exp pf | {retour} po sainstretour exp pf diff --git a/src/sa/LoadSa.java b/src/sa/LoadSa.java index 209de9c85c26193b813e1b9c8c4cdc4c544cf142..758a85184eeb8e9f242cdf15826a30c815e9de80 100644 --- a/src/sa/LoadSa.java +++ b/src/sa/LoadSa.java @@ -159,7 +159,20 @@ public class LoadSa extends DepthFirstAdapter { outAMultExp(node); } -// exp = {or} po saexpor [op1]:exp [op2]:exp pf + @Override + public void caseAModuloExp(AModuloExp node) + { + inAModuloExp(node); + node.getOp1().apply(this); + SaExp op1 = (SaExp) returnValue; + node.getOp2().apply(this); + SaExp op2 = (SaExp) returnValue; + returnValue = new SaExpModulo(op1,op2); + outAModuloExp(node); + } + + + // exp = {or} po saexpor [op1]:exp [op2]:exp pf @Override public void caseAOrExp(AOrExp node) { @@ -267,6 +280,20 @@ public class LoadSa extends DepthFirstAdapter { outAAffectInst(node); } + @Override + public void caseAIncrInst(AIncrInst node) + { + inAIncrInst(node); + node.getVar().apply(this); + SaVar var = (SaVar) returnValue; + node.getExp().apply(this); + SaExp exp = (SaExp) returnValue; + returnValue = new SaIncr(var, exp); + outAIncrInst(node); + } + + + // inst = {bloc} po sainstbloc linst pf @Override public void caseABlocInst(ABlocInst node) diff --git a/src/sa/SaDepthFirstVisitor.java b/src/sa/SaDepthFirstVisitor.java index d3820c5541e592a6f1bd6d1db5101842514513de..fb9886cc64e78b70ef68020bed19b0e434fd5684 100644 --- a/src/sa/SaDepthFirstVisitor.java +++ b/src/sa/SaDepthFirstVisitor.java @@ -148,17 +148,12 @@ public class SaDepthFirstVisitor <T> implements SaVisitor <T>{ 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); } - + if(node.getTete() != null)node.getTete().accept(this); + if(node.getQueue() != null) node.getQueue().accept(this); } defaultOut(node); return null; @@ -169,10 +164,8 @@ public class SaDepthFirstVisitor <T> implements SaVisitor <T>{ { 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); - } + if(node.getVariable() != null) node.getVariable().accept(this); + if(node.getCorps() != null) node.getCorps().accept(this); defaultOut(node); return null; } @@ -193,6 +186,15 @@ public class SaDepthFirstVisitor <T> implements SaVisitor <T>{ defaultOut(node); return null; } + + public T visit(SaIncr node) throws Exception + { + defaultIn(node); + node.getLhs().accept(this); + node.getRhs().accept(this); + defaultOut(node); + return null; + } // LDEC -> DEC LDEC // LDEC -> null @@ -267,16 +269,25 @@ public class SaDepthFirstVisitor <T> implements SaVisitor <T>{ } // 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; - } + public T visit(SaExpMult node) throws Exception + { + defaultIn(node); + node.getOp1().accept(this); + node.getOp2().accept(this); + defaultOut(node); + return null; + } + + public T visit(SaExpModulo node) throws Exception + { + defaultIn(node); + node.getOp1().accept(this); + node.getOp2().accept(this); + defaultOut(node); + return null; + } - // EXP -> div EXP EXP + // EXP -> div EXP EXP public T visit(SaExpDiv node) throws Exception { defaultIn(node); @@ -347,13 +358,10 @@ public class SaDepthFirstVisitor <T> implements SaVisitor <T>{ public T visit(SaInstBloc node) throws Exception { defaultIn(node); - if (node.getVal() != null) { - node.getVal().accept(this); - }defaultOut(node); + node.getVal().accept(this); + defaultOut(node); return null; } - - public T visit(SaInstSi node) throws Exception { diff --git a/src/sa/SaEval.java b/src/sa/SaEval.java index 7f284f643a86f4544da6a8969a6cf467cbb8d919..8bba44f7aed8331ffa50dd00a04fa3a375b01d63 100644 --- a/src/sa/SaEval.java +++ b/src/sa/SaEval.java @@ -23,9 +23,7 @@ public class SaEval extends SaDepthFirstVisitor <TypeVal> { try{ appelMain.accept(this); - } catch(Exception e){ - e.printStackTrace(); - } + } catch(Exception e){} } public TypeVal getVar(SaVarSimple saVar){ @@ -232,9 +230,9 @@ public class SaEval extends SaDepthFirstVisitor <TypeVal> { defaultOut(node); return null; } - - public TypeVal visit(SaInstAffect node) throws Exception - { + + 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 @@ -247,9 +245,24 @@ public class SaEval extends SaDepthFirstVisitor <TypeVal> { defaultOut(node); return null; - } - - // LDEC -> DEC LDEC + } + public TypeVal visit(SaIncr node) throws Exception + { + defaultIn(node); + TypeVal incr = 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, new TypeVal(getVarGlobIndicee(lhsIndicee, indice).valInt + incr.valInt)); + } else{ + setVar((SaVarSimple) node.getLhs(), new TypeVal(getVar((SaVarSimple) node.getLhs()).valInt + incr.valInt)); + } + defaultOut(node); + return null; + } + + // LDEC -> DEC LDEC // LDEC -> null /* public TypeVal visit(SaLDec node) throws Exception { @@ -335,16 +348,25 @@ public class SaEval extends SaDepthFirstVisitor <TypeVal> { } // EXP -> mult EXP EXP - public TypeVal visit(SaExpMult node) throws Exception - { + 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); - } + } + + public TypeVal visit(SaExpModulo 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 + // EXP -> div EXP EXP public TypeVal visit(SaExpDiv node) throws Exception { defaultIn(node); diff --git a/src/sa/SaVisitor.java b/src/sa/SaVisitor.java index 3d28bb7870f422fa6caa7a50066a819b40fa6c11..962d2f2b69c3ec037014c81c29cfae4580d16adc 100644 --- a/src/sa/SaVisitor.java +++ b/src/sa/SaVisitor.java @@ -28,6 +28,7 @@ interface SaVisitor <T> { public T visit(SaExpAdd node) throws Exception; public T visit(SaExpSub node) throws Exception; public T visit(SaExpMult node) throws Exception; + public T visit(SaExpModulo node) throws Exception; public T visit(SaExpDiv node) throws Exception; public T visit(SaExpInf node) throws Exception; public T visit(SaExpEqual node) throws Exception; @@ -35,4 +36,6 @@ interface SaVisitor <T> { public T visit(SaExpOr node) throws Exception; public T visit(SaExpNot node) throws Exception; public T visit(SaLExp node) throws Exception; + public T visit(SaIncr node) throws Exception; + } diff --git a/src/sa/Sc2sa.java b/src/sa/Sc2sa.java index 90bdf6016c23104362a0a82ee25ff91ee354eadb..4cdb24bdd5bb4e37131226a3ad36367be5e62f7f 100644 --- a/src/sa/Sc2sa.java +++ b/src/sa/Sc2sa.java @@ -607,5 +607,32 @@ public class Sc2sa extends DepthFirstAdapter this.returnValue = null; outAEpsilon(node); } + + @Override + public void caseAIncrementationIns(AIncrementationIns node) { + inAIncrementationIns(node); + SaVar lhs = null; + SaExp rhs = null; + node.getVar().apply(this); + lhs = (SaVar) this.returnValue; + node.getExp().apply(this); + rhs = (SaExp) this.returnValue; + this.returnValue = new SaIncr(lhs, rhs); + outAIncrementationIns(node); + } + + @Override + public void caseAModuloExp4(AModuloExp4 node) { + inAModuloExp4(node); + SaExp op1 = null; + SaExp op2 = null; + node.getExp4().apply(this); + op1 = (SaExp) this.returnValue; + node.getExp5().apply(this); + op2 = (SaExp) this.returnValue; + this.returnValue = new SaExpModulo(op1, op2); + outAModuloExp4(node); + + } }