public static IADNode statement() { var nextToken = MainFSM.PeekNextToken(); IADNode result = null; switch (nextToken.Type) { case TokenType.longType: var list = new ADVariableDeclarations(); StatementHelpers.VariableDeclaration(ref list); list.Variables.Reverse(); result = list; break; case TokenType.starType: result = new ADStatementExpression { Expression = PrecedenceSyntaxAnalysis.Precedence(TokenType.semiType) }; if (MainFSM.GetNextToken().Type != TokenType.semiType) { SyntaxError("Byl ocekavan znak \';\'"); } break; case TokenType.idType: case TokenType.incrType: case TokenType.decrType: if (MainFSM.PeekNextToken(2).Type == TokenType.leftRBType) { var fceToken = MainFSM.GetNextToken(); result = fce_call(fceToken.Attribute); if (MainFSM.GetNextToken().Type != TokenType.semiType) { SyntaxError("Byl ocekavan znak \';\'"); } } else { result = new ADStatementExpression { Expression = PrecedenceSyntaxAnalysis.Precedence(TokenType.semiType) }; if (MainFSM.GetNextToken().Type != TokenType.semiType) { SyntaxError("Byl ocekavan znak \';\'"); } } break; case TokenType.ifType: result = StatementHelpers.Condition(); break; case TokenType.forType: result = StatementHelpers.ForLoop(); break; case TokenType.whileType: result = StatementHelpers.WhileLoop(); break; case TokenType.doType: result = StatementHelpers.DoWhileLoop(); break; case TokenType.returnType: result = StatementHelpers.Return(); break; case TokenType.breakType: result = StatementHelpers.Break(); break; case TokenType.continueType: result = StatementHelpers.Continue(); break; case TokenType.leftCBType: result = StatementHelpers.InnerStatements(); break; default: SyntaxError("Byl ocekavan jeden z nasledujici klicovych slov nebo znaku: long, *, identifikator, if, for, while, do, return, break, continue"); break; } return(result); }
public static void PrintNode(IADNode node, string breakLabel = "", string continueLabel = "", string returnLabel = "", IADExpression forIncrement = null, string globalAssigns = "") { if (node is ADFunctionDeclaration) { Console.WriteLine($"# deklarace funkce {(node as ADFunctionDeclaration).Name}"); PrintFunctionDeclaration(node as ADFunctionDeclaration, globalAssigns); Console.WriteLine(); Console.WriteLine(); } else if (node is ADFunctionCall) { Console.WriteLine("# volani funkce"); Console.WriteLine(PrintFunctionCall(node as ADFunctionCall)); } else if (node is ADForLoop) { Console.WriteLine("# cykus for"); PrintForLoop(node as ADForLoop, returnLabel); } else if (node is ADWhileLoop) { Console.WriteLine("# cykus while"); PrintWhileLoop(node as ADWhileLoop, returnLabel); } else if (node is ADDoWhileLoop) { Console.WriteLine("# cykus do-while"); PrintDoWhileLoop(node as ADDoWhileLoop, returnLabel); } else if (node is ADStatementExpression) { Console.WriteLine(PrintExpression((node as ADStatementExpression).Expression)); } else if (node is ADCondition) { PrintCondition(node as ADCondition, breakLabel, continueLabel, returnLabel, forIncrement); } else if (node is ADBreak) { PrintBreak(breakLabel); } else if (node is ADContinue) { PrintContinue(continueLabel); } else if (node is ADInnerStatements) { foreach (var item in (node as ADInnerStatements).Statements) { PrintNode(item, breakLabel, continueLabel, returnLabel, forIncrement); } } else if (node is ADReturn) { Console.WriteLine(PrintExpression((node as ADReturn).Expression, false)); Console.WriteLine("movq %rdx, %rax"); Console.WriteLine($"jmp {returnLabel}"); } else if (node is ADArrayValue) { PrintArrayValue(node as ADArrayValue); } else if (node is ADVariableDeclarations) { foreach (var variable in (node as ADVariableDeclarations).Variables) { if (variable.Value != null && variable.Type != ADVariable.VarType.array) { Console.WriteLine($"# Prirazeni promenne {variable.Name}"); Console.WriteLine(PrintExpression(variable.Value)); Console.WriteLine($"movq %rdx, {variable.STRecord.Address}"); } } } }
public static void PrintNode(IADNode node, string tab) { if (node is ADDeclaration) { PrintDeclaration((ADDeclaration)node, tab); } else if (node is ADFunctionDeclaration) { PrintFunctionDeclaration((ADFunctionDeclaration)node, tab); } else if (node is ADVariableDeclarations) { PrintVariableDeclaration((ADVariableDeclarations)node, tab); } else if (node is ADForLoop) { PrintForLoop((ADForLoop)node, tab); } else if (node is ADWhileLoop) { PrintWhileLoop((ADWhileLoop)node, tab); } else if (node is ADDoWhileLoop) { PrintDoWhileLoop((ADDoWhileLoop)node, tab); } else if (node is ADCondition) { PrintCondition((ADCondition)node, tab); } else if (node is ADFunctionCall) { PrintFunctionCall((ADFunctionCall)node, tab); } else if (node is ADReturn) { PrintReturn((ADReturn)node, tab); } else if (node is ADContinue) { PrintContinue(tab); } else if (node is ADInnerStatements) { PrintInnerStatement((ADInnerStatements)node, tab); } else if (node is ADArrayValue) { PrintArrayValue((ADArrayValue)node, tab); } else if (node is ADSizeOfValue) { PrintSizeOf(tab); } else if (node is ADVariable) { PrintVariable((ADVariable)node, tab); } else if (node is ADVariableAssignment) { PrintVariableAssignment((ADVariableAssignment)node, tab); } else if (node is ADStatementExpression) { PrintStatementExpression((ADStatementExpression)node, tab); } else if (node is ADBreak) { PrintBreak(tab); } }