diff --git a/src/logoparsing/Logo.g b/src/logoparsing/Logo.g index 4297f24..61a019f 100644 --- a/src/logoparsing/Logo.g +++ b/src/logoparsing/Logo.g @@ -40,6 +40,7 @@ tokens { COS = 'COS'; POUR = 'POUR'; FIN = 'FIN'; + CHAINE; } @lexer::header { package logoparsing; @@ -113,6 +114,8 @@ atomBool: VRAI | expr ((CMP_EGAL^|CMP_SUP^|CMP_INF^|CMP_SUP_EGAL^|CMP_INF_EGAL^) expr)? | '('! exprBool ')'! ; +chaine : '"' ID -> ^(CHAINE ID) + ; id_lecture : ':'! a = ID { if (!vars.contains($a.getText())) {valide = false; Log.appendnl("La variable "+$a.getText()+" n'a pas ete declaree.");}} ; @@ -120,7 +123,8 @@ id_ecriture returns [String s] : '"'! a = ID {$s = $a.getText();} ; procedure - : POUR a = ID id_lecture* {procedures.add($a.getText());} liste_instructions FIN -> ^(POUR ID id_lecture* ^(BLOC liste_instructions)) + : POUR a = ID (':' b = ID {vars.add($b.getText());})* {procedures.add($a.getText());} liste_instructions FIN -> ^(POUR ID ID* ^(BLOC liste_instructions)) ; -exec : a = ID { if (!procedures.contains($a.getText())) {valide = false; Log.appendnl("La procedure "+$a.getText()+" n'a pas ete declaree.");}} +exec : a = ID^ { if (!procedures.contains($a.getText())) {valide = false; Log.appendnl("La procedure "+$a.getText()+" n'a pas ete declaree.");}} + ((expr | id_lecture | chaine))* ; diff --git a/src/logoparsing/LogoTree.g b/src/logoparsing/LogoTree.g index dd74e1f..9adcf06 100644 --- a/src/logoparsing/LogoTree.g +++ b/src/logoparsing/LogoTree.g @@ -13,8 +13,11 @@ options { @members { Traceur traceur; int level = 0; + int compteur; + String procedureName; HashMap globalVars = new HashMap(); TreeMap procedures = new TreeMap(); + TreeMap procedureVars = new TreeMap(); public void initialize(java.awt.Graphics g) { traceur = Traceur.getInstance(); @@ -53,6 +56,15 @@ scope { @init { $bloc::var = new HashMap(); level++; + + if (procedureName != null) { + VarProcedureStorer s = procedureVars.get(procedureName); + for (String varName : s.getVarNames()) { + $bloc::var.put(varName, s.getValue(varName)); + } + + procedureName = null; + } } @after { level--; @@ -108,6 +120,9 @@ exprBool returns [boolean v] | VRAI {$v = true;} | FAUX {$v = false;} ; +chaine returns [String s] + : ^(CHAINE a = ID) {s = $a.getText();} + ; repete @init { int mark_list = 0; @@ -156,13 +171,22 @@ procedure @init { int mark_list = 0; } - : ^(POUR a = ID ID* {mark_list = input.mark();} . ) {procedures.put($a.getText(), mark_list);} + : ^(POUR a = ID {procedureName = $a.getText(); procedureVars.put(procedureName, new VarProcedureStorer());} arg_dec* {mark_list = input.mark();} . ) {procedures.put($a.getText(), mark_list);} + ; +arg_dec : a = ID {procedureVars.get(procedureName).addVar($a.getText());} ; -exec : a = ID +exec +@init { + compteur = 1; +} + : ^(a = ID {procedureName = $a.getText();} arg_exec*) { int mark_list = procedures.get($a.getText()); push(mark_list); bloc(); pop(); } - ; \ No newline at end of file + ; +arg_exec: x = expr {procedureVars.get(procedureName).initVar(compteur++, String.valueOf($x.v));} + | s = chaine {procedureVars.get(procedureName).initVar(compteur++, $s.s);} + ; diff --git a/src/logoparsing/VarProcedureStorer.java b/src/logoparsing/VarProcedureStorer.java new file mode 100644 index 0000000..ad221c4 --- /dev/null +++ b/src/logoparsing/VarProcedureStorer.java @@ -0,0 +1,32 @@ +package logoparsing; + +import java.util.HashMap; + +class VarProcedureStorer { + + private final HashMap varNameMap = new HashMap(); + private final HashMap indexMap = new HashMap(); + private int argCounter = 1; + + public void addVar(String varName) { + String value = "---"; + + varNameMap.put(varName, argCounter); + indexMap.put(argCounter, value); + + argCounter++; + } + + public void initVar(int index, String value) { + indexMap.put(index, value); + } + + public String getValue(String name) { + int index = varNameMap.get(name); + return indexMap.get(index); + } + + public Iterable getVarNames() { + return varNameMap.keySet(); + } +}