Ejemplo n.º 1
0
 private void Run()
 {
     while (ExecutionStack.Count > 0)
     {
         var objectBase = ExecutionStack.Pop();
         if (objectBase is ExecutableName executableName)
         {
             if (!DictionaryStack.ContainsKey(executableName.Value))
             {
                 throw new Exception("Command not found");
             }
             ExecutionStack.Push(DictionaryStack[executableName.Value]);
         }
         else if (objectBase is OperandObject operandObject)
         {
             operandObject.Value();
         }
         else if (objectBase is ProcedureObject procedureObject)
         {
             foreach (var item in procedureObject.Value)
             {
                 ExecutionStack.Push(item);
             }
         }
         else
         {
             OperandStack.Push(objectBase);
         }
     }
 }
        public void Swap(Component c)
        {
            var operatorA = OperandStack.Pop();
            var operatorB = OperandStack.Pop();

            OperandStack.Push(operatorA);
            OperandStack.Push(operatorB);
        }
        public void ChangeSign(Component c)
        {
            var operatorA = OperandStack.Pop();

            operatorA.Value = operatorA.Value * -1;

            OperandStack.Push(operatorA);
        }
        public void Div(Component c)
        {
            var operatorA = OperandStack.Pop();
            var operatorB = OperandStack.Pop();
            var result    = operatorA.Value / operatorB.Value;

            OperandStack.Push(new Operand(result));
        }
Ejemplo n.º 5
0
        public override void Execute(VMThread thread, byte[] byteCode, Frame frame)
        {
            //操作数栈
            OperandStack operandStack = frame.OperandStack;

            //操作数栈顶存入0
            operandStack.PushInt(0);
        }
        private static void Evaluate(ExpressionTreeNode node, OperandStack operandStack, IBackingStore backingStore)
        {
            var token = node.Token;

            if (token.TokenType == TokenType.Operand)
            {
                operandStack.Push((IOperand)token);
            }
            else
            {
                var op = ((OperatorWrapper)token).WrappedOperator;
                if (op.ShortCircuit == ShortCircuitMode.LogicalAnd)
                {
                    Evaluate(node.Children[1], operandStack, backingStore);

                    var thing = OperatorActions.PeekAndResolve(operandStack, backingStore);

                    if ((bool)thing.GetValue() == false)
                    {
                        // The operator has done its work, discard it.
                        operandStack.Pop();
                        operandStack.Push(new Operand(OperandType.Bool, false));
                        return;
                    }
                    else
                    {
                        Evaluate(node.Children[0], operandStack, backingStore);
                    }
                }
                else if (op.ShortCircuit == ShortCircuitMode.LogicalOr)
                {
                    Evaluate(node.Children[1], operandStack, backingStore);

                    var thing = OperatorActions.PeekAndResolve(operandStack, backingStore);

                    if ((bool)thing.GetValue() == true)
                    {
                        // The operator has done its work, discard it.
                        operandStack.Pop();
                        operandStack.Push(new Operand(OperandType.Bool, true));
                        return;
                    }
                    else
                    {
                        Evaluate(node.Children[0], operandStack, backingStore);
                    }
                }
                else
                {
                    // TODO: Build it backwards so we can just foreach here.
                    for (int c = node.Children.Count - 1; c >= 0; c--)
                    {
                        Evaluate(node.Children[c], operandStack, backingStore);
                    }
                }
                op.DoOperation(operandStack, backingStore, token.ParserPosition);
            }
        }
        public static OperandStack Evaluate(ExpressionTree tree, IBackingStore backingStore)
        {
            var operandStack = new OperandStack();

            for (int c = tree.RootNodeList.Count - 1; c >= 0; c--)
            {
                Evaluate(tree.RootNodeList[c], operandStack, backingStore);
            }

            return(operandStack);
        }
Ejemplo n.º 8
0
        public override void Execute(VMThread thread, byte[] byteCode, Frame frame)
        {
            //操作数栈
            OperandStack operandStack = frame.OperandStack;
            //局部变量表
            LocalVarsTable localVarsTable = frame.LocalVars;
            //弹出操作数栈顶元素
            int val = operandStack.PopInt();

            //存入局部变量表0号位置
            localVarsTable.PutInt(0, val);
        }
Ejemplo n.º 9
0
        public override void Execute(VMThread thread, byte[] byteCode, Frame frame)
        {
            //操作数栈
            OperandStack operandStack = frame.OperandStack;
            //局部变量表
            LocalVarsTable localVarsTable = frame.LocalVars;
            //取局部变量
            Slot value = localVarsTable.Get(0);

            //入操作数栈
            operandStack.PushObjectRef(value.ObjectRef);
        }
        public void Sin(Component obj)
        {
            var    operatorA = OperandStack.Pop();
            double angle     = operatorA.Value;

            if (RAD == false)
            {
                angle = angle * Math.PI / 180;
            }
            operatorA.Value = Inverse ? Math.Asin(angle) : Math.Sin(angle);

            OperandStack.Push(operatorA);
        }
        public Calculator()
        {
            OperandStack = new OperandStack();
            OperandStack.Push(new Operand(0));
            OperandStack.Push(new Operand(0));
            OperandStack.Push(new Operand(0));
            OperandStack.Push(new Operand(0));

            Registers = new List <string>();
            for (int i = 0; i < 10; i++)
            {
                Registers.Add("0");
            }

            Inverse = RAD = false;
        }
        public List <Operand> GetLastFour()
        {
            var list = new List <Operand>();

            for (int i = 0; i <= 3; i++)
            {
                list.Add(OperandStack.Pop());
            }

            for (int i = 3; i >= 0; i--)
            {
                OperandStack.Push(list[i]);
            }

            return(list);
        }
        public static OperandStack Evaluate(IEnumerable <IToken> rpnTokens, IBackingStore backingStore)
        {
            var operandStack = new OperandStack();

            foreach (IToken token in rpnTokens)
            {
                if (token.TokenType == TokenType.Operand)
                {
                    operandStack.Push((IOperand)token);
                }
                else
                {
                    ((OperatorWrapper)token).WrappedOperator.DoOperation(operandStack, backingStore, token.ParserPosition);
                }
            }
            return(operandStack);
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Process a single operand
        /// </summary>
        /// <param name="op"></param>
        private void ExecuteInternal(Operand op)
        {
            if (op.IsExecutable && (procedureCreationLevel == 0 || op.AlwaysExecute))
            {
#if DUMP
                TraceAll(op, "exec");
#endif

                op.Execute(this);
            }
            else
            {
#if DUMP
                TraceAll(op, "push");
#endif

                OperandStack.Push(op.Copy());
            }
        }
        public static OperandStack Evaluate(IEnumerable <IToken> rpnTokens, IBackingStore backingStore)
        {
            var tree         = new ExpressionTree(rpnTokens);
            var operandStack = new OperandStack();

            foreach (var node in tree.RootNodeList)
            {
                Evaluate(node, operandStack, backingStore);
            }

            var resultStack = new OperandStack();

            while (operandStack.Count != 0)
            {
                resultStack.Push(operandStack.Pop());
            }

            return(resultStack);
        }
 public void Enter(Component c)
 {
     OperandStack.Push((Operand)c);
 }
 public void Drop(Component c)
 {
     var operatorA = OperandStack.Pop();
 }
Ejemplo n.º 18
0
        public override void Execute(VMThread thread, byte[] byteCode, Frame frame)
        {
            OperandStack operandStack = frame.OperandStack;

            operandStack.PushObjectRef(null);
        }
Ejemplo n.º 19
0
        private void Parser_OnToken(TokenType tokenType, string value)
        {
            _log.AppendLine($"{tokenType} - {value}");

            try
            {
                if (tokenType == TokenType.Real)
                {
                    OperandStack.Push(new NumericalObject(double.Parse(value)));
                }
                else if (tokenType == TokenType.Integer)
                {
                    OperandStack.Push(new NumericalObject(double.Parse(value)));
                }
                else if (tokenType == TokenType.Name)
                {
                    if (value.StartsWith("//"))
                    {
                        var name = value.Substring(2);
                        if (!DictionaryStack.ContainsKey(name))
                        {
                            throw new Exception($"Key '{name}' not found in DictionaryStack.");
                        }
                        OperandStack.Push(DictionaryStack[name]);
                    }
                    else if (value.StartsWith("/"))
                    {
                        var name = value.Substring(1);
                        OperandStack.Push(new LiteralName(name));
                    }
                    else
                    {
                        OperandStack.Push(new ExecutableName(value));
                    }
                }
                else if (tokenType == TokenType.BeginProcedure)
                {
                    _procedureCount++;
                    OperandStack.Push(new SymbolObject(SymbolEnum.Procedure));
                }
                else if (tokenType == TokenType.EndProcedure)
                {
                    var items = new List <ObjectBase>();
                    while (true)
                    {
                        var currentOperand = OperandStack.Pop();
                        if (currentOperand is SymbolObject symbolObject)
                        {
                            if (symbolObject.Value != SymbolEnum.Procedure)
                            {
                                throw new Exception("Unexpected symbol type");
                            }
                            break;
                        }
                        items.Add(currentOperand);
                    }
                    OperandStack.Push(new ProcedureObject(items.ToArray()));
                    _procedureCount--;
                }
                else if (tokenType == TokenType.BeginArray)
                {
                    OperandStack.Push(new SymbolObject(SymbolEnum.Array));
                }
                else if (tokenType == TokenType.EndArray)
                {
                    var items = new List <ObjectBase>();
                    while (true)
                    {
                        var currentOperand = OperandStack.Pop();
                        if (currentOperand is SymbolObject symbolObject)
                        {
                            if (symbolObject.Value != SymbolEnum.Array)
                            {
                                throw new Exception("Unexpected symbol type");
                            }
                            break;
                        }
                        items.Add(currentOperand);
                    }
                    OperandStack.Push(new ArrayObject(items.ToArray()));
                }
                else if (tokenType == TokenType.BeginDictionary)
                {
                    OperandStack.Push(new SymbolObject(SymbolEnum.Dictionary));
                }
                else if (tokenType == TokenType.EndDictionary)
                {
                    var items = new Dictionary <LiteralName, ObjectBase>();
                    while (true)
                    {
                        var currentOperand = OperandStack.Pop();
                        if (currentOperand is SymbolObject symbolObject)
                        {
                            if (symbolObject.Value != SymbolEnum.Array)
                            {
                                throw new Exception("Unexpected symbol type");
                            }
                            break;
                        }
                        var literal = OperandStack.Pop() as LiteralName;
                        items.Add(literal, currentOperand);
                    }
                    OperandStack.Push(new DictionaryObject(items));
                }

                if (ShouldRun(OperandStack.Top()))
                {
                    ExecutionStack.Push(OperandStack.Pop());
                    Run();
                }
            }
            catch (Exception ex)
            {
                _log.AppendLine($"Exception: {ex}");
                throw;
            }
        }
Ejemplo n.º 20
0
        public Dictionary <string, OperandObject> CreateSystemDictionary()
        {
            var systemDictionary = new Dictionary <string, OperandObject>();

            systemDictionary.Add("gt", new OperandObject(() =>
            {
                var second = OperandStack.Pop() as NumericalObject;
                var first  = OperandStack.Pop() as NumericalObject;
                OperandStack.Push(new BooleanObject(first.Value > second.Value));
            }));

            systemDictionary.Add("ifelse", new OperandObject(() =>
            {
                var third  = OperandStack.Pop() as ProcedureObject;
                var second = OperandStack.Pop() as ProcedureObject;
                var first  = OperandStack.Pop() as BooleanObject;
                ExecutionStack.Push(first.Value ? second : third);
            }));

            systemDictionary.Add("pop", new OperandObject(() =>
            {
                OperandStack.Pop();
            }));

            systemDictionary.Add("exch", new OperandObject(() =>
            {
                var second = OperandStack.Pop();
                var first  = OperandStack.Pop();
                OperandStack.Push(second);
                OperandStack.Push(first);
            }));

            systemDictionary.Add("dup", new OperandObject(() =>
            {
                OperandStack.Push(OperandStack.Top());
            }));

            systemDictionary.Add("copy", new OperandObject(() =>
            {
                var count   = OperandStack.Pop() as NumericalObject;
                var objects = OperandStack.Pop((int)count.Value);
                objects     = objects.Reverse().ToArray();
                OperandStack.Push(objects);
                OperandStack.Push(objects);
                //TODO not accurate to spec
            }));

            systemDictionary.Add("clear", new OperandObject(() =>
            {
                OperandStack.Clear();
            }));

            systemDictionary.Add("count", new OperandObject(() =>
            {
                var item = new NumericalObject(OperandStack.Count);
                OperandStack.Push(item);
            }));

            systemDictionary.Add("def", new OperandObject(() =>
            {
                var first  = OperandStack.Pop() as ProcedureObject;
                var second = OperandStack.Pop() as LiteralName;

                if (DictionaryStack.ContainsKey(second.Value))
                {
                    DictionaryStack[second.Value] = first;
                }
                else
                {
                    DictionaryStack.Add(second.Value, first);
                }
            }));

            systemDictionary.Add("add", new OperandObject(() =>
            {
                var first  = OperandStack.Pop() as NumericalObject;
                var second = OperandStack.Pop() as NumericalObject;
                var result = second.Value + first.Value;
                OperandStack.Push(new NumericalObject(result));
            }));

            systemDictionary.Add("div", new OperandObject(() =>
            {
                var first  = OperandStack.Pop() as NumericalObject;
                var second = OperandStack.Pop() as NumericalObject;
                var result = second.Value / first.Value;
                OperandStack.Push(new NumericalObject(result));
            }));

            systemDictionary.Add("idiv", new OperandObject(() =>
            {
                var first  = OperandStack.Pop() as NumericalObject;
                var second = OperandStack.Pop() as NumericalObject;
                var result = (long)second.Value / (long)first.Value;
                OperandStack.Push(new NumericalObject(result));
            }));

            systemDictionary.Add("mod", new OperandObject(() =>
            {
                var first  = OperandStack.Pop() as NumericalObject;
                var second = OperandStack.Pop() as NumericalObject;
                var result = second.Value % first.Value;
                OperandStack.Push(new NumericalObject(result));
            }));

            systemDictionary.Add("mul", new OperandObject(() =>
            {
                var first  = OperandStack.Pop() as NumericalObject;
                var second = OperandStack.Pop() as NumericalObject;
                var result = second.Value * first.Value;
                OperandStack.Push(new NumericalObject(result));
            }));

            systemDictionary.Add("sub", new OperandObject(() =>
            {
                var first  = OperandStack.Pop() as NumericalObject;
                var second = OperandStack.Pop() as NumericalObject;
                var result = second.Value + first.Value;
                OperandStack.Push(new NumericalObject(result));
            }));

            systemDictionary.Add("abs", new OperandObject(() =>
            {
                var first  = OperandStack.Pop() as NumericalObject;
                var result = Math.Abs(first.Value);
                OperandStack.Push(new NumericalObject(result));
            }));

            systemDictionary.Add("neg", new OperandObject(() =>
            {
                var first  = OperandStack.Pop() as NumericalObject;
                var result = -first.Value;
                OperandStack.Push(new NumericalObject(result));
            }));

            return(systemDictionary);
        }