/** * Function representing the <term_prime> productions */ attr RecursiveDescentParser::term_prime( attr lhs ) { attr retVal, primP, rhs; OpCode opCode; retVal.type = T_ERROR; Token startToken = token; if(errorCondition) return retVal; switch(token.getType()) { case TK_ASTERISK: case TK_SLASH: case TK_PERCENT: #if DEBUG_PARSER std::cout << "<term_prime> --> <mult_op><prim><term_prime>\n"; #endif opCode = mult_op(); primP = prim(); rhs = term_prime( primP ); retVal = lhs; retVal.addr = symTab.getNextAddress(); //iCode.threeAddressCode(retVal.addr, opCode, lhs.addr, rhs.addr); iCode.threeAddressCode(retVal, opCode, lhs, rhs); if(rhs.attrib == VA_ARRAY || lhs.attrib == VA_ARRAY) { errorHandler("Arithmetic operation error, array must be indexed.", startToken); } if(rhs.type != lhs.type) { errorHandler("Type mismatch, cannot convert from int to char (term_prime) ", startToken); } break; case TK_PLUS: case TK_MINUS: case TK_RIGHT_PARENTHESES: case TK_RIGHT_BRACKET: case TK_SEMICOLON: case TK_LT: case TK_GT: case TK_LTE: case TK_GTE: case TK_EQUAL: case TK_NOT_EQ: #if DEBUG_PARSER std::cout << "<term_prime> --> e\n"; #endif retVal = lhs; break; default: errorHandler(); } return retVal; }
struct syntax_node * other_factor(){ if(strcmp(current_token->value, "*") !=0&& strcmp(current_token->value, "/") !=0) { return NULL; } struct syntax_node * t; t = (struct syntax_node*)malloc(sizeof(struct syntax_node)); chushihua_t(t); t->child[0] = mult_op(); t->child[1] = term(); strcpy(t->kind_name, "OtherFactor"); return t; }