// 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 <SWITCH> if ((CLexicalAnalyzer.LEX_FAIL == plexAnal.GetNextToken(ref pToken, ref pSymbolTable)) || pToken == null || (pToken.GetSubType() != RUL_TOKEN_SUBTYPE.RUL_SWITCH)) { //throw (C_UM_ERROR_INTERNALERR); } //Munch a <(> if ((CLexicalAnalyzer.LEX_FAIL == plexAnal.GetNextToken(ref pToken, ref pSymbolTable)) || pToken == null || (pToken.GetSubType() != RUL_TOKEN_SUBTYPE.RUL_LPAREN)) { //ADD_ERROR(C_IF_ERROR_MISSINGLP); plexAnal.UnGetToken(); } //Munch & Parse the expression. //we got to give the expression string to the expression parser. // CParserBuilder builder2 = new CParserBuilder(); CExpParser expParser = new CExpParser(); CGrammarNode pNode = null; pNode = builder2.CreateParser(ref plexAnal, STATEMENT_TYPE.STMT_asic); m_pExpression = null; m_pExpressionStatement = null; if (null != pNode) { expressionNodeType = pNode.GetNodeType(); if (expressionNodeType == GRAMMAR_NODE_TYPE.NODE_TYPE_ASSIGN) { expressionNodeType = GRAMMAR_NODE_TYPE.NODE_TYPE_ASSIGN; m_pExpressionStatement = (CAssignmentStatement)pNode; m_pExpressionStatement.CreateParseSubTree(ref plexAnal, ref pSymbolTable, STATEMENT_TYPE.STMT_ASSIGNMENT_FOR); } else if (expressionNodeType == GRAMMAR_NODE_TYPE.NODE_TYPE_EXPRESSION) { expressionNodeType = GRAMMAR_NODE_TYPE.NODE_TYPE_EXPRESSION; m_pExpression = expParser.ParseExpression(ref plexAnal, ref pSymbolTable, STMT_EXPR_TYPE.EXPR_FOR); if (m_pExpression == null) { //ADD_ERROR(C_WHILE_ERROR_MISSINGEXP); } } } else { //ADD_ERROR(C_WHILE_ERROR_MISSINGSTMT); } //Munch a <)> if ((CLexicalAnalyzer.LEX_FAIL == plexAnal.GetNextToken(ref pToken, ref pSymbolTable)) || pToken == null || (pToken.GetSubType() != RUL_TOKEN_SUBTYPE.RUL_RPAREN)) { //ADD_ERROR(C_IF_ERROR_MISSINGRP); plexAnal.UnGetToken(); } //Munch a <{> if ((CLexicalAnalyzer.LEX_FAIL == plexAnal.GetNextToken(ref pToken, ref pSymbolTable)) || pToken == null || (pToken.GetSubType() != RUL_TOKEN_SUBTYPE.RUL_LBRACK)) { //ADD_ERROR(C_IF_ERROR_MISSINGRP); plexAnal.UnGetToken(); } //See if you can snatch a "case" CParserBuilder builder = new CParserBuilder(); int iNumberOfCaseStatements = 0; m_pCase[iNumberOfCaseStatements] = (CCASEStatement)builder.CreateParser(ref plexAnal, STATEMENT_TYPE.STMT_SELECTION); while (null != (m_pCase[iNumberOfCaseStatements])) { m_pCase[iNumberOfCaseStatements].CreateParseSubTree(ref plexAnal, ref pSymbolTable); if (m_pCase[iNumberOfCaseStatements].IsDefaultStatement()) { m_bIsDefaultPresent = true; m_pDefaultCase = m_pCase[iNumberOfCaseStatements]; } else { iNumberOfCaseStatements++; } m_pCase[iNumberOfCaseStatements] = (CCASEStatement)builder.CreateParser(ref plexAnal, STATEMENT_TYPE.STMT_SELECTION); } m_iNumberOfCasesPresent = iNumberOfCaseStatements; //Munch a <}> if ((CLexicalAnalyzer.LEX_FAIL == plexAnal.GetNextToken(ref pToken, ref pSymbolTable)) || pToken == null || (pToken.GetSubType() != RUL_TOKEN_SUBTYPE.RUL_RBRACK)) { //ADD_ERROR(C_IF_ERROR_MISSINGRP); plexAnal.UnGetToken(); } /* VMKP Commented on 140404, For INOR device * Sensor selection method is crashing with this Fix */ /* if (pNode) //TSRPRASAD 09MAR2004 Fix the memory leaks * { * delete pNode; * pNode = null; * }*/ /* VMKP Commented on 140404 */ return(1); } /* * catch (CRIDEError perr) * { * pvecErrors.push_back(perr); * plexAnal.MovePast( * RUL_SYMBOL, * RUL_SEMICOLON, * pSymbolTable); * } * catch (...) * { * throw (C_UM_ERROR_UNKNOWNERROR); * } * return PARSE_FAIL; */ }
// 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 <DO> if ((CLexicalAnalyzer.LEX_FAIL == plexAnal.GetNextToken(ref pToken, ref pSymbolTable)) || pToken == null || !pToken.IsDOStatement()) { //throw (C_UM_ERROR_INTERNALERR); } //Munch a Statement... CParserBuilder builder = new CParserBuilder(); m_pStatement = (CStatement)builder.CreateParser(ref plexAnal, STATEMENT_TYPE.STMT_asic); if (null != (m_pStatement)) { m_pStatement.CreateParseSubTree(ref plexAnal, ref pSymbolTable); } else { //ADD_ERROR(C_WHILE_ERROR_MISSINGSTMT); } //Munch a <WHILE> if ((CLexicalAnalyzer.LEX_FAIL == plexAnal.GetNextToken(ref pToken, ref pSymbolTable)) || pToken == null || !pToken.IsWHILEStatement()) { //throw (C_UM_ERROR_INTERNALERR); } //Munch a <(> if ((CLexicalAnalyzer.LEX_FAIL == plexAnal.GetNextToken(ref pToken, ref pSymbolTable)) || pToken == null || !(pToken.GetSubType() == RUL_TOKEN_SUBTYPE.RUL_LPAREN)) { //ADD_ERROR(C_WHILE_ERROR_MISSINGLP); plexAnal.UnGetToken(); } //Munch & Parse the expression. //we got to give the expression string to the expression parser. // CParserBuilder builder2 = new CParserBuilder(); CExpParser expParser = new CExpParser(); CGrammarNode pNode = null; //TSRPRASAD 09MAR2004 Fix the memory leaks */ pNode = builder2.CreateParser(ref plexAnal, STATEMENT_TYPE.STMT_asic); m_pExpression = null; m_pExpressionStatement = null; if (null != pNode) { expressionNodeType = pNode.GetNodeType(); if (expressionNodeType == GRAMMAR_NODE_TYPE.NODE_TYPE_ASSIGN) { expressionNodeType = GRAMMAR_NODE_TYPE.NODE_TYPE_ASSIGN; m_pExpressionStatement = (CAssignmentStatement)pNode; m_pExpressionStatement.CreateParseSubTree(ref plexAnal, ref pSymbolTable, STATEMENT_TYPE.STMT_ASSIGNMENT_FOR); } else if (expressionNodeType == GRAMMAR_NODE_TYPE.NODE_TYPE_EXPRESSION) { expressionNodeType = GRAMMAR_NODE_TYPE.NODE_TYPE_EXPRESSION; m_pExpression = expParser.ParseExpression(ref plexAnal, ref pSymbolTable, STMT_EXPR_TYPE.EXPR_FOR); if (m_pExpression == null) { //ADD_ERROR(C_WHILE_ERROR_MISSINGEXP); } } } else { //ADD_ERROR(C_WHILE_ERROR_MISSINGSTMT); } //Munch a <)> if ((CLexicalAnalyzer.LEX_FAIL == plexAnal.GetNextToken(ref pToken, ref pSymbolTable)) || pToken == null || !(pToken.GetSubType() == RUL_TOKEN_SUBTYPE.RUL_RPAREN)) { //ADD_ERROR(C_WHILE_ERROR_MISSINGRP); plexAnal.UnGetToken(); } //Munch a <;> if ((CLexicalAnalyzer.LEX_FAIL == plexAnal.GetNextToken(ref pToken, ref pSymbolTable)) || pToken == null || !(pToken.GetSubType() == RUL_TOKEN_SUBTYPE.RUL_SEMICOLON)) { //ADD_ERROR(C_WHILE_ERROR_MISSINGRP); plexAnal.UnGetToken(); } /*<START>TSRPRASAD 09MAR2004 Fix the memory leaks */ /*<END>TSRPRASAD 09MAR2004 Fix the memory leaks */ return(1); } /* * catch (CRIDEError* perr) * { * pvecErrors.push_back(perr); * plexAnal.MovePast( * RUL_SYMBOL, * RUL_SEMICOLON, * pSymbolTable); * } * catch (...) * { * throw (C_UM_ERROR_UNKNOWNERROR); * } * return PARSE_FAIL; */ }