@@ -619,6 +619,10 @@ simple_statement:
|
|||||||
|
|
||||||
|
|
||||||
else {
|
else {
|
||||||
|
//printf("%d\n",getAdInfoType((TableNode*)$1));
|
||||||
|
//printf("%d\n",getAdInfoType((TableNode*)$3));
|
||||||
|
//printf("%d\n",getAdInfoType((TableNode*)$1));
|
||||||
|
//printf("%d\n",getAdInfoType((TableNode*)$3));
|
||||||
throw_error(ERROR_TYPE, "Assignable Assign Expression - Object %s of type %s != Object %s of type %s", getName(node), getType(node), getName((TableNode*)$3), getType((TableNode*)$3));
|
throw_error(ERROR_TYPE, "Assignable Assign Expression - Object %s of type %s != Object %s of type %s", getName(node), getType(node), getName((TableNode*)$3), getType((TableNode*)$3));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -658,7 +662,8 @@ ablock:
|
|||||||
argument_list:
|
argument_list:
|
||||||
//NEED TO EMIT PARAMETERS HERE. MAYBE USE STACK STRUCTURE
|
//NEED TO EMIT PARAMETERS HERE. MAYBE USE STACK STRUCTURE
|
||||||
expression{
|
expression{
|
||||||
TableNode* arg = CreateEntry(cur, getAdInfoType((TableNode*)$1), getTypeEntry((TableNode*)$1), arg_var_gen(), NULL);
|
char* name = arg_var_gen();
|
||||||
|
TableNode* arg = CreateEntry(cur, getAdInfoType((TableNode*)$1), getTypeEntry((TableNode*)$1), name, NULL);
|
||||||
emit_parameter(tn_or_const(NODE,arg));
|
emit_parameter(tn_or_const(NODE,arg));
|
||||||
//S_Push(stack,current);
|
//S_Push(stack,current);
|
||||||
//emit_detach();
|
//emit_detach();
|
||||||
@@ -670,7 +675,8 @@ argument_list:
|
|||||||
| expression
|
| expression
|
||||||
|
|
||||||
{
|
{
|
||||||
TableNode* arg = CreateEntry(cur, getAdInfoType((TableNode*)$1), getTypeEntry((TableNode*)$1), arg_var_gen(), NULL);
|
char* name = arg_var_gen();
|
||||||
|
TableNode* arg = CreateEntry(cur, getAdInfoType((TableNode*)$1), getTypeEntry((TableNode*)$1), name, NULL);
|
||||||
emit_parameter(tn_or_const(NODE,arg));
|
emit_parameter(tn_or_const(NODE,arg));
|
||||||
//S_Push(stack,current);
|
//S_Push(stack,current);
|
||||||
//emit_detach();
|
//emit_detach();
|
||||||
@@ -831,7 +837,12 @@ expression:
|
|||||||
TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, boo, temp, NULL);
|
TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, boo, temp, NULL);
|
||||||
emit_binary_op(E_LESS_THAN,node,tn_or_const(NODE,$1),tn_or_const(NODE,$3));
|
emit_binary_op(E_LESS_THAN,node,tn_or_const(NODE,$1),tn_or_const(NODE,$3));
|
||||||
$$ = node;
|
$$ = node;
|
||||||
} else {
|
} else if(getTypeEntry((TableNode*)$1) == getTypeEntry((TableNode*)$3) && getTypeEntry((TableNode*)$1)==boo){
|
||||||
|
char* temp = temp_var_gen();
|
||||||
|
TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, boo, temp, NULL);
|
||||||
|
emit_binary_op(E_LESS_THAN,node,tn_or_const(NODE,$1),tn_or_const(NODE,$3));
|
||||||
|
$$ = node;
|
||||||
|
}else {
|
||||||
$$=undefined;
|
$$=undefined;
|
||||||
throw_error(ERROR_TYPE, "Object %s of type %s and Object %s of type %s must both be integers", getName((TableNode*)$1), getType((TableNode*)$1), getName((TableNode*)$3), getType((TableNode*)$3));
|
throw_error(ERROR_TYPE, "Object %s of type %s and Object %s of type %s must both be integers", getName((TableNode*)$1), getType((TableNode*)$1), getName((TableNode*)$3), getType((TableNode*)$3));
|
||||||
}
|
}
|
||||||
@@ -866,28 +877,30 @@ expression:
|
|||||||
| RESERVE assignable
|
| RESERVE assignable
|
||||||
{
|
{
|
||||||
int d = getAdInfoType((TableNode*)$2);
|
int d = getAdInfoType((TableNode*)$2);
|
||||||
if(d == TYPE_ARRAY ||d == TYPE_RECORD) {
|
//commenting out type checks for now since assignable is being resolved to something before reserve is being applied which is tricky
|
||||||
|
//if(d == TYPE_ARRAY ||d == TYPE_RECORD) {
|
||||||
char* temp = temp_var_gen();
|
char* temp = temp_var_gen();
|
||||||
TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, addr, temp, NULL);
|
TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, addr, temp, NULL);
|
||||||
//NOTE ADD ASSIGNMENT EMIT HERE (MIGHT NEED TO PUSH TO STACK)
|
//NOTE ADD ASSIGNMENT EMIT HERE (MIGHT NEED TO PUSH TO STACK)
|
||||||
$$ = node;
|
$$ = node;
|
||||||
} else {
|
// } else {
|
||||||
throw_error(ERROR_TYPE, "Invalid memOp expression with object %s of type %s.", getName((TableNode*)$2), getType((TableNode*)$2));
|
// throw_error(ERROR_TYPE, "Invalid memOp expression with object %s of type %s.", getName((TableNode*)$2), getType((TableNode*)$2));
|
||||||
$$=undefined;
|
// $$=undefined;
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
| RELEASE assignable
|
| RELEASE assignable
|
||||||
{
|
{
|
||||||
int d = getAdInfoType((TableNode*)$2);
|
int d = getAdInfoType((TableNode*)$2);
|
||||||
if(d == TYPE_ARRAY ||d == TYPE_RECORD) {
|
//commenting out type checks for now since assignable is being resolved to something before reserve is being applied which is tricky
|
||||||
|
//if(d == TYPE_ARRAY ||d == TYPE_RECORD) {
|
||||||
char* temp = temp_var_gen();
|
char* temp = temp_var_gen();
|
||||||
TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, addr, temp, NULL);
|
TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, addr, temp, NULL);
|
||||||
//NOTE ADD ASSIGNMENT EMIT HERE (MIGHT NEED TO PUSH TO STACK)
|
//NOTE ADD ASSIGNMENT EMIT HERE (MIGHT NEED TO PUSH TO STACK)
|
||||||
$$ = node;
|
$$ = node;
|
||||||
} else {
|
// } else {
|
||||||
throw_error(ERROR_TYPE, "Invalid memOp expression with object %s of type %s.", getName((TableNode*)$2), getType((TableNode*)$2));
|
// throw_error(ERROR_TYPE, "Invalid memOp expression with object %s of type %s.", getName((TableNode*)$2), getType((TableNode*)$2));
|
||||||
$$=undefined;
|
// $$=undefined;
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
;
|
;
|
||||||
@@ -938,20 +951,20 @@ assignable:
|
|||||||
}else{
|
}else{
|
||||||
TableNode* param_arg_type = getFirstEntry(getRecList(expected));
|
TableNode* param_arg_type = getFirstEntry(getRecList(expected));
|
||||||
TableNode* arg_given = getFirstEntry(cur);
|
TableNode* arg_given = getFirstEntry(cur);
|
||||||
|
while(arg_given != NULL && arg_given != undefined && getName(arg_given)[0]!='&'){
|
||||||
|
arg_given = getNextEntry(arg_given);
|
||||||
|
}
|
||||||
|
if(getTypeEntry(arg_given) != getTypeEntry(param_arg_type)){
|
||||||
|
throw_error(ERROR_TYPE, "expected %s expression as first argument of a record in function call but got %s", getType(param_arg_type), getType(arg_given));
|
||||||
|
}
|
||||||
|
param_arg_type = getNextEntry(param_arg_type);
|
||||||
|
arg_given = getNextEntry(arg_given);
|
||||||
|
while(arg_given != NULL && arg_given != undefined && param_arg_type != NULL){
|
||||||
while(arg_given != NULL && getName(arg_given)[0]!='&'){
|
while(arg_given != NULL && getName(arg_given)[0]!='&'){
|
||||||
arg_given = getNextEntry(arg_given);
|
arg_given = getNextEntry(arg_given);
|
||||||
}
|
}
|
||||||
if(getTypeEntry(arg_given) != getTypeEntry(param_arg_type)){
|
if(getTypeEntry(arg_given) != getTypeEntry(param_arg_type)){
|
||||||
throw_error(ERROR_TYPE, "expected %s expression as first argument in function call but got %s", getType(param_arg_type), getType(arg_given));
|
throw_error(ERROR_TYPE, "expected type %s expression as argument of a record in function call but got type %s", getType(param_arg_type), getType(arg_given));
|
||||||
}
|
|
||||||
param_arg_type = getNextEntry(param_arg_type);
|
|
||||||
arg_given = getNextEntry(arg_given);
|
|
||||||
while(arg_given != NULL && param_arg_type != NULL){
|
|
||||||
while(arg_given != NULL && getName(arg_given)[0]=='&'){
|
|
||||||
arg_given = getNextEntry(arg_given);
|
|
||||||
}
|
|
||||||
if(getTypeEntry(arg_given) != getTypeEntry(param_arg_type)){
|
|
||||||
throw_error(ERROR_TYPE, "expected %s expression as argument in function call but got %s", getType(param_arg_type), getType(arg_given));
|
|
||||||
}
|
}
|
||||||
arg_given = getNextEntry(arg_given);
|
arg_given = getNextEntry(arg_given);
|
||||||
param_arg_type = getNextEntry(param_arg_type);
|
param_arg_type = getNextEntry(param_arg_type);
|
||||||
@@ -959,7 +972,7 @@ assignable:
|
|||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
TableNode*actual_instance = getFirstEntry(cur);
|
TableNode*actual_instance = getFirstEntry(cur);
|
||||||
while(actual_instance != NULL && getName(actual_instance)[0] =='&'){
|
while(actual_instance != NULL && actual_instance != undefined && getName(actual_instance)[0] !='&'){
|
||||||
actual_instance = getNextEntry(actual_instance);
|
actual_instance = getNextEntry(actual_instance);
|
||||||
}
|
}
|
||||||
if(actual_instance == NULL){
|
if(actual_instance == NULL){
|
||||||
@@ -968,14 +981,14 @@ assignable:
|
|||||||
}
|
}
|
||||||
TableNode *actual = getTypeEntry(actual_instance);
|
TableNode *actual = getTypeEntry(actual_instance);
|
||||||
if (expected != actual) {
|
if (expected != actual) {
|
||||||
throw_error(ERROR_TYPE, "expected %s expression in function call but got %s", getType(expected), getName(actual));
|
throw_error(ERROR_TYPE, "expected %s expression in single argument function call but got %s", getType(expected), getName(actual));
|
||||||
}
|
}
|
||||||
if ($3 != 1) {
|
if ($3 != 1) {
|
||||||
throw_error(ERROR_SYNTAX, "expected 1 argument but got %d", $3); }
|
throw_error(ERROR_SYNTAX, "expected 1 argument but got %d", $3); }
|
||||||
printTableNode(getReturn(getTypeEntry((TableNode*)$1)));
|
printTableNode(getReturn(getTypeEntry((TableNode*)$1)));
|
||||||
}
|
}
|
||||||
char* temp = temp_var_gen();
|
char* temp = temp_var_gen();
|
||||||
TableNode* typeNode2 = getReturn(getTypeEntry($1));
|
TableNode* typeNode2 = getReturn(getTypeEntry((TableNode*)$1));
|
||||||
int t = -1;
|
int t = -1;
|
||||||
if(getAdInfoType(typeNode2) == TYPE_PRIMITIVE_TYPE){
|
if(getAdInfoType(typeNode2) == TYPE_PRIMITIVE_TYPE){
|
||||||
t = TYPE_PRIMITIVE;
|
t = TYPE_PRIMITIVE;
|
||||||
@@ -1092,7 +1105,7 @@ constant:
|
|||||||
C_STRING
|
C_STRING
|
||||||
{
|
{
|
||||||
char* temp = temp_var_gen();
|
char* temp = temp_var_gen();
|
||||||
TableNode* node = CreateEntry(cur,TYPE_PRIMITIVE, stri, temp, NULL);
|
TableNode* node = CreateEntry(cur,TYPE_ARRAY, stri, temp, NULL);
|
||||||
emit_assignment(node, tn_or_const(STRING,$1));
|
emit_assignment(node, tn_or_const(STRING,$1));
|
||||||
printdebug("string of C_STRING in constant is %s", $1);
|
printdebug("string of C_STRING in constant is %s", $1);
|
||||||
$$ = node;
|
$$ = node;
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ char *temp_var_gen() {
|
|||||||
}
|
}
|
||||||
char *arg_var_gen() {
|
char *arg_var_gen() {
|
||||||
char *ret = calloc(9, sizeof(*ret));
|
char *ret = calloc(9, sizeof(*ret));
|
||||||
sprintf(ret, "&t%d", temp3_count);
|
sprintf(ret, "&%d", temp3_count);
|
||||||
temp3_count++;
|
temp3_count++;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -630,6 +630,7 @@ TableNode *getReturn(TableNode *definition) {
|
|||||||
"node has NULL additionalinfo. Invalid.");
|
"node has NULL additionalinfo. Invalid.");
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
printdebug("function:%s with return type %s\n",getName(definition),getName(definition->additionalinfo->FunTypeAdInfo->returntype));
|
||||||
return definition->additionalinfo->FunTypeAdInfo->returntype;
|
return definition->additionalinfo->FunTypeAdInfo->returntype;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1215,6 +1216,9 @@ void print_symbol_table(SymbolTable *table, FILE *file_ptr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (; entry != NULL; entry = getNextEntry(entry)) {
|
for (; entry != NULL; entry = getNextEntry(entry)) {
|
||||||
|
if((getName(entry)[0] == '$' || getName(entry)[0] == '&') && ir_flag == NULL){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (getAdInfoType(entry) == TYPE_ARRAY_TYPE) {
|
if (getAdInfoType(entry) == TYPE_ARRAY_TYPE) {
|
||||||
char *arrayType = (char *)malloc(100);
|
char *arrayType = (char *)malloc(100);
|
||||||
sprintf(arrayType, " %d -> %s", getNumArrDim(entry),
|
sprintf(arrayType, " %d -> %s", getNumArrDim(entry),
|
||||||
|
|||||||
@@ -15,6 +15,8 @@
|
|||||||
#define SIZE_CHAR 1
|
#define SIZE_CHAR 1
|
||||||
#define SIZE_BOOL 1
|
#define SIZE_BOOL 1
|
||||||
|
|
||||||
|
extern FILE *ir_flag;
|
||||||
|
|
||||||
struct TableNode;
|
struct TableNode;
|
||||||
typedef struct TFList TFList;
|
typedef struct TFList TFList;
|
||||||
typedef struct CGNode CGNode;
|
typedef struct CGNode CGNode;
|
||||||
|
|||||||
Reference in New Issue
Block a user