/// <summary> /// <rexpr>=<Bexpr> |fun “(“ <arglist>“)” <retType> <Statments> “;” /// </summary> /// <param name="pb"></param> /// <returns></returns> public Stmt ParseReturnStatement(ProcedureBuilder pb) { GetNext(); //return fun (x numeric)numeric{..... if (Current_Token == TOKEN.TOK_FUNCTION) { GetNext(); pb.InitClsr(); pb.clsoure.Name = pb.Name + "1"; ///////////////////now parse for parameters//////////////////////////// if (Current_Token != TOKEN.TOK_OPAREN) { return(null); } GetNext(); // remove ( //(a int)||() ArrayList lst_types = new ArrayList(); while (Current_Token == TOKEN.TOK_UNQUOTED_STRING) { SYMBOL_INFO inf = new SYMBOL_INFO(); inf.SymbolName = last_str; GetNext(); if (Current_Token == TOKEN.TOK_VAR_BOOL || Current_Token == TOKEN.TOK_VAR_NUMBER || Current_Token == TOKEN.TOK_VAR_STRING) { inf.Type = (Current_Token == TOKEN.TOK_VAR_BOOL) ? TYPE_INFO.TYPE_BOOL : (Current_Token == TOKEN.TOK_VAR_NUMBER) ? TYPE_INFO.TYPE_NUMERIC : TYPE_INFO.TYPE_STRING; } else { return(null); } lst_types.Add(inf.Type); pb.clsoure.AddFormals(inf); pb.clsoure.AddLocal(inf); GetNext(); if (Current_Token != TOKEN.TOK_COMMA) { break; } GetNext(); } if (Current_Token != TOKEN.TOK_CPAREN) { return(null); } GetNext(); //parse for return type (= number/bool/function) if (!(Current_Token == TOKEN.TOK_VAR_BOOL || Current_Token == TOKEN.TOK_VAR_NUMBER || Current_Token == TOKEN.TOK_VAR_STRING || Current_Token == TOKEN.TOK_FUNCTION)) { return(null); } ///-------- Assign the return type pb.clsoure.TYPE = (Current_Token == TOKEN.TOK_VAR_BOOL) ? TYPE_INFO.TYPE_BOOL : (Current_Token == TOKEN.TOK_VAR_NUMBER) ? TYPE_INFO.TYPE_NUMERIC : (Current_Token == TOKEN.TOK_FUNCTION) ?TYPE_INFO.TYPE_FUNCTION:TYPE_INFO.TYPE_STRING; //////////////////////////////////// GetNext(); if (Current_Token != TOKEN.TOK_OCBR) { return(null); } GetNext(); ////***********/******************************************** ///add statments ArrayList lst = StatementList(pb.clsoure); foreach (Stmt st in lst) { pb.clsoure.AddStatement(st); } //ClsrStmt: if (Current_Token != TOKEN.TOK_CCBR) { throw new Exception("} expected in the function"); } return(null); } else { Exp exp = BExpr(pb); if (Current_Token != TOKEN.TOK_SEMI) { throw new Exception(pb.Name + "; expected "); } pb.TypeCheck(exp); return(new ReturnStatement(exp)); } }