From d3d2b06dbd1d58332e96b47aac4a256482927246 Mon Sep 17 00:00:00 2001 From: Garritt McCune Date: Thu, 6 Oct 2022 21:33:29 -0500 Subject: [PATCH] Redesigning the way the Symbol's represent string declaration (the .db msg 'Hello World' type of declarations). --- includes/symbols_table.h | 12 +++++-- misc/test.asm | 6 ++-- src/parser.c | 74 ++++++++++++++++++++++++++++++++++++++-- src/symbols_table.c | 21 +++++++++--- 4 files changed, 101 insertions(+), 12 deletions(-) diff --git a/includes/symbols_table.h b/includes/symbols_table.h index 155b560..f534163 100644 --- a/includes/symbols_table.h +++ b/includes/symbols_table.h @@ -1,6 +1,7 @@ #ifndef SYMBOLSTABLE_H #define SYMBOLSTABLE_H +#include #include #include #include @@ -13,13 +14,19 @@ typedef enum { Address } SymbolType; +typedef struct { + char* String; + uint8_t TerminatorByte; + int HasTerminatorByte; +} SymbolString; + typedef struct { char* Name; int Length; int Resolved; union { - char* Text; + SymbolString String; int Number; //Instruction Instruction; } Value; @@ -33,7 +40,8 @@ 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, SymbolTable* table); +SymbolString* CreateSymbolString(char* text); void FreeSymbolTable(SymbolTable* table); void FreeSymbol(Symbol* symbol); diff --git a/misc/test.asm b/misc/test.asm index a49b3ec..f6dbac0 100644 --- a/misc/test.asm +++ b/misc/test.asm @@ -1,9 +1,9 @@ .db video_start 0xF37F .db msg "Hello, world!", 0 -load r1, [msg] ; Because the lod* instructions can't load an address - ; from anything but a register, this becomes laa r1, [msg] - +load r1, msg ; Because the lod* instructions can't load an address + ; from anything but a register, this becomes laa r1, msg +load r8, [15] ;Routine: string_length ;In: String address in r1 ;Out: Length in R2 diff --git a/src/parser.c b/src/parser.c index 724d763..67665b8 100644 --- a/src/parser.c +++ b/src/parser.c @@ -4,7 +4,12 @@ const List* TokensList; int CurrentToken = 0; void PrintSymbols(void); +<<<<<<< Updated upstream void HandleOperation(void); +======= +SymbolString* ParseIdentifierParameter(void); +Instruction* HandleOperation(void); +>>>>>>> Stashed changes void HandleAssemblerDirective(void); void AdvanceParser(void); void IgnoreParserLine(void); @@ -31,9 +36,34 @@ IRState* ParseTokens(List* tokens) { HandleOperation(); break; case LabelClass: +<<<<<<< Updated upstream AdvanceParser(); AddSymbolToTable(t->Lemexe, NULL, strlen(t->Lemexe), MachineState.SymbolsTable)->Resolved = 1; AdvanceParser(); //Consume the NewLine +======= + { + Symbol* symbol = TryGetSymbol(t->Lemexe, MachineState.SymbolsTable); + + if (symbol && symbol->Resolved) { + fprintf(stderr, "[Error] Line %d: Redefinition of symbol '%s'\n", t->LineNumber, t->Lemexe); + exit(1); + } + + AdvanceParser(); //Consume the label token + + if (!symbol) AddSymbolToTable(t->Lemexe, MachineState.SymbolsTable)->Resolved = 1; + else symbol->Resolved = 1; + + AdvanceParser(); //Consume the NewLine + + // Instruction* ins = HandleOperation(); + + // if (!ins) continue; + + // symbol->Value.Instruction = ins; + // symbol->InstructionPointer = 1; + } +>>>>>>> Stashed changes break; default: fprintf(stderr, "[Warning] Line %d: Syntax error, expected start of expression, got '%c' [%d].\n", t->LineNumber, t->Value.Punctuation, t->Class); @@ -58,6 +88,43 @@ IRState* ParseTokens(List* tokens) { return &MachineState; } +SymbolString* ParseIdentifierParameter(void) { + Token* token = PeekToken(); + + if (token->Class != IdentifierClass) { + fprintf(stderr, "[Error] Line %d: Expected identifier\n", token->LineNumber); + IgnoreParserLine(); + return NULL; + } + + SymbolString* string = CreateSymbolString(token->Lemexe); + + AdvanceParser(); + + if (token->Class == PunctuationClass && token->Value.Punctuation == NewLine) { + return string; + } + else if (token->Class == PunctuationClass && token->Value.Punctuation == Comma) { + AdvanceParser(); // Comsume the comma + + token = PeekToken(); + + if (token->Class != NumberClass) { + fprintf(stderr, "[Error] Line %d: Expected string termination number.\n", token->LineNumber); + IgnoreParserLine(); + free(string); + return NULL; + } + + string->HasTerminatorByte = 1; + string->TerminatorByte = token->Value.Number; + + return string; + } + + return NULL; +} + Parameter* GetParameterType() { Token* token = PeekToken(); Symbol* symbol = NULL; @@ -73,14 +140,17 @@ Parameter* GetParameterType() { AdvanceParser(); return param; +<<<<<<< Updated upstream case LabelClass: +======= +>>>>>>> Stashed changes case IdentifierClass: param->ParameterType = AddressParameter; param->InterpretedAs = AddressParameter; 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, MachineState.SymbolsTable); param->Value.Symbol = symbol; @@ -113,7 +183,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, MachineState.SymbolsTable); param->Value.Symbol = symbol; } diff --git a/src/symbols_table.c b/src/symbols_table.c index 3cae1ca..656b885 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) { Symbol* symbol = calloc(1, sizeof(Symbol)); if (!symbol) { @@ -34,13 +34,24 @@ Symbol* CreateSymbol(char* name, void* value, int length) { return NULL; } - symbol->Length = length; symbol->Name = name; - //symbol->Value = value; return symbol; } +SymbolString* CreateSymbolString(char* text) { + SymbolString* string = calloc(1, sizeof(SymbolString)); + + if (!string) { + fprintf(stderr, "Failed to create string data for symbol. %s.\n", strerror(errno)); + return NULL; + } + + string->String = text; + + return string; +} + Symbol* TryGetSymbol(char* name, SymbolTable* table) { if (!name || !table) return NULL; @@ -51,7 +62,7 @@ Symbol* TryGetSymbol(char* name, SymbolTable* table) { return NULL; } -Symbol* AddSymbolToTable(char* name, void* value, int length, SymbolTable* table) { +Symbol* AddSymbolToTable(char* name, SymbolTable* table) { //if (!name || !value || !table || length == 0) return NULL; for(int i = 0; i < table->Size; i++) { @@ -75,7 +86,7 @@ Symbol* AddSymbolToTable(char* name, void* value, int length, SymbolTable* table table->Symbols = newBlock; } - Symbol* symbol = CreateSymbol(name, value, length); + Symbol* symbol = CreateSymbol(name); table->Symbols[table->Size] = symbol; table->Size++;