From a9a50055a4222fc1a79f78c50c623556e9f6ea6c Mon Sep 17 00:00:00 2001 From: Garritt McCune Date: Wed, 29 Mar 2023 20:57:04 -0500 Subject: [PATCH] Updated the parser to validate most of the opcodes. NOP falls through via the default case since it takes no parameters but the jump instructions need some thought before proceeding. --- misc/test.asm | 8 ++++- src/parser.c | 85 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 72 insertions(+), 21 deletions(-) diff --git a/misc/test.asm b/misc/test.asm index 43c9fee..a4bf49d 100644 --- a/misc/test.asm +++ b/misc/test.asm @@ -11,4 +11,10 @@ load byte r1, r3 load r1, 5 load r3, r4 store byte r3, r5 -store r5, r7 \ No newline at end of file +store r5, r7 +cmp r1, r4 +cmp r1, 5 +and r1, r2 +add r4, r7 +inc r1 ;increment r1 +xor r1, r1 ;clear self \ No newline at end of file diff --git a/src/parser.c b/src/parser.c index 0c9d272..da1e990 100644 --- a/src/parser.c +++ b/src/parser.c @@ -13,6 +13,7 @@ int CurrentToken = 0; void PrintSymbols(void); void RemoveCurrentToken(void); void HandleAssemblerDirective(void); +void HandleOpcode(void); void AdvanceParser(void); void IgnoreParserLine(void); Token* PeekToken(void); @@ -45,7 +46,7 @@ IRState* ParseTokens(List* tokens) { HandleAssemblerDirective(); break; case MnemonicClass: - //HandleOperation(); + HandleOpcode(); break; case LabelClass: { @@ -207,6 +208,69 @@ void HandleAssemblerDirective() { } } +void HandleOpcode(void) { + Token* opcode = PeekToken(); + + AdvanceParser(); + + switch(opcode->Value.Mnemonic) { + case CMP: + { + ExpectRegister(); + + ExpectPuncuation(Comma, ForwardParser); + + TokenClass class = PeekToken()->Class; + + if (class == NumberClass) { + opcode->Value.Mnemonic = CMPI; + opcode->Lemexe = "CMPI"; + + AdvanceParser(); + } + else { + ExpectRegister(); + } + } + break; + case ADD: + case SUB: + case AND: + case OR: + case XOR: + ExpectRegister(); + + ExpectPuncuation(Comma, ForwardParser); + + ExpectRegister(); + break; + case SHL: + case SHR: + ExpectRegister(); + + ExpectPuncuation(Comma, ForwardParser); + + if (PeekToken()->Class != NumberClass) { + fprintf(stderr, "[Line %d] Syntax error, expected numeric literal.\n", PeekToken()->LineNumber); + + exit(12); + } + + AdvanceParser(); + break; + case INC: + case DEC: + case PUSH: + case POP: + ExpectRegister(); + break; + default: + break; + } + + ExpectLineEndOrFileEnd(ForwardParser); +} + void ExpectPuncuation(TokenPunctuation punctuation, ExpectOptions options) { Token* token = PeekToken(); @@ -320,25 +384,6 @@ void PrintSymbols(void) { printf("[%s] %s [%d] [Width: %d]", symbol->Resolved == 0 ? "Unresolved" : "Resolved", symbol->Name, symbol->Address, symbol->Length); - // switch(symbol->Type) { - // case InstructionPointerSymbol: - // GetMnemonicText(symbol->Value.Instruction->Mnemonic, mn); - // printf("%s -> %s", symbol->Name, mn); - // break; - // case NumericSymbol: - // printf("[N] %s Value: %d", symbol->Name, symbol->Value.Number); - // break; - // case StringSymbol: - // if (symbol->Value.String->Terminated) - // printf("[S] %s {%s}, %d", symbol->Name, symbol->Value.String->String, symbol->Value.String->TerminatingByte); - // else - // printf("[S] %s {%s}", symbol->Name, symbol->Value.String->String); - // break; - // case UnresolvedSymbol: - // printf("[U] %s", symbol->Name); - // break; - // } - printf("\n"); } printf("-----SYMBOLS-----\n");