Пример #1
0
        private void CheckForStatement(ASTForStatementNode forNode)
        {
            //check counter
            if (forNode.Counter is ASTVariableNode varNode)
            {
                CheckVariable(varNode);
            }
            if (forNode.Counter is ASTAssignStatementNode assignNode)
            {
                CheckAssignStatement(assignNode);
            }
            //check condition
            CheckExpression(forNode.Condition);
            CheckImplicitCast(forNode.Condition, typeof(bool));

            //check step if his defined
            if (forNode.Step != null)
            {
                CheckExpression(forNode.Step);
                CheckImplicitCast(forNode.Step, typeof(decimal));
            }

            //checkbody
            if (forNode.Body != null)
            {
                _inLoop = true;
                CheckBody(forNode.Body);
                _inLoop = false;
            }
        }
Пример #2
0
        /// <summary>
        /// Builds for loop statement
        /// </summary>
        /// <param name="forNode">For loop node</param>
        private void BuildForStatement(ASTForStatementNode forNode)
        {
            var condition = _emitter.DefineLabel();
            var exitFor   = _emitter.DefineLabel();

            ASTVariableNode counter = null;

            //init counter if needed
            if (forNode.Counter is ASTAssignStatementNode assignNode)
            {
                BuildStatement(assignNode);
                counter = (ASTVariableNode)assignNode.Left;
            }
            else
            {
                counter = (ASTVariableNode)forNode.Counter;
            }
            //check condition
            _emitter.MarkLabel(condition);
            BuildExpression(forNode.Condition);
            _emitter.JumpFalse(exitFor);
            //body
            _loopsEnds.Push(exitFor);
            if (forNode.Body != null)
            {
                BuildStatement(forNode.Body);
            }
            _loopsEnds.Pop();

            //load counter
            BuildExpression(counter);
            _emitter.ToDecimal();
            //build step
            if (forNode.Step != null)
            {
                BuildExpression(forNode.Step);
                if (_emitter.StackPeek() != typeof(decimal))
                {
                    _emitter.ToDecimal();
                }
            }
            else //default step
            {
                _emitter.PushLong(1);
                _emitter.ToDecimal();
            }
            //update counter
            _emitter.StaticCall(typeof(decimal), "Add", new Type[] { typeof(decimal), typeof(decimal) });
            _emitter.Box();
            Store(counter.Name);
            //jump to condition
            _emitter.Jump(condition);
            //exit
            _emitter.MarkLabel(exitFor);
        }
Пример #3
0
        private void VisitForStatement(ASTForStatementNode forStmt)
        {
            if (forStmt.Counter is ASTVariableNode varNode)
            {
                VisitVariable(varNode);
            }

            if (forStmt.Counter is ASTAssignStatementNode assignStmt)
            {
                VisitAssignStatement(assignStmt);
            }

            if (forStmt.Body != null)
            {
                VisitBodyStatement(forStmt.Body);
            }
        }
Пример #4
0
        public override void ExitForStatement([NotNull] CmanParser.ForStatementContext context)
        {
            ASTBodyStatementNode body = null;
            IASTExprNode         step = null;
            IASTExprNode         cond = null;
            ASTNode         counter   = null;
            Queue <ASTNode> childs    = new Queue <ASTNode>();

            while (!(_nodes.Peek() is ASTForStatementNode))
            {
                childs.Enqueue(_nodes.Pop());
                //childs.Push(_nodes.Pop());
            }

            //has body
            if (childs.Peek() is ASTBodyStatementNode)
            {
                body = (ASTBodyStatementNode)childs.Dequeue();
            }
            int childCount = childs.Count();

            //counter, condition, step
            if (childCount == 3)
            {
                step = (IASTExprNode)childs.Dequeue();
            }
            cond    = (IASTExprNode)childs.Dequeue();
            counter = childs.Dequeue();

            ASTForStatementNode forNode = (ASTForStatementNode)_nodes.Peek();

            forNode.Counter   = counter;
            forNode.Condition = cond;
            forNode.Step      = step;
            forNode.Body      = body;
        }