Reworked the tokens to include a broad class to make parameter matching a bit easier, and removed the hexadecimal distinction.

This commit is contained in:
2022-05-12 20:26:14 +00:00
parent 72abf6c4ab
commit 72525959f6
6 changed files with 94 additions and 34 deletions
+43 -6
View File
@@ -1,4 +1,5 @@
#include "../includes/parser.h"
#include <stdarg.h>
#ifndef HIGHMEMORY
#define HIGHMEMORY 65535 //64KiB - 1 AKA 0xFFFF
@@ -10,13 +11,24 @@ typedef struct {
} Symbol;
Symbol* CreateSymbol(Token*, int);
const List* TokensList;
int CurrentToken = 0;
void AddSymbol(Token*, int);
void PrintSymbols(void);
void HandleOperation(Token*);
void AdvanceParser(void);
Token* PeekToken(void);
int Expect(int, ...);
Token* GetSymbol(char*);
List* SymbolsTable;
unsigned int ProgramCounter = 0;
void ParseTokens(List* tokens) {
if (!tokens) return;
TokensList = tokens;
SymbolsTable = CreateList();
for(int i = 0; i < tokens->size; i++){
@@ -30,12 +42,13 @@ void ParseTokens(List* tokens) {
case STRING:
ProgramCounter += strlen(t->lexeme);
break;
case NUMBER:
case HEX: //Number's will be 2 bytes
case NUMBER: //Number's will be 2 bytes
ProgramCounter += 2;
break;
default: //Instructions are 1 byte wide.
if (IsOpcode(t->lexeme, NULL)) ProgramCounter += 1;
if (t->token_class == Opcode) {
ProgramCounter++;
}
break;
}
@@ -46,6 +59,32 @@ void ParseTokens(List* tokens) {
printf("Program Counter: %d\n", ProgramCounter);
}
void HandleOperation(Token* token) {
const Instruction* inst = GetOpcodeDetails(token->type);
if (!inst) return;
}
int Expect(int count, ...) {
va_list list;
va_start(list, count);
for(int i = 0; i < count; i++) {
if (va_arg(list, TokenClass) == PeekToken()->token_class) {
va_end(list);
//advance
return 1;
}
}
va_end(list);
return 0;
}
void PrintSymbols(void) {
printf("-----SYMBOLS-----\n");
for(int i = 0; i < SymbolsTable->size; i++) {
@@ -79,9 +118,7 @@ Token* GetSymbol(char* name) {
Symbol* CreateSymbol(Token* token, int address) {
Symbol* symbol = calloc(1, sizeof(Symbol));
if (!symbol) {
return NULL;
}
if (!symbol) return NULL;
symbol->token = token;
symbol->address = address;