package org.uva.sea.ql.checker; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.uva.sea.ql.ast.form.Form; import org.uva.sea.ql.ast.stmt.AnswerableQuestion; import org.uva.sea.ql.ast.stmt.Block; import org.uva.sea.ql.ast.stmt.ComputedQuestion; import org.uva.sea.ql.ast.stmt.IfThenElseStatement; import org.uva.sea.ql.ast.stmt.IfThenStatement; import org.uva.sea.ql.ast.stmt.Question; import org.uva.sea.ql.ast.stmt.Stmt; import org.uva.sea.ql.ast.type.Type; import org.uva.sea.ql.checker.visitor.IStmtVisitor; public class SymbolCollector implements IStmtVisitor { private Map<String, List<Type>> symbolTable; public SymbolCollector(){ symbolTable = new HashMap<String, List<Type>>(); } public Map<String, List<Type>> getSymbolTable(Form form){ form.getBlock().accept(this); return symbolTable; } public Map<String, Type> getSingleTypeSymbolsTable(){ Map<String, Type> singleSymbolTable = new HashMap<String, Type>(); for(Map.Entry<String, List<Type>> entry : symbolTable.entrySet()){ singleSymbolTable.put(entry.getKey(), entry.getValue().get(0)); } return singleSymbolTable; } @Override public void visit(AnswerableQuestion stmt) { addSymbol(stmt); } @Override public void visit(ComputedQuestion stmt) { addSymbol(stmt); } @Override public void visit(IfThenStatement stmt) { stmt.getBody().accept(this); } @Override public void visit(IfThenElseStatement stmt) { stmt.getBody().accept(this); stmt.getElseBlock().accept(this); } @Override public void visit(Block stmt) { for(Stmt s:stmt.getStatements()){ s.accept(this); } } private void addSymbol(Question q){ String ident = q.getIdent().getName(); List<Type> types; if(symbolTable.containsKey(ident)){ types = symbolTable.get(ident); }else{ types = new ArrayList<Type>(); } types.add(q.getType()); symbolTable.put(ident, types); } }