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