Begin working on an initial implementation for the parser.
This commit is contained in:
parent
6d836a5513
commit
0958ecd1eb
|
@ -9,7 +9,9 @@ enum libab_result {
|
||||||
LIBAB_SUCCESS,
|
LIBAB_SUCCESS,
|
||||||
LIBAB_MALLOC,
|
LIBAB_MALLOC,
|
||||||
LIBAB_BAD_PATTERN,
|
LIBAB_BAD_PATTERN,
|
||||||
LIBAB_FAILED_MATCH
|
LIBAB_FAILED_MATCH,
|
||||||
|
LIBAB_EOF,
|
||||||
|
LIBAB_UNEXPECTED
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum libab_result libab_result;
|
typedef enum libab_result libab_result;
|
||||||
|
|
52
src/parser.c
52
src/parser.c
|
@ -1,3 +1,9 @@
|
||||||
|
#include "libabacus.h"
|
||||||
|
#include "parser.h"
|
||||||
|
#include "libabacus_util.h"
|
||||||
|
#include "lexer.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
struct parser_state {
|
struct parser_state {
|
||||||
ll_node* current_node;
|
ll_node* current_node;
|
||||||
lexer_match* current_match;
|
lexer_match* current_match;
|
||||||
|
@ -20,10 +26,56 @@ void _parser_state_step(struct parser_state* state) {
|
||||||
}
|
}
|
||||||
_parser_state_update(state);
|
_parser_state_update(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int _parser_is_char(struct parser_state* state, char to_expect) {
|
||||||
|
return (state->current_match && state->current_match->type == TOKEN_CHAR &&
|
||||||
|
state->string[state->current_match->from] == to_expect);
|
||||||
|
}
|
||||||
|
|
||||||
|
int _parser_eof(struct parser_state* state) {
|
||||||
|
return state->current_match == NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
libab_result _parser_consume_char(struct parser_state* state, char to_consume) {
|
||||||
|
libab_result result = LIBAB_SUCCESS;
|
||||||
|
if(state->current_match == NULL) {
|
||||||
|
result = LIBAB_EOF;
|
||||||
|
} else if(state->current_match->type != TOKEN_CHAR ||
|
||||||
|
state->string[state->current_match->from] != to_consume) {
|
||||||
|
result = LIBAB_UNEXPECTED;
|
||||||
|
} else {
|
||||||
|
_parser_state_step(state);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
libab_result _parse_block(struct parser_state* state,
|
||||||
|
tree** store_into, int expect_braces) {
|
||||||
|
libab_result result = LIBAB_SUCCESS;
|
||||||
|
*store_into = malloc(sizeof(**store_into));
|
||||||
|
if(*store_into == NULL) result = LIBAB_MALLOC;
|
||||||
|
|
||||||
|
if(expect_braces && result == LIBAB_SUCCESS) result = _parser_consume_char(state, '{');
|
||||||
|
|
||||||
|
while(result == LIBAB_SUCCESS &&
|
||||||
|
!_parser_eof(state) &&
|
||||||
|
!(expect_braces && _parser_is_char(state, '}'))) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if(expect_braces && result == LIBAB_SUCCESS) result = _parser_consume_char(state, '}');
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
libab_result parse_tokens(ll* tokens, const char* string, tree** store_into) {
|
libab_result parse_tokens(ll* tokens, const char* string, tree** store_into) {
|
||||||
libab_result result = LIBAB_SUCCESS;
|
libab_result result = LIBAB_SUCCESS;
|
||||||
struct parser_state state;
|
struct parser_state state;
|
||||||
_parser_state_init(&state, tokens, string);
|
_parser_state_init(&state, tokens, string);
|
||||||
|
|
||||||
|
result = _parse_block(&state, store_into, 0);
|
||||||
|
if(result == LIBAB_SUCCESS) {
|
||||||
|
(*store_into)->variant = BASE;
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user