public void visit(ProcCall procCall) { if (stack.level >= Dictionary.MAX_NEST_LEVEL) { throw new Exception(Dictionary.max_nest_level_exc); } if (!stack.containsProcedure(procCall.procName)) { throw new Exception("Don't know how to " + procCall.procName); } ProcDecl returnedProcedure = stack.getProcedure(procCall.procName); if (procCall.arguments.Count != returnedProcedure.parameters.Count) { throw new Exception("Arguments number mismatch in " + procCall.procName); } stack.levelUp(); pushParams(returnedProcedure, procCall); procCall.output = returnedProcedure; foreach (IAST child in procCall.output.children) { child.accept(this); } stack.clearParams(); stack.levelDown(); }
private void pushParams(ProcDecl declaration, ProcCall call) { for (int i = 0; i < declaration.parameters.Count; i++) { call.arguments[i].accept(this); stack.pushLocal(declaration.parameters[i].varNode.name, call.arguments[i].output); } }
public void visit(ProcDecl procDecl) { if (scope.scopeLevel == Dictionary.MAX_NEST_LEVEL) { throw new Exception(Dictionary.max_nest_level_exc); } ProcedureSymbol procSym = new ProcedureSymbol(procDecl.name); scope.define(procSym); scope = new ScopeSymbolTable(scope.scopeLevel + 1, scope); foreach (Param param in procDecl.parameters) { VarSymbol paramSymbol = createParamSymbol(param); scope.define(paramSymbol); procSym.parameters.Add(paramSymbol); } foreach (IAST child in procDecl.children) { child.accept(this); } scope = scope.globalScope; }
public void pushProcedure(ProcDecl procedure) { procedures[procedure.name] = procedure; }
public void visit(ProcDecl procDecl) { stack.pushProcedure(procDecl); }