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:
+43
-6
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user