コード例 #1
0
ファイル: ReturnStatement.cs プロジェクト: Wotingfengyu12/11
        //	Create as much of the parse tree as possible.
        public override int CreateParseSubTree(ref CLexicalAnalyzer plexAnal, ref CSymbolTable pSymbolTable)
        {
            CToken pToken = null;
            //try
            {
                //Munch a <return>
                if ((CLexicalAnalyzer.LEX_FAIL == plexAnal.GetNextToken(ref pToken, ref pSymbolTable)) ||
                    !pToken.IsRETURNStatement())
                {
                    //throw (C_UM_ERROR_INTERNALERR);
                }
                //Munch a <;>
                if ((CLexicalAnalyzer.LEX_FAIL == plexAnal.GetNextToken(ref pToken, ref pSymbolTable)) ||
                    pToken.GetSubType() == RUL_TOKEN_SUBTYPE.RUL_SEMICOLON)   //Anil Octobet 5 2005 for handling Method Calling Method
                {
                    //throw(C_UM_ERROR_INTERNALERR)//Commented by anil
                    //this is the case of Void return so no need to parse the futher satement
                    m_pExpression = null;//Anil Octobet 5 2005 for handling Method Calling Method
                    return(1);
                }
                plexAnal.UnGetToken();

                //Added Anil Octobet 5 2005 for handling Method Calling Method
                //Return statement may be a Expression So Do Parse those Expression and Push it on to m_pExpression
                CExpParser expParser = new CExpParser();
                //try
                {
                    m_pExpression = expParser.ParseExpression(ref plexAnal, ref pSymbolTable, STMT_EXPR_TYPE.EXPR_ASSIGN);

                    if (m_pExpression == null)
                    {
                        //throw (C_AP_ERROR_MISSINGEXP);
                    }
                }

                /*
                 *              catch (CRIDEError* perr)
                 *              {
                 *                      pvecErrors.push_back(perr);
                 *                      plexAnal.SynchronizeTo(EXPRESSION, pSymbolTable);
                 *              }
                 */
                return(1);
            }

            /*
             *          catch (CRIDEError* perr)
             *          {
             *                  pvecErrors.push_back(perr);
             *                  plexAnal.SynchronizeTo(EXPRESSION, pSymbolTable);
             *          }
             *          catch (...)
             *          {
             *                  throw (C_UM_ERROR_UNKNOWNERROR);
             *          }
             *          return PARSE_FAIL;
             */
        }