Cleaned up the Symbol struct and updated code accordingly.

This commit is contained in:
2022-10-08 14:43:00 -05:00
parent 4b08707e67
commit c142d2c6d0
3 changed files with 37 additions and 20 deletions
+24 -11
View File
@@ -35,27 +35,32 @@ IRState* ParseTokens(List* tokens) {
{
Symbol* symbol = TryGetSymbol(t->Lemexe, MachineState.SymbolsTable);
if (symbol && symbol->Resolved) {
if (symbol && symbol->Type != UnresolvedSymbol) {
fprintf(stderr, "[Error] Line %d: Redefinition of symbol '%s'\n", t->LineNumber, t->Lemexe);
exit(1);
}
AdvanceParser(); //Consume the label token
if (!symbol) symbol = AddSymbolToTable(t->Lemexe, NULL, strlen(t->Lemexe), MachineState.SymbolsTable);
symbol->Resolved = 1;
if (!symbol) symbol = AddSymbolToTable(t->Lemexe, InstructionPointerSymbol, MachineState.SymbolsTable);
else symbol->Type = InstructionPointerSymbol;
AdvanceParser(); //Consume the NewLine
Instruction* ins = HandleOperation();
if (!ins) printf("No op %s\n", symbol->Name);
if (!ins) {
fprintf(stderr, "[Error] Line %d: Expected instruction following label %s\n", t->LineNumber, t->Lemexe);
exit(1);
}
// if (!ins) continue;
char mn[12];
// symbol->Value.Instruction = ins;
// symbol->InstructionPointer = 1;
GetMnemonicText(ins->Mnemonic, mn);
printf("Found: %s\n", mn);
symbol->Value.Instruction = ins;
}
break;
default:
@@ -93,7 +98,7 @@ Parameter* GetParameterType() {
symbol = TryGetSymbol(token->Lemexe, MachineState.SymbolsTable);
if (!symbol) symbol = AddSymbolToTable(token->Lemexe, token->Lemexe, strlen(token->Lemexe), MachineState.SymbolsTable);
if (!symbol) symbol = AddSymbolToTable(token->Lemexe, UnresolvedSymbol, MachineState.SymbolsTable);
param->Value.Symbol = symbol->Name;
@@ -126,7 +131,7 @@ Parameter* GetParameterType() {
symbol = TryGetSymbol(token->Lemexe, MachineState.SymbolsTable);
if (!symbol) symbol = AddSymbolToTable(token->Lemexe, NULL, strlen(token->Lemexe), MachineState.SymbolsTable);
if (!symbol) symbol = AddSymbolToTable(token->Lemexe, UnresolvedSymbol, MachineState.SymbolsTable);
param->Value.Symbol = symbol->Name;
}
@@ -222,11 +227,19 @@ Instruction* HandleOperation() {
}
void PrintSymbols(void) {
char mn[12];
printf("-----SYMBOLS-----\n");
for(int i = 0; i < MachineState.SymbolsTable->Size; i++) {
Symbol* symbol = MachineState.SymbolsTable->Symbols[i];
printf("[Resolved? %d] %s\n", symbol->Resolved, symbol->Name);
printf("[%s] %s", symbol->Type == UnresolvedSymbol ? "Unresolved" : "Resolved", symbol->Name);
if (symbol->Type == InstructionPointerSymbol) {
GetMnemonicText(symbol->Value.Instruction->Mnemonic, mn);
printf(" -> %s", mn);
}
printf("\n");
}
printf("-----SYMBOLS-----\n");
}
+4 -5
View File
@@ -25,7 +25,7 @@ SymbolTable* CreateSymbolTable(void){
return table;
}
Symbol* CreateSymbol(char* name, void* value, int length) {
Symbol* CreateSymbol(char* name, SymbolType type) {
Symbol* symbol = calloc(1, sizeof(Symbol));
if (!symbol) {
@@ -34,9 +34,8 @@ Symbol* CreateSymbol(char* name, void* value, int length) {
return NULL;
}
symbol->Length = length;
symbol->Type = type;
symbol->Name = name;
//symbol->Value = value;
return symbol;
}
@@ -51,7 +50,7 @@ Symbol* TryGetSymbol(char* name, SymbolTable* table) {
return NULL;
}
Symbol* AddSymbolToTable(char* name, void* value, int length, SymbolTable* table) {
Symbol* AddSymbolToTable(char* name, SymbolType type, SymbolTable* table) {
//if (!name || !value || !table || length == 0) return NULL;
for(int i = 0; i < table->Size; i++) {
@@ -75,7 +74,7 @@ Symbol* AddSymbolToTable(char* name, void* value, int length, SymbolTable* table
table->Symbols = newBlock;
}
Symbol* symbol = CreateSymbol(name, value, length);
Symbol* symbol = CreateSymbol(name, type);
table->Symbols[table->Size] = symbol;
table->Size++;