/** * Function representing the <prim_prime> productions */ attr RecursiveDescentParser::prim_prime(TableEntry* pTabEntry) { attr retval; retval.type = T_ERROR; if(errorCondition) return retval; if(token == TK_LEFT_BRACKET) { #if DEBUG_PARSER std::cout << "<prim_prime> --> [<exp>]\n"; #endif token = scanner->getToken(); retval = exp(); retval.attrib = VA_SIMPLE; match(TK_RIGHT_BRACKET); } else if(token == TK_LEFT_PARENTHESES) { #if DEBUG_PARSER std::cout << "<prim_prime> --> (<o_list>)\n"; #endif Token sToken = token; token = scanner->getToken(); ParamList* pList = o_list(); match(TK_RIGHT_PARENTHESES); if(pTabEntry && pTabEntry->getEntryType()==TableEntry::FUNCTION) { FunctionEntry* fe = (FunctionEntry*)pTabEntry; if(pList) { matchParameters(fe, pList, sToken); } retval.type = fe->getReturnType(); retval.addr = symTab.getNextAddress(); iCode.threeAddressCode(TAC_PARAM, pList); iCode.threeAddressCode(retval, TAC_CALL, fe->getLabel(), fe->getParamCount()); } else { std::stringstream errorMsg; errorMsg << "'" << pTabEntry->getName() << "' is not a function"; errorHandler(errorMsg.str(), sToken); } } else if( token == TK_ASTERISK || token == TK_SLASH || token == TK_PERCENT || token == TK_PLUS || token == TK_MINUS || token == TK_RIGHT_PARENTHESES || token == TK_RIGHT_BRACKET || token == TK_SEMICOLON || token == TK_LT || token == TK_GT || token == TK_LTE || token == TK_GTE || token == TK_EQUAL || token == TK_NOT_EQ ) { #if DEBUG_PARSER std::cout << "<prim_prime> --> e\n"; #endif retval = pTabEntry->getAttr(); } else { errorHandler(); } return retval; }
Function *Function::from_fun_block(FBlock *pfb) { FunctionEntry *pfe = (FunctionEntry *) pfb->entry->data; return pfe->fun_from_fblock(pfb); }