Make token reporting work for EOF.
This commit is contained in:
parent
919cfb495c
commit
160c0a93da
15
src/parser.c
15
src/parser.c
|
@ -8,6 +8,7 @@
|
||||||
struct parser_state {
|
struct parser_state {
|
||||||
ll_node* current_node;
|
ll_node* current_node;
|
||||||
libab_lexer_match* current_match;
|
libab_lexer_match* current_match;
|
||||||
|
libab_lexer_match* last_match;
|
||||||
const char* string;
|
const char* string;
|
||||||
libab_table* base_table;
|
libab_table* base_table;
|
||||||
};
|
};
|
||||||
|
@ -34,10 +35,12 @@ libab_result _parser_extract_token(struct parser_state* state, char** into, liba
|
||||||
// State functions
|
// State functions
|
||||||
void _parser_state_update(struct parser_state* state) {
|
void _parser_state_update(struct parser_state* state) {
|
||||||
state->current_match = state->current_node ? state->current_node->data : NULL;
|
state->current_match = state->current_node ? state->current_node->data : NULL;
|
||||||
|
if(state->current_match) state->last_match = state->current_match;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _parser_state_init(struct parser_state* state,
|
void _parser_state_init(struct parser_state* state,
|
||||||
ll* tokens, const char* string, libab_table* table) {
|
ll* tokens, const char* string, libab_table* table) {
|
||||||
|
state->last_match = NULL;
|
||||||
state->current_node = tokens->head;
|
state->current_node = tokens->head;
|
||||||
state->string = string;
|
state->string = string;
|
||||||
state->base_table = table;
|
state->base_table = table;
|
||||||
|
@ -99,7 +102,7 @@ libab_result _parser_allocate_node(struct parser_state* state, libab_lexer_match
|
||||||
libab_result result = LIBAB_SUCCESS;
|
libab_result result = LIBAB_SUCCESS;
|
||||||
if(((*into) = malloc(sizeof(**into))) == NULL) {
|
if(((*into) = malloc(sizeof(**into))) == NULL) {
|
||||||
result = LIBAB_MALLOC;
|
result = LIBAB_MALLOC;
|
||||||
} else {
|
} else if(match) {
|
||||||
(*into)->from = match->from;
|
(*into)->from = match->from;
|
||||||
(*into)->to = match->to;
|
(*into)->to = match->to;
|
||||||
(*into)->line = match->line;
|
(*into)->line = match->line;
|
||||||
|
@ -174,7 +177,7 @@ libab_result _parse_if(struct parser_state* state, libab_tree** store_into) {
|
||||||
_parser_state_step(state);
|
_parser_state_step(state);
|
||||||
result = _parse_expression(state, &else_branch);
|
result = _parse_expression(state, &else_branch);
|
||||||
} else {
|
} else {
|
||||||
result = _parser_allocate_node(state, state->current_match, &else_branch);
|
result = _parser_allocate_node(state, state->last_match, &else_branch);
|
||||||
if(result == LIBAB_SUCCESS) else_branch->variant = VOID;
|
if(result == LIBAB_SUCCESS) else_branch->variant = VOID;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -182,7 +185,7 @@ libab_result _parse_if(struct parser_state* state, libab_tree** store_into) {
|
||||||
if(result == LIBAB_SUCCESS) {
|
if(result == LIBAB_SUCCESS) {
|
||||||
result = libab_convert_ds_result(vec_add(&(*store_into)->children, condition));
|
result = libab_convert_ds_result(vec_add(&(*store_into)->children, condition));
|
||||||
if(result == LIBAB_SUCCESS) {
|
if(result == LIBAB_SUCCESS) {
|
||||||
result = libab_convert_ds_result(vec_add(&(*store_into)->children, if_branch));
|
result = libab_convert_ds_result(vec_add(&(*store_into)->children, if_branch));
|
||||||
}
|
}
|
||||||
if(result == LIBAB_SUCCESS) {
|
if(result == LIBAB_SUCCESS) {
|
||||||
result = libab_convert_ds_result(vec_add(&(*store_into)->children, else_branch));
|
result = libab_convert_ds_result(vec_add(&(*store_into)->children, else_branch));
|
||||||
|
@ -258,7 +261,7 @@ libab_result _parser_append_op_node(struct parser_state* state, libab_lexer_matc
|
||||||
libab_tree_free(new_tree);
|
libab_tree_free(new_tree);
|
||||||
free(new_tree);
|
free(new_tree);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -452,7 +455,7 @@ libab_result _parse_expression(struct parser_state* state, libab_tree** store_in
|
||||||
}
|
}
|
||||||
|
|
||||||
if(result == LIBAB_SUCCESS && *store_into == NULL) {
|
if(result == LIBAB_SUCCESS && *store_into == NULL) {
|
||||||
result = LIBAB_UNEXPECTED;
|
result = LIBAB_UNEXPECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
ll_free(&op_stack);
|
ll_free(&op_stack);
|
||||||
|
@ -490,7 +493,7 @@ libab_result _parse_block(struct parser_state* state,
|
||||||
}
|
}
|
||||||
|
|
||||||
if(result == LIBAB_SUCCESS && temp == NULL) {
|
if(result == LIBAB_SUCCESS && temp == NULL) {
|
||||||
result = _parser_allocate_node(state, state->current_match, &temp);
|
result = _parser_allocate_node(state, state->last_match, &temp);
|
||||||
if(result == LIBAB_SUCCESS) {
|
if(result == LIBAB_SUCCESS) {
|
||||||
temp->variant = VOID;
|
temp->variant = VOID;
|
||||||
result = libab_convert_ds_result(vec_add(&(*store_into)->children, temp));
|
result = libab_convert_ds_result(vec_add(&(*store_into)->children, temp));
|
||||||
|
|
Loading…
Reference in New Issue
Block a user