コード例 #1
0
    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();
    }
コード例 #2
0
 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);
     }
 }
コード例 #3
0
    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;
    }
コード例 #4
0
ファイル: Stack.cs プロジェクト: ekowalsk/LOGO_Interpreter
 public void pushProcedure(ProcDecl procedure)
 {
     procedures[procedure.name] = procedure;
 }
コード例 #5
0
 public void visit(ProcDecl procDecl)
 {
     stack.pushProcedure(procDecl);
 }