working on the parser module

This commit is contained in:
2021-05-03 17:23:48 +02:00
parent d20663ac7e
commit 38e3bb1630
2 changed files with 33 additions and 59 deletions

View File

@@ -1,6 +1,7 @@
#include "parser.h"
#include "tokenizer.h"
#include "error.h"
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -13,6 +14,7 @@
#define MAX_CONSTANTS 256
#define MAX_STRUCT_MEMBERS 10
/*
struct t_variable {
char name[MAX_IDENTIFIER_LENGTH];
int type;
@@ -29,6 +31,7 @@ struct t_struct {
struct t_scope {
};
*/
struct t_label {
char name[MAX_IDENTIFIER_LENGTH];
@@ -59,9 +62,9 @@ struct t_constant {
};*/
static byte* code; // [MAX_CODE_SIZE];
static word codepos = 0;
static word lines[32768];
static word current_line;
static uint32_t codepos = 0;
static uint32_t lines[32768];
static uint32_t current_line;
//static t_label known_labels[MAX_LABELS];
//static int num_known_labels = 0;
@@ -72,6 +75,7 @@ static int num_anonymous_labels = 0;
static char* breaklabel = nullptr;
static char* contlabel = nullptr;
/*
static t_variable* variables = nullptr;
static int num_variables = 0;
static bool variable_is_array = false;
@@ -82,10 +86,11 @@ static int num_external_functions = 0;
static t_string strings[256];
static int num_strings = 0;
static bool parser_finished = false;
static t_constant constants[MAX_CONSTANTS];
static int num_constants;
*/
static bool parser_finished = false;
/****************************************************************************************/
/* GENERIC FUNCTIONS */
@@ -118,6 +123,14 @@ static void emmit_w(const word value) {
code[codepos++] = value >> 8;
}
static void emmit_dw(const uint32_t value) {
byte *v = (byte*)&value;
lines[codepos] = current_line; code[codepos++] = *(v++);
lines[codepos] = current_line; code[codepos++] = *(v++);
lines[codepos] = current_line; code[codepos++] = *(v++);
lines[codepos] = current_line; code[codepos++] = *(v++);
}
static void emmit_f(const float value) {
byte *v = (byte*)&value;
lines[codepos] = current_line; code[codepos++] = *(v++);
@@ -126,62 +139,23 @@ static void emmit_f(const float value) {
lines[codepos] = current_line; code[codepos++] = *(v++);
}
static void patch(const word address, const word dest) {
static void patch(const uint32_t address, const word dest) {
code[address] = dest & 255;
code[address + 1] = dest >> 8;
}
static const word get_current_address() {
static void patch_dw(const uint32_t address, const uint32_t dest) {
byte *v = (byte*)&dest;
code[address] = v[0];
code[address+1] = v[1];
code[address+2] = v[2];
code[address+3] = v[3];
}
static const uint32_t get_current_address() {
return codepos;
}
/****************************************************************************************/
/* VARIABLE MANAGEMENT */
/****************************************************************************************/
static int get_variable_index(const char* string, const int array_size = 1) {
t_variable* variable = variables;
t_variable* last = variables;
while (variable != nullptr) {
if (strcmp(variable->name, string) == 0) { variable_is_array = (variable->size > 1); return variable->index + 0xC000; }
last = variable;
variable = variable->next;
}
t_variable* newvar = (t_variable*)malloc(sizeof(t_variable));
//newvar->name = (char*)malloc(strlen(string) + 1);
strcpy(newvar->name, string);
newvar->index = num_variables;
num_variables += array_size;
newvar->size = array_size;
variable_is_array = (newvar->size > 1);
newvar->next = nullptr;
if (last != nullptr) {
last->next = newvar;
}
else {
variables = newvar;
}
return newvar->index + 0xC000;
}
static bool is_variable_array() { return variable_is_array; }
/****************************************************************************************/
/* CONSTANT MANAGEMENT */
/****************************************************************************************/
void parser_register_constant(const char* name, const unsigned char value) {
strcpy(constants[num_constants].name, name);
constants[num_constants++].value = value;
}
static const int get_constant(const char* name) {
for (int i = 0; i < num_constants; i++) {
if (strcmp(constants[i].name, name) == 0)
return constants[i].value;
}
return -1;
}
/****************************************************************************************/
/* LABEL MANAGEMENT */
/****************************************************************************************/

View File

@@ -41,10 +41,10 @@ enum OPS {
};
void parser_parse(const char* buffer, unsigned char* mem);
const int parser_get_codesize();
const int parser_get_memory_usage();
unsigned short* parser_get_lines();
//const int parser_get_codesize();
//const int parser_get_memory_usage();
//unsigned short* parser_get_lines();
void parser_register_external_function(const char* name, const char* parameters, void (*fun)(void));
//void parser_register_external_function(const char* name, const char* parameters, void (*fun)(void));
void parser_register_constant(const char* name, const unsigned char value);
//void parser_register_constant(const char* name, const unsigned char value);