From 8b6edc39beb238d84c5b987c4e3c98a36298eb20 Mon Sep 17 00:00:00 2001 From: Garritt McCune Date: Sat, 8 Oct 2022 16:15:10 -0500 Subject: [PATCH] Updated the Parser to handle the variable declaration directive. --- src/parser.c | 66 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 11 deletions(-) diff --git a/src/parser.c b/src/parser.c index 2c7d0d4..a418c7a 100644 --- a/src/parser.c +++ b/src/parser.c @@ -7,6 +7,7 @@ int CurrentToken = 0; void PrintSymbols(void); Instruction* HandleOperation(void); void HandleAssemblerDirective(void); +void HandleAssemblerDirective(void); void AdvanceParser(void); void IgnoreParserLine(void); Token* PeekToken(void); @@ -26,7 +27,7 @@ IRState* ParseTokens(List* tokens) { switch(t->Class) { case DirectiveClass: //Maybe these should be ignored, let another process handle that. - IgnoreParserLine(); + HandleAssemblerDirective(); break; case MnemonicClass: HandleOperation(); @@ -54,12 +55,6 @@ IRState* ParseTokens(List* tokens) { exit(1); } - char mn[12]; - - GetMnemonicText(ins->Mnemonic, mn); - - printf("Found: %s\n", mn); - symbol->Value.Instruction = ins; } break; @@ -76,6 +71,44 @@ IRState* ParseTokens(List* tokens) { return &MachineState; } +void HandleAssemblerDirective() { + Token* token = PeekToken(); + char* symbolname; + + //ignore sanity checks + AdvanceParser(); + + token = PeekToken(); + + if (token->Class != IdentifierClass) { + fprintf(stderr, "[Error] Line %d: expected variable name.", token->LineNumber); + IgnoreParserLine(); + return; + } + + symbolname = token->Lemexe; + + AdvanceParser(); + + token = PeekToken(); + + if (token->Class == NumberClass) { + //Delcaring a numeric value. + Symbol* s = AddSymbolToTable(symbolname, NumericSymbol, MachineState.SymbolsTable); + + s->Value.Number = token->Value.Number; + } + else if (token->Class == CharacterClass) { + Symbol* s = AddSymbolToTable(symbolname, StringSymbol, MachineState.SymbolsTable); + + s->Value.Text = token->Lemexe; + + IgnoreParserLine(); + } + else IgnoreParserLine(); + +} + Parameter* GetParameterType() { Token* token = PeekToken(); Symbol* symbol = NULL; @@ -232,11 +265,22 @@ void PrintSymbols(void) { for(int i = 0; i < MachineState.SymbolsTable->Size; i++) { Symbol* symbol = MachineState.SymbolsTable->Symbols[i]; - printf("[%s] %s", symbol->Type == UnresolvedSymbol ? "Unresolved" : "Resolved", symbol->Name); + printf("[%s] ", symbol->Type == UnresolvedSymbol ? "Unresolved" : "Resolved"); - if (symbol->Type == InstructionPointerSymbol) { - GetMnemonicText(symbol->Value.Instruction->Mnemonic, mn); - printf(" -> %s", mn); + switch(symbol->Type) { + case InstructionPointerSymbol: + GetMnemonicText(symbol->Value.Instruction->Mnemonic, mn); + printf("%s -> %s", symbol->Name, mn); + break; + case NumericSymbol: + printf("[N] %s", symbol->Name); + break; + case StringSymbol: + printf("[S] %s", symbol->Name); + break; + case UnresolvedSymbol: + printf("[U] %s", symbol->Name); + break; } printf("\n");