Add support for the return keyword.
This commit is contained in:
parent
f3f1cc8c43
commit
bb61dbcd54
|
@ -64,6 +64,7 @@ enum libab_lexer_token_e {
|
|||
TOKEN_KW_DO,
|
||||
TOKEN_KW_ARROW,
|
||||
TOKEN_KW_FUN,
|
||||
TOKEN_KW_RETURN,
|
||||
TOKEN_LAST
|
||||
};
|
||||
|
||||
|
|
|
@ -22,7 +22,8 @@ enum libab_tree_variant_e {
|
|||
TREE_DOWHILE,
|
||||
TREE_CALL,
|
||||
TREE_FUN,
|
||||
TREE_FUN_PARAM
|
||||
TREE_FUN_PARAM,
|
||||
TREE_RETURN
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -17,7 +17,8 @@ const char* _debug_node_name(libab_tree_variant var) {
|
|||
"dowhile",
|
||||
"call",
|
||||
"fun",
|
||||
"fun_param"
|
||||
"fun_param",
|
||||
"return"
|
||||
};
|
||||
return names[var];
|
||||
}
|
||||
|
|
|
@ -16,7 +16,8 @@ libab_result libab_lexer_init(libab_lexer* lexer) {
|
|||
"while",
|
||||
"do",
|
||||
"->",
|
||||
"fun"
|
||||
"fun",
|
||||
"return"
|
||||
};
|
||||
libab_lexer_token tokens[] = {
|
||||
TOKEN_CHAR,
|
||||
|
@ -27,7 +28,8 @@ libab_result libab_lexer_init(libab_lexer* lexer) {
|
|||
TOKEN_KW_WHILE,
|
||||
TOKEN_KW_DO,
|
||||
TOKEN_KW_ARROW,
|
||||
TOKEN_KW_FUN
|
||||
TOKEN_KW_FUN,
|
||||
TOKEN_KW_RETURN
|
||||
};
|
||||
const size_t count = sizeof(tokens)/sizeof(libab_lexer_token);
|
||||
|
||||
|
|
27
src/parser.c
27
src/parser.c
|
@ -467,6 +467,31 @@ libab_result _parse_fun(struct parser_state* state, libab_tree** store_into) {
|
|||
return result;
|
||||
}
|
||||
|
||||
libab_result _parse_return(struct parser_state* state, libab_tree** store_into) {
|
||||
libab_result result = LIBAB_SUCCESS;
|
||||
libab_tree* child = NULL;
|
||||
if(_parser_is_type(state, TOKEN_KW_RETURN)) {
|
||||
result = _parser_construct_node_vec(state->current_match, store_into);
|
||||
if(result == LIBAB_SUCCESS) {
|
||||
(*store_into)->variant = TREE_RETURN;
|
||||
_parser_state_step(state);
|
||||
}
|
||||
} else {
|
||||
result = LIBAB_UNEXPECTED;
|
||||
}
|
||||
|
||||
if(result == LIBAB_SUCCESS) {
|
||||
PARSE_CHILD(result, state, _parse_expression, child, &(*store_into)->children);
|
||||
}
|
||||
|
||||
if(result != LIBAB_SUCCESS) {
|
||||
if(*store_into) libab_tree_free_recursive(*store_into);
|
||||
*store_into = NULL;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
libab_result _parse_while(struct parser_state* state, libab_tree** store_into) {
|
||||
libab_result result = LIBAB_SUCCESS;
|
||||
libab_tree* condition = NULL;
|
||||
|
@ -610,6 +635,8 @@ libab_result _parse_atom(struct parser_state* state, libab_tree** store_into) {
|
|||
result = _parse_braced_block(state, store_into);
|
||||
} else if(_parser_is_type(state, TOKEN_KW_FUN)) {
|
||||
result = _parse_fun(state, store_into);
|
||||
} else if(_parser_is_type(state, TOKEN_KW_RETURN)) {
|
||||
result = _parse_return(state, store_into);
|
||||
} else {
|
||||
result = LIBAB_UNEXPECTED;
|
||||
}
|
||||
|
|
|
@ -5,7 +5,8 @@ int libab_tree_has_vector(libab_tree_variant variant) {
|
|||
return variant == TREE_BASE || variant == TREE_OP ||
|
||||
variant == TREE_UNARY_OP || variant == TREE_BLOCK ||
|
||||
variant == TREE_IF || variant == TREE_CALL || variant == TREE_WHILE ||
|
||||
variant == TREE_DOWHILE || variant == TREE_FUN;
|
||||
variant == TREE_DOWHILE || variant == TREE_FUN ||
|
||||
variant == TREE_RETURN;
|
||||
}
|
||||
|
||||
int libab_tree_has_string(libab_tree_variant variant) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user