Ejemplo n.º 1
0
//TODO put in .h, blah blah blah
Lexeme *evalAppend(Lexeme *tree, Lexeme *env) {
  Lexeme *eargs = evalExprList(tree,env);
  if(eargsLength(eargs) != 2) {
    fprintf(stderr,"Error\n");
    return lexeme(NIL);
  }
  Lexeme *arr = car(eargs);
  Lexeme *val = car(cdr(eargs));
  size_t newSize = arr->ival;
  if(typeEqual(arr,lexeme(ARRAY))) {
    arr->aval = resizeLexArr(arr->aval,&newSize);
    arr->aval[arr->ival] = val;
    arr->ival = newSize;
  } else {
    fprintf(stderr,"Can only append to arrays\n");
  }
  return val;
}
Ejemplo n.º 2
0
Lexeme *evalArr(Lexeme *tree, Lexeme *env) {
  Lexeme *eargs = evalExprList(tree,env);
  Lexeme *arr = lexeme(ARRAY);
  if(eargsLength(eargs) == 1) {
    if(typeEqual(car(eargs),lexeme(INTEGER))) {
      if(car(eargs)->ival >= 0) {
        arr->aval = malloc(sizeof(Lexeme *) * car(eargs)->ival);
        arr->ival = car(eargs)->ival;
      } else {
        fprintf(stderr,"Size must be greather than or equal to 0\n");
      }
    } else {
      fprintf(stderr,"Must initialize array with an integer\n");
    }
  } else {
    fprintf(stderr,"Must initialize array with an integer >= 0\n");
  }
  return arr;
}
void reportTypeMismatch(int lineno, expression *exp1, expr *exp2) {
	assert(!typeEqual(exp1, exp2));
	fprintf(stderr, "error at line %d : type mismatch between %s and %s.\n", 
		lineno, typeString(exp1).c_str(), typeString(exp2).c_str());

}
void reportTypeMismatch(int lineno, identifier *id, expression *exp) {
	assert(!typeEqual(id, exp));
	cerr << "error at line "<< lineno <<" : type mismatch between "<< typeString(id).c_str() <<" and "<< typeString(exp).c_str() <<"." << endl;
}