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.
This commit is contained in:
+7
-1
@@ -11,4 +11,10 @@ load byte r1, r3
|
||||
load r1, 5
|
||||
load r3, r4
|
||||
store byte r3, r5
|
||||
store r5, r7
|
||||
store r5, r7
|
||||
cmp r1, r4
|
||||
cmp r1, 5
|
||||
and r1, r2
|
||||
add r4, r7
|
||||
inc r1 ;increment r1
|
||||
xor r1, r1 ;clear self
|
||||
+65
-20
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user