Пример #1
0
        public static IADNode ForLoop()
        {
            MainFSM.GetNextToken();

            if (MainFSM.GetNextToken().Type != TokenType.leftRBType)
            {
                ParserFunctions.SyntaxError("Byl ocekavan znak \'(\'");
            }

            var result = new ADForLoop();

            if (MainFSM.PeekNextToken().Type != TokenType.semiType)
            {
                result.DeclarationPart = PrecedenceSyntaxAnalysis.Precedence(TokenType.semiType);
            }

            if (MainFSM.GetNextToken().Type != TokenType.semiType)
            {
                ParserFunctions.SyntaxError("Byl ocekavan znak \';\'");
            }

            if (MainFSM.PeekNextToken().Type != TokenType.semiType)
            {
                result.ConditionPart = PrecedenceSyntaxAnalysis.Precedence(TokenType.semiType);
            }

            if (MainFSM.GetNextToken().Type != TokenType.semiType)
            {
                ParserFunctions.SyntaxError("Byl ocekavan znak \';\'");
            }

            if (MainFSM.PeekNextToken().Type != TokenType.rightRBType)
            {
                result.IncrementalPart = PrecedenceSyntaxAnalysis.Precedence(TokenType.rightRBType);
            }

            if (MainFSM.GetNextToken().Type != TokenType.rightRBType)
            {
                ParserFunctions.SyntaxError("Byl ocekavan znak \')\'");
            }

            if (MainFSM.GetNextToken().Type != TokenType.leftCBType)
            {
                ParserFunctions.SyntaxError("Byl ocekavan znak \'{\'");
            }

            ParserFunctions.STablesStack.Push(new STable());

            result.Body = ParserFunctions.statement_list();

            if (MainFSM.GetNextToken().Type != TokenType.rightCBType)
            {
                ParserFunctions.SyntaxError("Byl ocekavan znak \'}\'");
            }

            ParserFunctions.STablesStack.Pop();

            return(result);
        }
Пример #2
0
        public static void PrintForLoop(ADForLoop forLoop, string returnLabel)
        {
            if (forLoop.DeclarationPart != null)
            {
                Console.WriteLine("# deklaracni cast");
                Console.WriteLine(PrintExpression(forLoop.DeclarationPart));
            }

            var condLabel = GenerateLabel();
            var endLabel  = GenerateLabel();

            Console.WriteLine($"{condLabel}:");

            if (forLoop.ConditionPart != null)
            {
                Console.WriteLine("# podminkova cast");
                Console.WriteLine(PrintExpression(forLoop.ConditionPart));


                Console.WriteLine("# Vyhodnoceni podminky");
                EvalCondition(endLabel);
            }

            Console.WriteLine("# telo cyklu for");
            foreach (var item in forLoop.Body)
            {
                if (item is ADContinue)
                {
                    Console.WriteLine(PrintExpression(forLoop.IncrementalPart));
                }

                PrintNode(item, endLabel, condLabel, returnLabel, forLoop.IncrementalPart);
            }

            if (forLoop.IncrementalPart != null)
            {
                Console.WriteLine("# inkrementacni cast");
                Console.WriteLine(PrintExpression(forLoop.IncrementalPart));
            }

            Console.WriteLine($"jmp {condLabel}");

            Console.WriteLine($"{endLabel}:");
        }
Пример #3
0
        public static void PrintForLoop(ADForLoop loop, string tab)
        {
            Console.WriteLine($"{tab}|- For loop");
            Console.WriteLine($"{tab}|\t Initial:");
            PrintExpression(loop.DeclarationPart, tab + "\t\t");

            Console.WriteLine($"{tab}|\t Condition:");
            PrintExpression(loop.ConditionPart, tab + "\t\t");

            Console.WriteLine($"{tab}|\t Increment:");
            PrintExpression(loop.IncrementalPart, tab + "\t\t");

            if (loop.Body.Count() > 0)
            {
                Console.WriteLine($"{tab}|\t Body:");
                foreach (var node in loop.Body)
                {
                    PrintNode(node, tab + "\t\t");
                }
            }
        }