Parsing expressions

This commit is contained in:
Krzosa Karol
2022-05-06 11:28:34 +02:00
parent e3b5e9b33a
commit 9552126da2
5 changed files with 384 additions and 32 deletions

View File

@@ -1,6 +1,7 @@
typedef struct Token_Bucket Token_Bucket;
typedef struct Token_Array Token_Array;
global Token token_end_of_stream;
struct Token_Bucket{
Token_Bucket *next;
@@ -36,8 +37,10 @@ token_array_make(Arena *arena){
Token_Array result = {
.last = &result.first,
.arena = arena,
.interns = intern_table(arena, 4096*4)
.interns = intern_table(arena, 4096*4),
.iter_bucket = &result.first
};
return result;
}
@@ -52,16 +55,10 @@ token_array_push(Token_Array *array, Token *p){
array->last->data[array->len++] = *p;
}
function B32
token_array_iter_is_end(Token_Array *array){
B32 result = array->iter_len == array->len && array->iter_block == array->block;
return result;
}
function Token *
token_array_iter_next(Token_Array *array){
if(token_array_iter_is_end(array)){
return 0;
if((array->iter_len >= array->len) && (array->iter_block >= array->block)){
return &token_end_of_stream;
}
if(array->iter_len >= buff_cap(array->first.data)){
array->iter_len = 0;
@@ -75,16 +72,24 @@ token_array_iter_next(Token_Array *array){
function Token *
token_array_iter_peek(Token_Array *array, S64 i){
S64 save_len = array->iter_len;
S64 save_block = array->iter_block;
Token_Bucket *save_bucket = array->iter_bucket;
assert(i < buff_cap(array->first.data));
S64 over = i;
if(array->iter_len + i >= buff_cap(array->first.data)){
over = buff_cap(array->first.data) - (array->iter_len + i);
array->iter_len = 0;
array->iter_len = 0;
array->iter_block += 1;
array->iter_bucket = array->iter_bucket->next;
}
Token *result = array->iter_bucket->data + array->iter_len + over;
over = array->iter_len + over;
if(over == array->len && array->iter_block == array->block){
return &token_end_of_stream;
}
Token *result = array->iter_bucket->data + over;
array->iter_len = save_len;
array->iter_bucket = save_bucket;
return result;