Cleaned up the Symbol struct and updated code accordingly.
This commit is contained in:
@@ -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
@@ -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
@@ -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++;
|
||||||
|
|||||||
Reference in New Issue
Block a user