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); }
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}:"); }
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"); } } }