Example #1
0
 public Interpreter(AstNode code)
 {
     this.code = code;
     foreach (Dictionary<string, InternalFunction> entries in getFunctions())
         foreach (KeyValuePair<string, InternalFunction> entry in entries)
             Variables.Add(entry.Key, entry.Value);
 }
Example #2
0
        private object evaluateNode(AstNode node)
        {
            if (node is IdentifierNode)
            {
                IdentifierNode idNode = (IdentifierNode)node;
                if (Variables.ContainsKey(idNode.Identifier.ToUpper()))
                    return Variables[idNode.Identifier.ToUpper()];
                throw new Exception("Variable " + idNode.Identifier.ToUpper() + " does not exist in dictionary!");
            }
            else if (node is FunctionCallNode)
            {
                FunctionCallNode fnode = (FunctionCallNode)node;
                IFunction target = evaluateNode(fnode.Target) as IFunction;
                if (target == null)
                    throw new Exception("Attempt to run a non-valid function!");
                object[] arguments = new object[fnode.Arguments.Children.Count];
                for (int x = 0; x < fnode.Arguments.Children.Count; x++)
                    arguments[x] = evaluateNode(fnode.Arguments.Children[x]);
                return target.Invoke(arguments);
            }
            else if (node is NumberNode)
                return ((NumberNode)node).Value;
            else if (node is StringNode)
                return ((StringNode)node).Value;
            else if (node is BinaryOpNode)
                return interpretBinaryOperation((BinaryOpNode)node);
            else if (node is LetNode)
            {
                LetNode lnode = (LetNode)node;
                string variable = ((IdentifierNode)lnode.Variable).Identifier;
                object data = evaluateNode(lnode.Data);
                if (Variables.ContainsKey(variable.ToUpper()))
                    throw new Exception("Variable " + variable.ToUpper() + " already has been declared!");
                Variables.Add(variable.ToUpper(), data);

                return data;
            }
            else
                throw new Exception("Unknown node " + node.ToString() + "  " + node.GetType());
        }
Example #3
0
 public void Interpret(AstNode code)
 {
     this.code = code;
     Interpret();
 }
Example #4
0
        private void executeStatement(AstNode node)
        {
            if (node is CodeBlockNode)
                foreach (AstNode cnode in node.Children)
                    executeStatement(cnode);
            else if (node is ConditionalNode)
            {
                ConditionalNode cnode = (ConditionalNode)node;
                bool evaluates = (bool)evaluateNode(cnode.Predicate);
                if (evaluates)
                    executeStatement(cnode.Body);
                else if (!evaluates && cnode.Children.Count > 2)
                    executeStatement(cnode.ElseBody);
            }
            else if (node is NumberNode)
            {
                string name = ((NumberNode)node).Value.ToString();
                if (Labels.ContainsKey(name))
                    Labels.Remove(name);
                Labels.Add(name, position);
            }
            else if (node is WhileNode)
            {
                WhileNode wnode = (WhileNode)node;
                while ((bool)evaluateNode(wnode.Predicate))
                    executeStatement(wnode.Body);
            }
            else if (node is LabelNode)
            {
                string label = ((LabelNode)node).Label;
                if (Labels.ContainsKey(label))
                    Labels.Remove(label);

                Labels.Add(label, position);
            }
            else if (node is GotoNode)
                position = Labels[((GotoNode)node).Position];
            else if (node is PrintNode)
                Console.WriteLine(evaluateNode(((PrintNode)node).Value));
            else if (node is InputNode)
            {
                string variable = ((IdentifierNode)((InputNode)node).Variable).Identifier;
                if (Variables.ContainsKey(variable))
                    Variables.Remove(variable);

                Variables.Add(variable, Console.ReadLine());
            }
            else if (node is EndNode)
            {
                EndNode enode = (EndNode)node;
                if (enode.Children.Count <= 0)
                    Environment.Exit(0);

                Environment.Exit(enode.ExitCode);
            }
            else if (node is ClsNode)
                Console.Clear();
            else if (node is PauseNode)
            {
                Console.WriteLine(((PauseNode)node).Message);
                Console.ReadKey(true);
            }
            else
                evaluateNode(node);
        }