ParsingResult Parser::ParseInstruction(InstructionBlock& body, TokIterator& it) { ParsingResult io_res = ParseIOInstr(body, it); if(io_res != NOT_MATCHED) { return io_res; } ParsingResult contr_flow_res = ParseControlFlowInstr(body, it); if(contr_flow_res != NOT_MATCHED) { return contr_flow_res; } ParsingResult assign_res = ParseAssignment(body, it); if(assign_res != NOT_MATCHED) { return assign_res; } FuncCallCreator func_call_creator; ParsingResult func_res = ParseFuncCallHeader(func_call_creator, it); if(func_res != NOT_MATCHED) { if(func_res == INCORRECT) { return INCORRECT; } body.AddInstruction(PtrVisitable(new FuncCall(func_call_creator.Create()))); return CORRECT; } ParsingResult return_expr_res = ParseReturnExpr(body, it); if(return_expr_res != NOT_MATCHED) { return return_expr_res; } return NOT_MATCHED; }
/* localexpression * ::= assignment | returnexpr * */ static shared_ptr<ExprAST> ParseLocalExpression() { if (CurTok == T_RETURN) return ParseReturnExpr(); if (CurTok == T_IDENTIFIER) return ParseAssignmentExpr(); if (CurTok == T_WHILE) return ParseWhileExpr(); if (CurTok == T_IF) return ParseIfExpr(); return 0; }