/**
 * 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;
}
Пример #2
0
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;
}