コード例 #1
0
ファイル: RDParser.cs プロジェクト: Zenith89/FunWap
        /// <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));
            }
        }