@Override public void visit(Param visitor) { SymTab symtab = new SymTab(); Declaration dec = new Declaration(); dec.id = visitor.getIdent(); dec.type = visitor.getTipo(); dec.fila = visitor.fila; st.set(dec); for (int i = 0; i < st.scopes.size(); i++) { symtab.scopes.add(i, st.scopes.get(i)); } visitor.alcance = symtab.scopes; }
// TODO Revisar las variables solo dentro del alcance @Override public void visit(ExprVar visitor) { Declaration decl = new Declaration(); decl.id = visitor.getIdent(); decl.fila = visitor.fila; int scope = st.searchDeclaration(decl.id); if (scope == SymTab.INVALID_SCOPE) { System.out.println( "Error Semantico en fila " + decl.fila + ", la variable " + decl.id + " no ha sido declarada"); } }
@Override public void visit(var_declaration visitor) { SymTab symtab = new SymTab(); Declaration dec = new Declaration(); dec.id = visitor.getIdent(); dec.type = visitor.getTipo(); dec.fila = visitor.fila; if (dec.type == "void") { System.out.println("Error Semantico, una variable no puede ser de tipo VOID"); } else { st.set(dec); for (int i = 0; i < st.scopes.size(); i++) { symtab.scopes.add(i, st.scopes.get(i)); } visitor.alcance = symtab.scopes; } }
@Override public void visit(fun_declaration visitor) { SymTab symtab = new SymTab(); FunctionDeclaration fd = new FunctionDeclaration(); fd.id = visitor.getIdent(); fd.params = visitor.getChilds(); while (st.scopes.size() > SymTab.FUNCTION_SCOPE) { st.closeScope(); } Declaration dec = new Declaration(); dec.id = visitor.getIdent(); dec.type = visitor.getTipo(); dec.fila = visitor.fila; dec.setKind(visitor.getKind()); dec.params = fd.params; st.newScope(); // Se aumenta al alcance referente a las funciones st.set(dec); st.FunctionList.add(fd); for (int i = 0; i < st.scopes.size(); i++) { symtab.scopes.add(i, st.scopes.get(i)); } visitor.alcance = symtab.scopes; }