Add true and false keywords to the parser.
This commit is contained in:
parent
7c8c547540
commit
3b79b5751a
@ -60,6 +60,8 @@ enum libab_lexer_token_e {
|
|||||||
TOKEN_OP_PREFIX,
|
TOKEN_OP_PREFIX,
|
||||||
TOKEN_OP_POSTFIX,
|
TOKEN_OP_POSTFIX,
|
||||||
TOKEN_OP_RESERVED,
|
TOKEN_OP_RESERVED,
|
||||||
|
TOKEN_KW_TRUE,
|
||||||
|
TOKEN_KW_FALSE,
|
||||||
TOKEN_KW_IF,
|
TOKEN_KW_IF,
|
||||||
TOKEN_KW_ELSE,
|
TOKEN_KW_ELSE,
|
||||||
TOKEN_KW_WHILE,
|
TOKEN_KW_WHILE,
|
||||||
|
@ -19,6 +19,8 @@ enum libab_tree_variant_e {
|
|||||||
TREE_POSTFIX_OP,
|
TREE_POSTFIX_OP,
|
||||||
TREE_BLOCK,
|
TREE_BLOCK,
|
||||||
TREE_VOID,
|
TREE_VOID,
|
||||||
|
TREE_TRUE,
|
||||||
|
TREE_FALSE,
|
||||||
TREE_IF,
|
TREE_IF,
|
||||||
TREE_WHILE,
|
TREE_WHILE,
|
||||||
TREE_DOWHILE,
|
TREE_DOWHILE,
|
||||||
|
@ -1208,6 +1208,10 @@ libab_result _interpreter_run(struct interpreter_state* state, libab_tree* tree,
|
|||||||
vec_index(&tree->children, 0),
|
vec_index(&tree->children, 0),
|
||||||
vec_index(&tree->children, 1),
|
vec_index(&tree->children, 1),
|
||||||
into);
|
into);
|
||||||
|
} else if(tree->variant == TREE_TRUE) {
|
||||||
|
libab_get_true_value(state->ab, into);
|
||||||
|
} else if(tree->variant == TREE_FALSE) {
|
||||||
|
libab_get_false_value(state->ab, into);
|
||||||
} else {
|
} else {
|
||||||
libab_get_unit_value(state->ab, into);
|
libab_get_unit_value(state->ab, into);
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,8 @@ libab_result libab_lexer_init(libab_lexer* lexer) {
|
|||||||
const char* words[] = {".",
|
const char* words[] = {".",
|
||||||
"[a-zA-Z][a-zA-Z0-9_]*",
|
"[a-zA-Z][a-zA-Z0-9_]*",
|
||||||
"[0-9]+(\\.[0-9]*)?",
|
"[0-9]+(\\.[0-9]*)?",
|
||||||
|
"true",
|
||||||
|
"false",
|
||||||
"if",
|
"if",
|
||||||
"else",
|
"else",
|
||||||
"while",
|
"while",
|
||||||
@ -18,9 +20,9 @@ libab_result libab_lexer_init(libab_lexer* lexer) {
|
|||||||
"fun",
|
"fun",
|
||||||
"return"};
|
"return"};
|
||||||
libab_lexer_token tokens[] = {
|
libab_lexer_token tokens[] = {
|
||||||
TOKEN_CHAR, TOKEN_ID, TOKEN_NUM, TOKEN_KW_IF,
|
TOKEN_CHAR, TOKEN_ID, TOKEN_NUM, TOKEN_KW_TRUE,
|
||||||
TOKEN_KW_ELSE, TOKEN_KW_WHILE, TOKEN_KW_DO, TOKEN_KW_ARROW,
|
TOKEN_KW_FALSE, TOKEN_KW_IF, TOKEN_KW_ELSE, TOKEN_KW_WHILE,
|
||||||
TOKEN_KW_FUN, TOKEN_KW_RETURN };
|
TOKEN_KW_DO, TOKEN_KW_ARROW, TOKEN_KW_FUN, TOKEN_KW_RETURN};
|
||||||
const size_t count = sizeof(tokens) / sizeof(libab_lexer_token);
|
const size_t count = sizeof(tokens) / sizeof(libab_lexer_token);
|
||||||
|
|
||||||
eval_config_init(&lexer->config);
|
eval_config_init(&lexer->config);
|
||||||
|
36
src/parser.c
36
src/parser.c
@ -406,6 +406,38 @@ libab_result _parse_void(struct parser_state* state, libab_tree** store_into) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
libab_result _parse_true(struct parser_state* state, libab_tree** store_into) {
|
||||||
|
libab_result result = _parser_consume_type(state, TOKEN_KW_TRUE);
|
||||||
|
if(result == LIBAB_SUCCESS) {
|
||||||
|
if ((*store_into = malloc(sizeof(**store_into)))) {
|
||||||
|
(*store_into)->variant = TREE_TRUE;
|
||||||
|
} else {
|
||||||
|
result = LIBAB_MALLOC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(result != LIBAB_SUCCESS) {
|
||||||
|
*store_into = NULL;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
libab_result _parse_false(struct parser_state* state, libab_tree** store_into) {
|
||||||
|
libab_result result = _parser_consume_type(state, TOKEN_KW_FALSE);
|
||||||
|
if(result == LIBAB_SUCCESS) {
|
||||||
|
if ((*store_into = malloc(sizeof(**store_into)))) {
|
||||||
|
(*store_into)->variant = TREE_FALSE;
|
||||||
|
} else {
|
||||||
|
result = LIBAB_MALLOC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(result != LIBAB_SUCCESS) {
|
||||||
|
*store_into = NULL;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
libab_result _parse_if(struct parser_state* state, libab_tree** store_into) {
|
libab_result _parse_if(struct parser_state* state, libab_tree** store_into) {
|
||||||
libab_result result = LIBAB_SUCCESS;
|
libab_result result = LIBAB_SUCCESS;
|
||||||
libab_tree* condition = NULL;
|
libab_tree* condition = NULL;
|
||||||
@ -736,6 +768,10 @@ libab_result _parse_atom(struct parser_state* state, libab_tree** store_into) {
|
|||||||
result = _parse_fun(state, store_into);
|
result = _parse_fun(state, store_into);
|
||||||
} else if (_parser_is_type(state, TOKEN_KW_RETURN)) {
|
} else if (_parser_is_type(state, TOKEN_KW_RETURN)) {
|
||||||
result = _parse_return(state, store_into);
|
result = _parse_return(state, store_into);
|
||||||
|
} else if (_parser_is_type(state, TOKEN_KW_TRUE)) {
|
||||||
|
result = _parse_true(state, store_into);
|
||||||
|
} else if (_parser_is_type(state, TOKEN_KW_FALSE)) {
|
||||||
|
result = _parse_false(state, store_into);
|
||||||
} else {
|
} else {
|
||||||
result = LIBAB_UNEXPECTED;
|
result = LIBAB_UNEXPECTED;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user