diff --git a/misc/test.asm b/misc/test.asm index 640f12d..43c9fee 100644 --- a/misc/test.asm +++ b/misc/test.asm @@ -9,4 +9,6 @@ something_insance: load r1, unknown_symbol load byte r1, r3 load r1, 5 -load r3, r4 \ No newline at end of file +load r3, r4 +store byte r3, r5 +store r5, r7 \ No newline at end of file diff --git a/src/parser.c b/src/parser.c index 3078882..0c9d272 100644 --- a/src/parser.c +++ b/src/parser.c @@ -167,7 +167,38 @@ void HandleAssemblerDirective() { break; case Store: { - + AdvanceParser(); + + Token* next = PeekToken(); + + if (next->Class != DirectiveClass) { + //If the token after the current one is invalid then the expect function ahead will exit, so we can + //go ahead and change the STORE directive into a proper opcode here. + directive->Value.Mnemonic = STOW; + directive->Class = MnemonicClass; + directive->Lemexe = "STOW"; + } + else { + if (next->Value.Directive != Byte) { + fprintf(stderr, "[Line %d] Syntax error, expected keyword 'byte'.\n", next->LineNumber); + exit(10); + } + + RemoveCurrentToken(); //Remove byte modifier token. + AdvanceParser(); + + directive->Value.Mnemonic = STOB; + directive->Class = MnemonicClass; + directive->Lemexe = "STOB"; + } + + ExpectRegister(); + + ExpectPuncuation(Comma, ForwardParser); + + ExpectRegister(); + + ExpectLineEndOrFileEnd(ForwardParser); } break; default: diff --git a/src/scanner.c b/src/scanner.c index e17e906..03ee6b4 100644 --- a/src/scanner.c +++ b/src/scanner.c @@ -299,6 +299,14 @@ Token* ParseIdentifier(void) { return token; } + if (strcmp(lexeme, "store") == 0) { + Token* token = CreateToken(Line, DirectiveClass); + + token->Lemexe = lexeme; + token->Value.Directive = Store; + + return token; + } Token* token = CreateToken(Line, IdentifierClass);