fix output format
This commit is contained in:
135
src/symtab.c
135
src/symtab.c
@@ -178,6 +178,81 @@ BucketList st_lookup_from(char *name, Scope scope) {
|
|||||||
return NULL; /* not found */
|
return NULL; /* not found */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void printEntry(FILE *listing, BucketList entry) {
|
||||||
|
if (entry == NULL) return;
|
||||||
|
fprintf(listing, "%-14s", entry->name);
|
||||||
|
switch (entry->symbolKind) {
|
||||||
|
case SymbolVar:
|
||||||
|
fprintf(listing, "|%-13s", "Var");
|
||||||
|
break;
|
||||||
|
case SymbolFunc:
|
||||||
|
fprintf(listing, "|%-13s", "Func");
|
||||||
|
break;
|
||||||
|
case SymbolParam:
|
||||||
|
fprintf(listing, "|%-13s", "Param");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (entry->type) {
|
||||||
|
case Void:
|
||||||
|
fprintf(listing, "|%-11s", "void");
|
||||||
|
break;
|
||||||
|
case Integer:
|
||||||
|
fprintf(listing, "|%-11s", "int");
|
||||||
|
break;
|
||||||
|
case IntegerArray:
|
||||||
|
fprintf(listing, "|%-11s", "int[]");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
fprintf(listing, "|%-9d|", entry->memloc);
|
||||||
|
LineList t = entry->lines;
|
||||||
|
while (t != NULL) {
|
||||||
|
fprintf(listing, "%d ", t->lineno);
|
||||||
|
t = t->next;
|
||||||
|
}
|
||||||
|
fprintf(listing, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void printScopeTable(FILE *listing, Scope scope) {
|
||||||
|
if (scope == NULL) return;
|
||||||
|
int count = 0;
|
||||||
|
for (int i = 0; i < SYMTAB_SIZE; ++i) {
|
||||||
|
BucketList l = scope->hashTable[i];
|
||||||
|
while (l != NULL) {
|
||||||
|
count++;
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count > 0) {
|
||||||
|
BucketList *entries = (BucketList *)malloc(sizeof(BucketList) * count);
|
||||||
|
int idx = 0;
|
||||||
|
for (int i = 0; i < SYMTAB_SIZE; ++i) {
|
||||||
|
BucketList l = scope->hashTable[i];
|
||||||
|
while (l != NULL) {
|
||||||
|
entries[idx++] = l;
|
||||||
|
l = l->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 1; i < count; ++i) {
|
||||||
|
BucketList key = entries[i];
|
||||||
|
int j = i - 1;
|
||||||
|
while (j >= 0 && entries[j]->memloc > key->memloc) {
|
||||||
|
entries[j + 1] = entries[j];
|
||||||
|
--j;
|
||||||
|
}
|
||||||
|
entries[j + 1] = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
printEntry(listing, entries[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(entries);
|
||||||
|
}
|
||||||
|
fprintf(listing, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
void printScope(FILE *listing, Scope scope) {
|
void printScope(FILE *listing, Scope scope) {
|
||||||
if (scope == NULL) return;
|
if (scope == NULL) return;
|
||||||
fprintf(listing, "Scope Name: %s, Depth: %d\n", scope->name, scope->depth);
|
fprintf(listing, "Scope Name: %s, Depth: %d\n", scope->name, scope->depth);
|
||||||
@@ -185,43 +260,7 @@ void printScope(FILE *listing, Scope scope) {
|
|||||||
fprintf(listing, "Variable Name Symbol Kind Type Location Line Numbers\n");
|
fprintf(listing, "Variable Name Symbol Kind Type Location Line Numbers\n");
|
||||||
fprintf(listing, "------------------------------------------------------------\n");
|
fprintf(listing, "------------------------------------------------------------\n");
|
||||||
|
|
||||||
for (int i = 0; i < SYMTAB_SIZE; i++) {
|
printScopeTable(listing, scope);
|
||||||
BucketList l = scope->hashTable[i];
|
|
||||||
while (l != NULL) {
|
|
||||||
fprintf(listing, "%-14s", l->name);
|
|
||||||
switch (l->symbolKind) {
|
|
||||||
case SymbolVar:
|
|
||||||
fprintf(listing, "%-13s", "Variable");
|
|
||||||
break;
|
|
||||||
case SymbolFunc:
|
|
||||||
fprintf(listing, "%-13s", "Function");
|
|
||||||
break;
|
|
||||||
case SymbolParam:
|
|
||||||
fprintf(listing, "%-13s", "Parameter");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
switch (l->type) {
|
|
||||||
case Void:
|
|
||||||
fprintf(listing, "%-11s", "void");
|
|
||||||
break;
|
|
||||||
case Integer:
|
|
||||||
fprintf(listing, "%-11s", "int");
|
|
||||||
break;
|
|
||||||
case IntegerArray:
|
|
||||||
fprintf(listing, "%-11s", "int[]");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
fprintf(listing, "%-9d", l->memloc);
|
|
||||||
LineList t = l->lines;
|
|
||||||
while (t != NULL) {
|
|
||||||
fprintf(listing, "%d ", t->lineno);
|
|
||||||
t = t->next;
|
|
||||||
}
|
|
||||||
fprintf(listing, "\n");
|
|
||||||
l = l->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fprintf(listing, "\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void printScopeRecursive(FILE *listing, Scope scope) {
|
static void printScopeRecursive(FILE *listing, Scope scope) {
|
||||||
@@ -244,6 +283,24 @@ void printScopeTree(FILE *listing) {
|
|||||||
printScopeRecursive(listing, current_scope);
|
printScopeRecursive(listing, current_scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
void printSymTab(FILE *listing) {
|
static void printScopeTableRecursive(FILE *listing, Scope scope) {
|
||||||
printScopeTree(listing);
|
if (scope == NULL) return;
|
||||||
|
|
||||||
|
printScopeTable(listing, scope);
|
||||||
|
|
||||||
|
Scope child = scope->child;
|
||||||
|
while (child != NULL) {
|
||||||
|
printScopeTableRecursive(listing, child);
|
||||||
|
child = child->next_sibling;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void printSymTab(FILE *listing) {
|
||||||
|
fprintf(listing, "Scope Table");
|
||||||
|
fprintf(listing, "------------------------------------------------------------\n");
|
||||||
|
fprintf(listing, "Variable Name Symbol Kind Type Location Line Numbers\n");
|
||||||
|
fprintf(listing, "------------------------------------------------------------\n");
|
||||||
|
|
||||||
|
Scope curr = scope_global;
|
||||||
|
printScopeTableRecursive(listing, curr);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user