예제 #1
0
 private void VisitBodyStatement(ASTBodyStatementNode bodyNode)
 {
     foreach (var s in bodyNode.Statements)
     {
         VisitStatement(s);
     }
 }
예제 #2
0
 /// <summary>
 /// Builds body statement
 /// </summary>
 /// <param name="bodyNode">Body statement node</param>
 private void BuildBodyStatement(ASTBodyStatementNode bodyNode)
 {
     foreach (var s in bodyNode.Statements)
     {
         BuildStatement(s);
     }
 }
예제 #3
0
        public override void ExitSubStatement([NotNull] CmanParser.SubStatementContext context)
        {
            ASTSubStatementNode  procNode;
            ASTBodyStatementNode bodyNode = null;

            if (_nodes.Peek() is ASTBodyStatementNode)
            {
                bodyNode = (ASTBodyStatementNode)_nodes.Pop();
            }
            if (_nodes.Peek() is ASTArgListNode argListNode)
            {
                _nodes.Pop();
                procNode         = (ASTSubStatementNode)_nodes.Pop();
                procNode.ArgList = argListNode;
            }
            else
            {
                procNode = (ASTSubStatementNode)_nodes.Pop();
            }
            if (bodyNode != null)
            {
                procNode.Body = bodyNode;
            }

            var compileUnitNode = (ASTCompileUnitNode)_nodes.Peek();

            compileUnitNode.AddProcedure(procNode);
        }
예제 #4
0
        public override void ExitIfStatement([NotNull] CmanParser.IfStatementContext context)
        {
            ASTBodyStatementNode elseBody  = null;
            ASTBodyStatementNode trueBody  = null;
            IASTExprNode         condition = null;

            if (_nodes.Peek() is ASTBodyStatementNode)
            {
                var tmp = _nodes.Pop();
                if (_nodes.Peek() is ASTBodyStatementNode)
                {
                    elseBody  = (ASTBodyStatementNode)tmp;
                    trueBody  = (ASTBodyStatementNode)_nodes.Pop();
                    condition = (IASTExprNode)_nodes.Pop();
                }
                else
                {
                    trueBody  = (ASTBodyStatementNode)tmp;
                    condition = (IASTExprNode)_nodes.Pop();
                }
            }
            else
            {
                condition = (IASTExprNode)_nodes.Pop();
                //((ASTIfStatementNode)_nodes.Peek()).Condition = condition;
            }
            //TODO: ifnode не привязывает к себе ноды
            var ifNode = (ASTIfStatementNode)_nodes.Peek();

            ifNode.Condition = condition;
            ifNode.TrueBody  = trueBody;
            ifNode.ElseBody  = elseBody;
            return;
        }
예제 #5
0
 private void CheckBody(ASTBodyStatementNode bodyNode)
 {
     foreach (var s in bodyNode.Statements)
     {
         CheckStatement(s);
     }
 }
예제 #6
0
        public override void ExitWhileStatement([NotNull] CmanParser.WhileStatementContext context)
        {
            ASTWhileStatementNode whileStmtNode;
            ASTBodyStatementNode  bodyNode = null;

            if (_nodes.Peek() is ASTBodyStatementNode)
            {
                bodyNode = (ASTBodyStatementNode)_nodes.Pop();
            }
            IASTExprNode condNode = (IASTExprNode)_nodes.Pop();

            whileStmtNode           = (ASTWhileStatementNode)_nodes.Peek();
            whileStmtNode.Body      = bodyNode;
            whileStmtNode.Condition = condNode;
        }
예제 #7
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;
        }