Beispiel #1
0
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;
}