Rework: moved ASTNodeArray logic to it's own c file
This commit is contained in:
@@ -59,7 +59,6 @@ typedef struct {
|
|||||||
ASTNode *data;
|
ASTNode *data;
|
||||||
} ASTNodeArray;
|
} ASTNodeArray;
|
||||||
|
|
||||||
// Basic array functionality
|
|
||||||
ASTNodeArray ASTNodeArray_init(size_t size);
|
ASTNodeArray ASTNodeArray_init(size_t size);
|
||||||
void ASTNodeArray_free(ASTNodeArray *arr);
|
void ASTNodeArray_free(ASTNodeArray *arr);
|
||||||
ASTNodeArrayErr ASTNodeArray_push(ASTNodeArray *arr, ASTNode node);
|
ASTNodeArrayErr ASTNodeArray_push(ASTNodeArray *arr, ASTNode node);
|
||||||
|
|||||||
108
src/ASTNodeArray.c
Normal file
108
src/ASTNodeArray.c
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
#include "lexer.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define NODE_ARRAY_DEFAULT_SIZE 64
|
||||||
|
// Helps state machine for the lexer :)
|
||||||
|
typedef enum {
|
||||||
|
WAIT_FOR_NUMBER,
|
||||||
|
WAIT_FOR_OPERATOR,
|
||||||
|
} LexerState;
|
||||||
|
|
||||||
|
ASTNodeArray ASTNodeArray_init(size_t size) {
|
||||||
|
ASTNodeArray new;
|
||||||
|
new.len = 0; // if 0 then use default
|
||||||
|
new.cap = size == 0 ? NODE_ARRAY_DEFAULT_SIZE : size;
|
||||||
|
new.data = malloc(new.cap * sizeof(ASTNode));
|
||||||
|
return new;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ASTNodeArray_free(ASTNodeArray *arr) {
|
||||||
|
free(arr->data);
|
||||||
|
arr->cap = 0;
|
||||||
|
arr->len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASTNodeArrayErr ASTNodeArray_get(const ASTNodeArray *arr, size_t index, ASTNode *out) {
|
||||||
|
if (arr == NULL) {
|
||||||
|
return ARRAY_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (out == NULL) {
|
||||||
|
return ARRAY_NULL_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arr->len == 0) {
|
||||||
|
return ARRAY_EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index >= arr->len) {
|
||||||
|
return ARRAY_OUT_OF_BOUNDS;
|
||||||
|
}
|
||||||
|
|
||||||
|
*out = arr->data[index];
|
||||||
|
|
||||||
|
return ARRAY_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASTNodeArrayErr ASTNodeArray_push(ASTNodeArray *arr, ASTNode node) {
|
||||||
|
if (arr == NULL) {
|
||||||
|
return ARRAY_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arr->len >= arr->cap) {
|
||||||
|
size_t new_cap = arr->cap * 2;
|
||||||
|
ASTNode *tmp = realloc(arr->data, new_cap * sizeof(ASTNode));
|
||||||
|
if (tmp == NULL) {
|
||||||
|
return ARRAY_ALLOC;
|
||||||
|
}
|
||||||
|
arr->data = tmp;
|
||||||
|
arr->cap = new_cap;
|
||||||
|
}
|
||||||
|
|
||||||
|
arr->data[arr->len] = node;
|
||||||
|
arr->len = arr->len + 1;
|
||||||
|
|
||||||
|
return ARRAY_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASTNodeArrayErr ASTNodeArray_pop(ASTNodeArray *arr, size_t index, ASTNode *out) {
|
||||||
|
if (arr == NULL) {
|
||||||
|
return ARRAY_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arr->len == 0) {
|
||||||
|
return ARRAY_EMPTY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index >= arr->len) {
|
||||||
|
return ARRAY_OUT_OF_BOUNDS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arr->cap / 4 > arr->len) {
|
||||||
|
size_t new_cap = arr->cap / 2;
|
||||||
|
ASTNode *tmp = realloc(arr->data, new_cap * sizeof(ASTNode));
|
||||||
|
if (tmp == NULL) {
|
||||||
|
return ARRAY_ALLOC;
|
||||||
|
}
|
||||||
|
arr->data = tmp;
|
||||||
|
arr->cap = new_cap;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (out != NULL) {
|
||||||
|
ASTNode node_to_delete = arr->data[index];
|
||||||
|
*out = node_to_delete;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = index; i < arr->len - 1; i++) {
|
||||||
|
arr->data[index] = arr->data[index + 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return ARRAY_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ASTNodeArray_len(ASTNodeArray *arr) {
|
||||||
|
if (arr == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return arr->len;
|
||||||
|
}
|
||||||
102
src/lexer.c
102
src/lexer.c
@@ -6,111 +6,11 @@
|
|||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
||||||
#define NODE_ARRAY_DEFAULT_SIZE 64
|
|
||||||
// Helps state machine for the lexer :)
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
WAIT_FOR_NUMBER,
|
WAIT_FOR_NUMBER,
|
||||||
WAIT_FOR_OPERATOR,
|
WAIT_FOR_OPERATOR
|
||||||
} LexerState;
|
} LexerState;
|
||||||
|
|
||||||
ASTNodeArray ASTNodeArray_init(size_t size) {
|
|
||||||
ASTNodeArray new;
|
|
||||||
new.len = 0; // if 0 then use default
|
|
||||||
new.cap = size == 0 ? NODE_ARRAY_DEFAULT_SIZE : size;
|
|
||||||
new.data = malloc(new.cap * sizeof(ASTNode));
|
|
||||||
return new;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ASTNodeArray_free(ASTNodeArray *arr) {
|
|
||||||
free(arr->data);
|
|
||||||
arr->cap = 0;
|
|
||||||
arr->len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASTNodeArrayErr ASTNodeArray_get(const ASTNodeArray *arr, size_t index, ASTNode *out) {
|
|
||||||
if (arr == NULL) {
|
|
||||||
return ARRAY_NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (out == NULL) {
|
|
||||||
return ARRAY_NULL_ARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arr->len == 0) {
|
|
||||||
return ARRAY_EMPTY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index >= arr->len) {
|
|
||||||
return ARRAY_OUT_OF_BOUNDS;
|
|
||||||
}
|
|
||||||
|
|
||||||
*out = arr->data[index];
|
|
||||||
|
|
||||||
return ARRAY_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASTNodeArrayErr ASTNodeArray_push(ASTNodeArray *arr, ASTNode node) {
|
|
||||||
if (arr == NULL) {
|
|
||||||
return ARRAY_NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arr->len >= arr->cap) {
|
|
||||||
size_t new_cap = arr->cap * 2;
|
|
||||||
ASTNode *tmp = realloc(arr->data, new_cap * sizeof(ASTNode));
|
|
||||||
if (tmp == NULL) {
|
|
||||||
return ARRAY_ALLOC;
|
|
||||||
}
|
|
||||||
arr->data = tmp;
|
|
||||||
arr->cap = new_cap;
|
|
||||||
}
|
|
||||||
|
|
||||||
arr->data[arr->len] = node;
|
|
||||||
arr->len = arr->len + 1;
|
|
||||||
|
|
||||||
return ARRAY_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASTNodeArrayErr ASTNodeArray_pop(ASTNodeArray *arr, size_t index, ASTNode *out) {
|
|
||||||
if (arr == NULL) {
|
|
||||||
return ARRAY_NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arr->len == 0) {
|
|
||||||
return ARRAY_EMPTY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index >= arr->len) {
|
|
||||||
return ARRAY_OUT_OF_BOUNDS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (arr->cap / 4 > arr->len) {
|
|
||||||
size_t new_cap = arr->cap / 2;
|
|
||||||
ASTNode *tmp = realloc(arr->data, new_cap * sizeof(ASTNode));
|
|
||||||
if (tmp == NULL) {
|
|
||||||
return ARRAY_ALLOC;
|
|
||||||
}
|
|
||||||
arr->data = tmp;
|
|
||||||
arr->cap = new_cap;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (out != NULL) {
|
|
||||||
ASTNode node_to_delete = arr->data[index];
|
|
||||||
*out = node_to_delete;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t i = index; i < arr->len - 1; i++) {
|
|
||||||
arr->data[index] = arr->data[index + 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
return ARRAY_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t ASTNodeArray_len(ASTNodeArray *arr) {
|
|
||||||
if (arr == NULL) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return arr->len;
|
|
||||||
}
|
|
||||||
|
|
||||||
LexerErr tokenize(const char *input, ASTNodeArray *out) {
|
LexerErr tokenize(const char *input, ASTNodeArray *out) {
|
||||||
size_t offset = 0;
|
size_t offset = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user