still editing grammar

This commit is contained in:
Partho Bhattacharya
2025-03-27 23:37:04 -04:00
parent c93534e9d4
commit d7f6272d37
3 changed files with 22 additions and 70 deletions

View File

@ -46,7 +46,7 @@
%token <words> T_BOOLEAN 203
%token <words> T_CHARACTER 204
%token <words> T_STRING 205
%token <words> C_INTEGER 301
%token <integ> C_INTEGER 301
%token <words> C_NULL 302
%token <words> C_CHARACTER 303
%token <words> C_STRING 304
@ -120,7 +120,7 @@ prototype:
definition:
TYPE ID COLON dblock
| TYPE ID COLON constant ARROW ID
| TYPE ID COLON C_INTEGER ARROW ID
| function_declaration
| TYPE ID COLON id_or_types ARROW id_or_types {
CreateEntry(cur,funtypeprime,$2,CreateFunctionTypeInfo(table_lookup(cur,$4),table_lookup(cur,$6)));
@ -160,63 +160,8 @@ declaration:
id_or_types COLON ID {
TableNode* type = table_lookup(getAncestor(cur), $<words>1);
AdInfo* info = NULL;
// Check for NULL type
if (type == NULL) {
printf("Error: Type '%s' not found\n", $<words>1);
} else {
// Create appropriate AdInfo based on the type
if (type == integ) {
// Integer type
info = CreatePrimitiveInfo(4); // 4 bytes for integer
}
else if (type == addr) {
// Address type
info = CreatePrimitiveInfo(8); // 8 bytes for address
}
else if (type == chara) {
// Character type
info = CreatePrimitiveInfo(1); // 1 byte for character
}
else if (type == boo) {
// Boolean type
info = CreatePrimitiveInfo(1); // 1 byte for boolean
}
else if (type == stri) {
// String type (array of characters)
info = CreateArrayInfo(1, chara); // 1-dimensional array of characters
}
else if (type == arrayprim) {
// Array type
// Need to determine dimensions and element type from context
// This is a placeholder - you'll need to adjust based on your grammar
info = CreateArrayInfo(1, NULL); // Default to 1D array of unknown type
}
else if (type == recprime) {
// Record type
// Need to determine elements from context
// This is a placeholder - you'll need to adjust based on your grammar
info = CreateRecordInfo(0, NULL); // Default to empty record
}
else if (type == funprime) {
// Function declaration
info = CreateFunctionDeclarationInfo(0, false); // Start at line 0, regular function
}
else if (type == funtypeprime) {
// Function type
// Need parameter and return types from context
// This is a placeholder - you'll need to adjust based on your grammar
info = CreateFunctionTypeInfo(NULL, NULL); // Default to no parameter/return type
}
// Add additional type cases as needed
}
// Create the entry with the appropriate AdInfo
CreateEntry(cur, type, $<words>3, info);
}
;
// id_or_types COLON ID {CreateEntry(cur,table_lookup(getAncestor(cur),$<words>1),$<words>3,NULL); }
// ;
id_or_types COLON ID {CreateEntry(cur,table_lookup(getAncestor(cur),$<words>1),$<words>3,NULL); }
;
id_or_types:
ID {printf("string of id in id_or_type is %s\n",$<words>1);} {$$ = $<words>1;}
@ -258,27 +203,34 @@ expression:
| NOT expression {printf("not expression\n"); if(strcmp($2,"Boolean")==0){$$=$2;}else{$$=strdup("undefined");
printf("mismatch at line %d and column %d\n",@1.first_line,@1.first_column);}}
| expression ADD expression {printf("add expression\n");}
{printf("less than expression\n");if(strcmp($1,$3)==0 && strcmp($1,"integer")==0){$$=strdup("Boolean"); else{printf("mismatch at line %d and column %d\n",@2.first_line,@2.first_column);
{printf("less than expression\n");
if(strcmp($1,$3)==0 && strcmp($1,"integer")==0){$$=strdup("Boolean");
else{printf("mismatch at line %d and column %d\n",@2.first_line,@2.first_column);
$$=strdup("Boolean");$$=strdup("undefined");}}
| expression SUB_OR_NEG expression {printf("subtract expression\n");}
{printf("less than expression\n");if(strcmp($1,$3)==0 && strcmp($1,"integer")==0){$$=strdup("Boolean"); else{printf("mismatch at line %d and column %d\n",@2.first_line,@2.first_column);
$$=strdup("Boolean");$$=strdup("undefined");}}
{printf("less than expression\n");if(strcmp($1,$3)==0 &&strcmp($1,"integer")==0){$$=strdup("Boolean");
else{printf("mismatch at line %d and column %d\n",@2.first_line,@2.first_column);
$$=strdup("Boolean");$$=strdup("undefined");}}
| expression MUL expression {printf("multiply expression\n");}
{printf("less than expression\n");if(strcmp($1,$3)==0 && strcmp($1,"integer")==0){$$=strdup("Boolean"); else{printf("mismatch at line %d and column %d\n",@2.first_line,@2.first_column);
{printf("less than expression\n");if(strcmp($1,$3)==0 &&strcmp($1,"integer")==0){$$=strdup("Boolean");
else{printf("mismatch at line %d and column %d\n",@2.first_line,@2.first_column);
$$=strdup("Boolean");$$=strdup("undefined");}}
| expression DIV expression {printf("division expression\n");}
{printf("less than expression\n");if(strcmp($1,$3)==0 && strcmp($1,"integer")==0){$$=strdup("Boolean"); else{printf("mismatch at line %d and column %d\n",@2.first_line,@2.first_column);
{printf("less than expression\n");if(strcmp($1,$3)==0 && strcmp($1,"integer")==0){$$=strdup("Boolean");
else{printf("mismatch at line %d and column %d\n",@2.first_line,@2.first_column);
$$=strdup("Boolean");$$=strdup("undefined");}}
| expression REM expression {printf("remainder expression\n");}
{printf("less than expression\n");if(strcmp($1,$3)==0 && strcmp($1,"integer")==0){$$=strdup("Boolean"); else{printf("mismatch at line %d and column %d\n",@2.first_line,@2.first_column);
{printf("less than expression\n");if(strcmp($1,$3)==0 && strcmp($1,"integer")==0){$$=strdup("Boolean");
else{printf("mismatch at line %d and column %d\n",@2.first_line,@2.first_column);
$$=strdup("Boolean");$$=strdup("undefined");}}
| expression AND expression {printf("and expression\n");}
{printf("less than expression\n");if(strcmp($1,$3)==0 && strcmp($1,"integer")==0){$$=strdup("Boolean"); else{printf("mismatch at line %d and column %d\n",@2.first_line,@2.first_column);
{printf("less than expression\n");if(strcmp($1,$3)==0 && strcmp($1,"integer")==0){$$=strdup("Boolean");
else{printf("mismatch at line %d and column %d\n",@2.first_line,@2.first_column);
$$=strdup("Boolean");$$=strdup("undefined");}}
| expression OR expression {printf("or expression\n");}
{printf("less than expression\n");if(strcmp($1,$3)==0 &&
{printf("less than expression\n");if(strcmp($1,$3)==0 &&
strcmp($1,"integer")==0){$$=strdup("Boolean");
else{printf("mismatch at line %d and column %d\n",@2.first_line,@2.first_column);
$$=strdup("Boolean");$$=strdup("undefined");}}
@ -316,7 +268,7 @@ memOp:
constant:
C_STRING {$$ = $<words>1;}
| C_INTEGER {$$ = $<words>1;}
| C_INTEGER {$$ = "integer";}
| C_NULL {$$ = $<words>1;}
| C_CHARACTER {$$ = $<words>1;}
| C_TRUE {$$ = $<words>1;}