Skip to content

Commit

Permalink
Remplissage de la table des procédures dans Logo.g.
Browse files Browse the repository at this point in the history
Vérification qu'une variable locale ne surcharge pas un paramètre de procédure.

git-svn-id: http://ladystorm.bigmadarea.net/svn/nf11@39 1e871849-ca45-4617-b4d0-c39c463a1ac7
  • Loading branch information
jeremy committed Jun 1, 2010
1 parent 459bdd6 commit 6c87f3f
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 23 deletions.
2 changes: 1 addition & 1 deletion src/logogui/LogoFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ private void runParser() {
// tree walker
CommonTreeNodeStream nodes = new CommonTreeNodeStream(parseTree);
LogoTree treewalker = new LogoTree(nodes);
treewalker.initialize(getJLogoPane().getGraphics());
treewalker.initialize(getJLogoPane().getGraphics(), parser.getProcedures());
treewalker.prog();
}
} catch(Exception ex) {
Expand Down
45 changes: 40 additions & 5 deletions src/logoparsing/Logo.g
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,25 @@ tokens {
@header {
package logoparsing;
import java.util.TreeSet;
import java.util.TreeMap;
import logogui.Log;
}
@members {
boolean valide = true;
Procedure currentProcedure;
public boolean getValide(){
return valide;
}
public TreeMap<String,Procedure> getProcedures(){
return procedures;
}
private Procedure createProcedure(String procedureName) {
Procedure p = new Procedure(procedureName);
procedures.put(procedureName, p);
return p;
}
TreeSet<String> vars = new TreeSet<String>();
TreeSet<String> procedures = new TreeSet<String>();
TreeMap<String,Procedure> procedures = new TreeMap<String,Procedure>();
}
INT : ('0'..'9')+;
VRAI : 'VRAI'|'vrai';
Expand All @@ -76,7 +86,15 @@ instruction
| REPETE^ expr bloc
| TANTQUE^ exprBool bloc
| SI^ exprBool bloc bloc?
| LOCALE^ a = id_ecriture {vars.add($a.s);}
| LOCALE^ a = id_ecriture
{
if (currentProcedure.hasVar($a.s)) {
valide = false;
Log.appendnl("La variable "+$a.s+" est deja define en tant que parametre de la procedure "+currentProcedure.getName()+".");
} else {
vars.add($a.s);
}
}
| DONNE^ a = id_ecriture expr {vars.add($a.s);}
| ( AV^ | TD^ | TG^ | REC^ | FCAP^ ) expr
| FPOS^ '['! expr expr ']'!
Expand Down Expand Up @@ -127,9 +145,26 @@ ecris : ECRIS^ (chaine|expr)
| ECRIS id_lecture -> ^(ECRIS_VAR id_lecture)
;
procedure
: 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.");}}
@after {
currentProcedure = null;
}
: POUR a = ID {currentProcedure = createProcedure($a.getText());}
(':' b = ID
{
String varName = $b.getText();
currentProcedure.addVar(varName);
vars.add(varName);
}
)* liste_instructions FIN
-> ^(POUR ID ID* ^(BLOC liste_instructions))
;
exec : a = ID^
{
if (!procedures.containsKey($a.getText())) {
valide = false;
Log.appendnl("La procedure "+$a.getText()+" n'a pas ete declaree.");
}
}
((expr | id_lecture | chaine))*
;
ret : RET^ (expr|chaine)
Expand Down
31 changes: 15 additions & 16 deletions src/logoparsing/LogoTree.g
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,21 @@ options {
import logogui.Traceur;
import logogui.Log;
import java.util.HashMap;
import java.util.TreeMap;
import java.util.Map;
}
@members {
Traceur traceur;
int level = 0;
int compteur;
String procedureName;
Procedure currentProcedure;
String lastReturnValue;
HashMap<String,String> globalVars = new HashMap<String,String>();
TreeMap<String,Integer> procedures = new TreeMap<String,Integer>();
TreeMap<String,VarProcedureStorer> procedureVars = new TreeMap<String,VarProcedureStorer>();
Map<String,Procedure> procedures;

public void initialize(java.awt.Graphics g) {
public void initialize(java.awt.Graphics g, Map<String,Procedure> procedures) {
traceur = Traceur.getInstance();
traceur.setGraphics(g);
this.procedures = procedures;
}
public void push(int index) {
((CommonTreeNodeStream)input).push(index);
Expand Down Expand Up @@ -58,13 +58,12 @@ scope {
$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));
if (currentProcedure != null) {
for (String varName : currentProcedure.getVarNames()) {
$bloc::var.put(varName, currentProcedure.getValue(varName));
}

procedureName = null;
currentProcedure = null;
}
}
@after {
Expand Down Expand Up @@ -177,19 +176,19 @@ procedure
@init {
int mark_list = 0;
}
: ^(POUR a = ID {procedureName = $a.getText(); procedureVars.put(procedureName, new VarProcedureStorer());} arg_dec* {mark_list = input.mark();} . ) {procedures.put($a.getText(), mark_list);}
: ^(POUR a = ID arg_dec* {mark_list = input.mark();} . ) {procedures.get($a.getText()).setIndex(mark_list);}
;
arg_dec : a = ID {procedureVars.get(procedureName).addVar($a.getText());}
arg_dec : a = ID
;
exec returns [String r]
@init {
compteur = 1;
int mark_list = 0;
}
: ^(a = ID {procedureName = $a.getText();} arg_exec* {mark_list = input.mark();})
: ^(a = ID {currentProcedure = procedures.get($a.getText());} arg_exec* {mark_list = input.mark();})
{
push(mark_list);
push(procedures.get($a.getText()));
push(currentProcedure.getIndex());
bloc();
if (lastReturnValue == null) {
pop();
Expand All @@ -201,8 +200,8 @@ exec returns [String r]
pop();
}
;
arg_exec: x = expr {procedureVars.get(procedureName).initVar(compteur++, String.valueOf($x.v));}
| s = chaine {procedureVars.get(procedureName).initVar(compteur++, $s.s);}
arg_exec: x = expr {currentProcedure.initVar(compteur++, String.valueOf($x.v));}
| s = chaine {currentProcedure.initVar(compteur++, $s.s);}
;
ret : ^(RET
( x = expr {lastReturnValue = String.valueOf($x.v);}
Expand Down
24 changes: 23 additions & 1 deletion src/logoparsing/VarProcedureStorer.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,17 @@

import java.util.HashMap;

class VarProcedureStorer {
class Procedure {

private final HashMap<String,Integer> varNameMap = new HashMap<String,Integer>();
private final HashMap<Integer,String> indexMap = new HashMap<Integer,String>();
private int argCounter = 1;
private final String name;
private int index;

public Procedure(String name) {
this.name = name;
}

public void addVar(String varName) {
String value = "---";
Expand All @@ -29,4 +35,20 @@ public String getValue(String name) {
public Iterable<String> getVarNames() {
return varNameMap.keySet();
}

public boolean hasVar(String varName) {
return varNameMap.containsKey(varName);
}

public String getName() {
return name;
}

public int getIndex() {
return index;
}

public void setIndex(int index) {
this.index = index;
}
}

0 comments on commit 6c87f3f

Please sign in to comment.