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
+9 -4
View File
@@ -9,11 +9,16 @@
#define SYMBOLSTABLE_DEFAULT_CAPACITY 128 #define SYMBOLSTABLE_DEFAULT_CAPACITY 128
typedef enum {
StringSymbol,
NumericSymbol,
InstructionPointerSymbol,
UnresolvedSymbol
} SymbolType;
typedef struct { typedef struct {
char* Name; char* Name;
int Length; SymbolType Type;
int Resolved;
int InstructionPointer;
union { union {
char* Text; char* Text;
@@ -30,7 +35,7 @@ typedef struct {
SymbolTable* CreateSymbolTable(void); SymbolTable* CreateSymbolTable(void);
Symbol* TryGetSymbol(char* name, SymbolTable* table); 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 FreeSymbolTable(SymbolTable* table);
void FreeSymbol(Symbol* symbol); void FreeSymbol(Symbol* symbol);
+24 -11
View File
@@ -35,27 +35,32 @@ IRState* ParseTokens(List* tokens) {
{ {
Symbol* symbol = TryGetSymbol(t->Lemexe, MachineState.SymbolsTable); 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); fprintf(stderr, "[Error] Line %d: Redefinition of symbol '%s'\n", t->LineNumber, t->Lemexe);
exit(1); exit(1);
} }
AdvanceParser(); //Consume the label token AdvanceParser(); //Consume the label token
if (!symbol) symbol = AddSymbolToTable(t->Lemexe, NULL, strlen(t->Lemexe), MachineState.SymbolsTable); if (!symbol) symbol = AddSymbolToTable(t->Lemexe, InstructionPointerSymbol, MachineState.SymbolsTable);
else symbol->Type = InstructionPointerSymbol;
symbol->Resolved = 1;
AdvanceParser(); //Consume the NewLine AdvanceParser(); //Consume the NewLine
Instruction* ins = HandleOperation(); 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; GetMnemonicText(ins->Mnemonic, mn);
// symbol->InstructionPointer = 1;
printf("Found: %s\n", mn);
symbol->Value.Instruction = ins;
} }
break; break;
default: default:
@@ -93,7 +98,7 @@ Parameter* GetParameterType() {
symbol = TryGetSymbol(token->Lemexe, MachineState.SymbolsTable); 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; param->Value.Symbol = symbol->Name;
@@ -126,7 +131,7 @@ Parameter* GetParameterType() {
symbol = TryGetSymbol(token->Lemexe, MachineState.SymbolsTable); 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; param->Value.Symbol = symbol->Name;
} }
@@ -222,11 +227,19 @@ Instruction* HandleOperation() {
} }
void PrintSymbols(void) { void PrintSymbols(void) {
char mn[12];
printf("-----SYMBOLS-----\n"); printf("-----SYMBOLS-----\n");
for(int i = 0; i < MachineState.SymbolsTable->Size; i++) { for(int i = 0; i < MachineState.SymbolsTable->Size; i++) {
Symbol* symbol = MachineState.SymbolsTable->Symbols[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"); printf("-----SYMBOLS-----\n");
} }
+4 -5
View File
@@ -25,7 +25,7 @@ SymbolTable* CreateSymbolTable(void){
return table; return table;
} }
Symbol* CreateSymbol(char* name, void* value, int length) { Symbol* CreateSymbol(char* name, SymbolType type) {
Symbol* symbol = calloc(1, sizeof(Symbol)); Symbol* symbol = calloc(1, sizeof(Symbol));
if (!symbol) { if (!symbol) {
@@ -34,9 +34,8 @@ Symbol* CreateSymbol(char* name, void* value, int length) {
return NULL; return NULL;
} }
symbol->Length = length; symbol->Type = type;
symbol->Name = name; symbol->Name = name;
//symbol->Value = value;
return symbol; return symbol;
} }
@@ -51,7 +50,7 @@ Symbol* TryGetSymbol(char* name, SymbolTable* table) {
return NULL; 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; //if (!name || !value || !table || length == 0) return NULL;
for(int i = 0; i < table->Size; i++) { 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; table->Symbols = newBlock;
} }
Symbol* symbol = CreateSymbol(name, value, length); Symbol* symbol = CreateSymbol(name, type);
table->Symbols[table->Size] = symbol; table->Symbols[table->Size] = symbol;
table->Size++; table->Size++;