From c142d2c6d04b6f27dc0d80e0b1dd863de79b7df0 Mon Sep 17 00:00:00 2001 From: Garritt McCune Date: Sat, 8 Oct 2022 14:43:00 -0500 Subject: [PATCH] Cleaned up the Symbol struct and updated code accordingly. --- includes/symbols_table.h | 13 +++++++++---- src/parser.c | 35 ++++++++++++++++++++++++----------- src/symbols_table.c | 9 ++++----- 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/includes/symbols_table.h b/includes/symbols_table.h index 23f9b10..a4e1959 100644 --- a/includes/symbols_table.h +++ b/includes/symbols_table.h @@ -9,11 +9,16 @@ #define SYMBOLSTABLE_DEFAULT_CAPACITY 128 +typedef enum { + StringSymbol, + NumericSymbol, + InstructionPointerSymbol, + UnresolvedSymbol +} SymbolType; + typedef struct { char* Name; - int Length; - int Resolved; - int InstructionPointer; + SymbolType Type; union { char* Text; @@ -30,7 +35,7 @@ typedef struct { SymbolTable* CreateSymbolTable(void); Symbol* TryGetSymbol(char* name, SymbolTable* table); -Symbol* AddSymbolToTable(char* name, void* value, int length, SymbolTable* table); +Symbol* AddSymbolToTable(char* name, SymbolType type, SymbolTable* table); void FreeSymbolTable(SymbolTable* table); void FreeSymbol(Symbol* symbol); diff --git a/src/parser.c b/src/parser.c index 7e3bec5..2c7d0d4 100644 --- a/src/parser.c +++ b/src/parser.c @@ -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"); } diff --git a/src/symbols_table.c b/src/symbols_table.c index 3cae1ca..373ac51 100644 --- a/src/symbols_table.c +++ b/src/symbols_table.c @@ -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++;