Пример #1
0
        public static IADNode Condition()
        {
            MainFSM.GetNextToken();
            if (MainFSM.GetNextToken().Type != TokenType.leftRBType)
            {
                ParserFunctions.SyntaxError("Byl ocekavan znak \'(\'");
            }

            var result = new ADCondition();

            result.Condition = PrecedenceSyntaxAnalysis.Precedence(TokenType.rightRBType);
            MainFSM.GetNextToken();

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

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

            result.IfBody = ParserFunctions.statement_list();

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

            ParserFunctions.STablesStack.Pop();

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

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

                result.ElseBody = ParserFunctions.statement_list();

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

                ParserFunctions.STablesStack.Pop();

                return(result);
            }
        }
Пример #2
0
        public static void PrintCondition(ADCondition condition, string breakLabel = "", string continueLabel = "", string returnLabel = "", IADExpression forIncrement = null)
        {
            var endLabel  = GenerateLabel();
            var elseLabel = GenerateLabel();
            var bodyLabel = GenerateLabel();

            if (condition.ElseBody != null)
            {
                Console.WriteLine(PrintExpression(condition.Condition, false, false, elseLabel, bodyLabel));
                EvalCondition(elseLabel);
            }
            else
            {
                Console.WriteLine(PrintExpression(condition.Condition, false, false, endLabel, bodyLabel));
                EvalCondition(endLabel);
            }

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

            foreach (var item in condition.IfBody)
            {
                if (item is ADContinue && forIncrement != null)
                {
                    Console.WriteLine(PrintExpression(forIncrement));
                }
                PrintNode(item, breakLabel, continueLabel, returnLabel);
            }

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

            if (condition.ElseBody != null)
            {
                Console.WriteLine($"{elseLabel}:");

                foreach (var item in condition.ElseBody)
                {
                    if (item is ADBreak)
                    {
                        PrintBreak(breakLabel);
                    }
                    else
                    {
                        PrintNode(item, breakLabel, continueLabel, returnLabel);
                    }
                }
            }

            Console.WriteLine($"{endLabel}:");
        }
Пример #3
0
        public static void PrintCondition(ADCondition condition, string tab)
        {
            Console.WriteLine($"{tab}|- Condition:");

            Console.WriteLine($"{tab}\t If:");
            PrintExpression(condition.Condition, tab + "\t");

            if (condition.IfBody.Count() > 0)
            {
                foreach (var node in condition.IfBody)
                {
                    PrintNode(node, tab + "\t\t");
                }
            }

            if (condition.ElseBody != null && condition.ElseBody.Count() > 0)
            {
                Console.WriteLine($"{tab}\t Else:");
                foreach (var node in condition.ElseBody)
                {
                    PrintNode(node, tab + "\t\t");
                }
            }
        }