//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; }
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; }