Example #1
0
        private VisitResult VisitFunctionCall(ASTFunctionCall functionCall)
        {
            var symbolFunction   = functionCall.SymbolFunction;
            var functionName     = functionCall.FunctionName;
            var formalParameters = symbolFunction.Parameters;
            var actualParameters = functionCall.ActualParameters;

            var activationRecord = new ActivationRecord(functionName, ActivationRecordType.Function, symbolFunction.ScopeLevel + 1);

            for (var i = 0; i < formalParameters.Count; ++i)
            {
                activationRecord[formalParameters[i].Name] = Visit(actualParameters[i]).Value;
            }

            Logger.Debug($"Enter {functionName}");
            _callStack.Push(activationRecord);

            var result = symbolFunction is SymbolBuiltinFunction?BuiltinFunctionCall(functionCall) : Visit(symbolFunction.Body);

            var returnedValue = result != null ? result.Value : "null";

            if (returnedValue is List <dynamic> collection)
            {
                returnedValue = collection.ToPrint();
            }

            Logger.DebugMemory($"Leave {functionName}, returned value ({returnedValue})");
            Logger.DebugMemory(_callStack.ToString());

            _callStack.Pop();

            return(result);
        }
Example #2
0
        /// <summary>
        /// create an activation record for node
        /// </summary>
        /// <typeparam name="T">node type</typeparam>
        /// <param name="node">a node in the graph</param>
        /// <param name="getFanouts">function to return fanouts of a node</param>
        /// <returns>an activation record</returns>
        private static ActivationRecord <T> AllocateActivationRecord <T>(T node, Func <T, IEnumerable <T> > getFanouts)
        {
            // very first time - init
            var children = getFanouts(node).ToList();
            var info     = new ActivationRecord <T>(node, children);

            return(info);
        }
Example #3
0
        public IContext Activate()
        {
            var r = new ActivationRecord {
                Context = this, OldValue = property.Getter()
            };

            stack.Push(r);
            property.Setter(value);
            return(this);
        }
Example #4
0
        private dynamic VisitProgram(ASTProgram program)
        {
            Logger.Debug("Enter Program");
            var activationRecord = new ActivationRecord("Main", ActivationRecordType.Program, 1);

            _callStack.Push(activationRecord);

            var runParameters = new List <ASTNode>();
            var mainFunction  = new ASTFunctionCall(program.Token, "Main", runParameters);

            mainFunction.SymbolFunction = program.MainFunction;

            var result = Visit(mainFunction);

            Logger.DebugMemory("Leave Program");
            Logger.DebugMemory(_callStack.ToString());

            _callStack.Pop();

            Logger.Debug($"Program exited with status code {result?.Value ?? "null"}");

            return(result);
        }