Added support for declaring a variable with the '.db' directive. Address calculations still need to be done, but at the very least the variable's name is showing up in the symbols table.
This commit is contained in:
+77
-13
@@ -1,11 +1,14 @@
|
|||||||
#include "../includes/parser.h"
|
#include "../includes/parser.h"
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#ifndef HIGHMEMORY
|
#ifndef HIGHMEMORY
|
||||||
#define HIGHMEMORY 65535 //64KiB - 1 AKA 0xFFFF
|
#define HIGHMEMORY 65535 //64KiB - 1 AKA 0xFFFF
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define HEAPTOP HIGHMEMORY
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
Token* token;
|
Token* token;
|
||||||
int address;
|
int address;
|
||||||
@@ -18,10 +21,12 @@ int CurrentToken = 0;
|
|||||||
void AddSymbol(Token*, int);
|
void AddSymbol(Token*, int);
|
||||||
void PrintSymbols(void);
|
void PrintSymbols(void);
|
||||||
void HandleOperation(void);
|
void HandleOperation(void);
|
||||||
|
void HandleAssemblerDirective(void);
|
||||||
void AdvanceParser(void);
|
void AdvanceParser(void);
|
||||||
Token* PeekToken(void);
|
Token* PeekToken(void);
|
||||||
int ParserAtEnd(void);
|
int ParserAtEnd(void);
|
||||||
int Expect(int, ...);
|
int Expect(int, ...);
|
||||||
|
int ExpectTokenClass(int, ...);
|
||||||
Token* GetSymbol(char*);
|
Token* GetSymbol(char*);
|
||||||
List* SymbolsTable;
|
List* SymbolsTable;
|
||||||
unsigned int ProgramCounter = 0;
|
unsigned int ProgramCounter = 0;
|
||||||
@@ -53,6 +58,9 @@ void ParseTokens(List* tokens) {
|
|||||||
ProgramCounter++;
|
ProgramCounter++;
|
||||||
HandleOperation();
|
HandleOperation();
|
||||||
}
|
}
|
||||||
|
else if (t->token_class == Directive) {
|
||||||
|
HandleAssemblerDirective();
|
||||||
|
}
|
||||||
|
|
||||||
AdvanceParser();
|
AdvanceParser();
|
||||||
|
|
||||||
@@ -65,6 +73,37 @@ void ParseTokens(List* tokens) {
|
|||||||
printf("Program Counter: %d\n", ProgramCounter);
|
printf("Program Counter: %d\n", ProgramCounter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HandleAssemblerDirective(void) {
|
||||||
|
Token* token = PeekToken();
|
||||||
|
AdvanceParser();
|
||||||
|
|
||||||
|
if (token->type == DB) {
|
||||||
|
token = PeekToken();
|
||||||
|
if (!Expect(1, IDENTIFIER)) {
|
||||||
|
fprintf(stderr, "Expected identifier on line %d\n", PeekToken()->line);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
//This should be done only after the directive is parsed fully.
|
||||||
|
AddSymbol(token, HEAPTOP);
|
||||||
|
|
||||||
|
if (PeekToken()-> type == STRING) {
|
||||||
|
AdvanceParser();
|
||||||
|
|
||||||
|
if (PeekToken()-> type == COMMA) {
|
||||||
|
AdvanceParser();
|
||||||
|
if (PeekToken()-> type != NUMBER) {
|
||||||
|
fprintf(stderr, "Expected string termination byte on line %d\n", PeekToken()->line);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
// else {
|
||||||
|
// //Setup string and return
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void HandleOperation(void) {
|
void HandleOperation(void) {
|
||||||
const Instruction* inst = GetOpcodeDetails(PeekToken()->type);
|
const Instruction* inst = GetOpcodeDetails(PeekToken()->type);
|
||||||
|
|
||||||
@@ -76,6 +115,11 @@ void HandleOperation(void) {
|
|||||||
|
|
||||||
if (inst->parameter_one && PeekToken()->token_class > 0) {
|
if (inst->parameter_one && PeekToken()->token_class > 0) {
|
||||||
printf("Matched '%s'\n", PeekToken()->lexeme);
|
printf("Matched '%s'\n", PeekToken()->lexeme);
|
||||||
|
|
||||||
|
if (inst->parameter_one == Reg) {
|
||||||
|
//Encode the register number here.
|
||||||
|
}
|
||||||
|
|
||||||
AdvanceParser();
|
AdvanceParser();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,23 +142,43 @@ void HandleOperation(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// int Expect(int count, ...) {
|
int ExpectTokenClass(int count, ...) {
|
||||||
// va_list list;
|
va_list list;
|
||||||
|
Token* token = PeekToken();
|
||||||
|
|
||||||
// va_start(list, count);
|
va_start(list, count);
|
||||||
|
|
||||||
// for(int i = 0; i < count; i++) {
|
for(int i = 0; i < count; i++) {
|
||||||
// if (va_arg(list, TokenClass) == PeekToken()->token_class) {
|
if (va_arg(list, TokenClass) == token->token_class) {
|
||||||
// va_end(list);
|
va_end(list);
|
||||||
// //advance
|
AdvanceParser();
|
||||||
// return 1;
|
return 1;
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
// va_end(list);
|
va_end(list);
|
||||||
|
|
||||||
// return 0;
|
return 0;
|
||||||
// }
|
}
|
||||||
|
|
||||||
|
int Expect(int count, ...) {
|
||||||
|
va_list list;
|
||||||
|
Token* token = PeekToken();
|
||||||
|
|
||||||
|
va_start(list, count);
|
||||||
|
|
||||||
|
for(int i = 0; i < count; i++) {
|
||||||
|
if (va_arg(list, TokenType) == token->type) {
|
||||||
|
va_end(list);
|
||||||
|
AdvanceParser();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
va_end(list);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void PrintSymbols(void) {
|
void PrintSymbols(void) {
|
||||||
printf("-----SYMBOLS-----\n");
|
printf("-----SYMBOLS-----\n");
|
||||||
|
|||||||
Reference in New Issue
Block a user