Skip to content

Commit

Permalink
Procédures avec paramètres OK.
Browse files Browse the repository at this point in the history
git-svn-id: http://ladystorm.bigmadarea.net/svn/nf11@33 1e871849-ca45-4617-b4d0-c39c463a1ac7
  • Loading branch information
jeremy committed May 26, 2010
1 parent 02ecac2 commit a8eec49
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 5 deletions.
8 changes: 6 additions & 2 deletions src/logoparsing/Logo.g
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ tokens {
COS = 'COS';
POUR = 'POUR';
FIN = 'FIN';
CHAINE;
}
@lexer::header {
package logoparsing;
Expand Down Expand Up @@ -113,14 +114,17 @@ 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.");}}
;
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))*
;
30 changes: 27 additions & 3 deletions src/logoparsing/LogoTree.g
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,11 @@ options {
@members {
Traceur traceur;
int level = 0;
int compteur;
String procedureName;
HashMap<String,String> globalVars = new HashMap<String,String>();
TreeMap<String,Integer> procedures = new TreeMap<String,Integer>();
TreeMap<String,VarProcedureStorer> procedureVars = new TreeMap<String,VarProcedureStorer>();

public void initialize(java.awt.Graphics g) {
traceur = Traceur.getInstance();
Expand Down Expand Up @@ -53,6 +56,15 @@ scope {
@init {
$bloc::var = new HashMap<String,String>();
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--;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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();
}
;
;
arg_exec: x = expr {procedureVars.get(procedureName).initVar(compteur++, String.valueOf($x.v));}
| s = chaine {procedureVars.get(procedureName).initVar(compteur++, $s.s);}
;
32 changes: 32 additions & 0 deletions src/logoparsing/VarProcedureStorer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package logoparsing;

import java.util.HashMap;

class VarProcedureStorer {

private final HashMap<String,Integer> varNameMap = new HashMap<String,Integer>();
private final HashMap<Integer,String> indexMap = new HashMap<Integer,String>();
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<String> getVarNames() {
return varNameMap.keySet();
}
}

0 comments on commit a8eec49

Please sign in to comment.