Beispiel #1
0
        private IList <Node> evalIfStatement(Node node, ActivationFrame frame, Interpreter callback)
        {
            IList <Node> instructionList = node.Instructions;
            int          size            = instructionList.Count;


            IList <Node> trueExpressions = new List <Node>();
            BooleanNode  booleanNode     = getBooleanExpressionNode(instructionList, size, trueExpressions);

            if (booleanNode != null && booleanNode.Instructions.Count == 1)
            {
                FinalNode finalNode = (FinalNode)booleanNode.Instructions[0];
                if (finalNode.IntegralType == IntegralType.jboolean)
                {
                    bool? @bool = Convert.ToBoolean(finalNode.dataString());
                    if (@bool)
                    {
                        return(trueExpressions);
                    }
                }
            }
            else if (booleanNode != null && booleanNode.Instructions.Count > 0)
            {
                Node currentValue = frame.popNode();
                frame.pushReturnNode(null);
                bool?booleanResult = false;
                evalBooleanNode(booleanNode, frame, callback);

                if (frame.peekReturnNode() != null && frame.peekReturnNode() is BooleanNode)
                {
                    Node      booleanEvalReturnNode = frame.popNode();
                    FinalNode result = getFinalNodeFromAnyNode(booleanEvalReturnNode);
                    booleanResult = Convert.ToBoolean(result.dataString());
                }

                // TODO - FINISH THIS
                if (booleanResult && frame.peekReturnNode() != null)
                {
                    Node returnNode = frame.popNode();
                    if (returnNode is BreakExprNode)
                    {
                        IList <Node> returnList = new List <Node>();
                        returnList.Add(returnNode);
                        return(new List <>());
                    }
                }

                frame.pushReturnNode(currentValue);
            }

            return(new List <>());
        }
Beispiel #2
0
        private IList <Node> evaluateAggregate(Node node, ActivationFrame frame, Interpreter callback)
        {
            SummationType summationType = (SummationType)node.Instructions[0];
            IList <Node>  list          = node.Instructions;

            int size = list.Count;
            int sum  = 0;

            IList <VariableNode> listOfVariableNodes = new List <VariableNode>();

            for (int i = 1; i < size; i++)
            {
                if (node.Instructions[i] is VariableNode)
                {
                    listOfVariableNodes.Add((VariableNode)node.Instructions[i]);
                }
                else
                {
                    string value = ((FinalNode)list[i].Instructions[0]).dataString();
                    sum += Convert.ToInt32(value);
                }
            }

            if (listOfVariableNodes.Count > 0)
            {
                sum += aggregateVariable(listOfVariableNodes, frame);
            }

            FinalNode returnNode = new FinalNode();

            returnNode.DataString = sum;
            frame.pushReturnNode(returnNode);

            return(new List <>());
        }
Beispiel #3
0
 private IList <Node> evaluateBreak(Node node, ActivationFrame frame)
 {
     frame.pushReturnNode(node);
     return(new List <>());
 }