Add code to parse while loops.
This commit is contained in:
parent
1d0ea602a5
commit
976b6d1b1a
@ -60,6 +60,7 @@ enum libab_lexer_token_e {
|
|||||||
TOKEN_OP_POSTFIX,
|
TOKEN_OP_POSTFIX,
|
||||||
TOKEN_KW_IF,
|
TOKEN_KW_IF,
|
||||||
TOKEN_KW_ELSE,
|
TOKEN_KW_ELSE,
|
||||||
|
TOKEN_KW_WHILE,
|
||||||
TOKEN_LAST
|
TOKEN_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ enum libab_tree_variant_e {
|
|||||||
BLOCK,
|
BLOCK,
|
||||||
VOID,
|
VOID,
|
||||||
IF,
|
IF,
|
||||||
|
WHILE,
|
||||||
CALL
|
CALL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@ const char* _debug_node_name(libab_tree_variant var) {
|
|||||||
"block",
|
"block",
|
||||||
"void",
|
"void",
|
||||||
"if",
|
"if",
|
||||||
|
"while",
|
||||||
"call"
|
"call"
|
||||||
};
|
};
|
||||||
return names[var];
|
return names[var];
|
||||||
|
@ -12,7 +12,8 @@ libab_result libab_lexer_init(libab_lexer* lexer) {
|
|||||||
"[a-zA-Z][a-zA-Z0-9_]*",
|
"[a-zA-Z][a-zA-Z0-9_]*",
|
||||||
"[0-9]+(\\.[0-9]*)?",
|
"[0-9]+(\\.[0-9]*)?",
|
||||||
"if",
|
"if",
|
||||||
"else"
|
"else",
|
||||||
|
"while",
|
||||||
};
|
};
|
||||||
libab_lexer_token tokens[] = {
|
libab_lexer_token tokens[] = {
|
||||||
TOKEN_CHAR,
|
TOKEN_CHAR,
|
||||||
@ -20,6 +21,7 @@ libab_result libab_lexer_init(libab_lexer* lexer) {
|
|||||||
TOKEN_NUM,
|
TOKEN_NUM,
|
||||||
TOKEN_KW_IF,
|
TOKEN_KW_IF,
|
||||||
TOKEN_KW_ELSE,
|
TOKEN_KW_ELSE,
|
||||||
|
TOKEN_KW_WHILE,
|
||||||
};
|
};
|
||||||
const size_t count = sizeof(tokens)/sizeof(libab_lexer_token);
|
const size_t count = sizeof(tokens)/sizeof(libab_lexer_token);
|
||||||
|
|
||||||
|
41
src/parser.c
41
src/parser.c
@ -227,6 +227,45 @@ libab_result _parse_if(struct parser_state* state, libab_tree** store_into) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
libab_result _parse_while(struct parser_state* state, libab_tree** store_into) {
|
||||||
|
libab_result result = LIBAB_SUCCESS;
|
||||||
|
libab_tree* condition = NULL;
|
||||||
|
libab_tree* value = NULL;
|
||||||
|
|
||||||
|
if(_parser_is_type(state, TOKEN_KW_WHILE)) {
|
||||||
|
result = _parser_construct_node_vec(state->current_match, store_into);
|
||||||
|
if(result == LIBAB_SUCCESS) {
|
||||||
|
(*store_into)->variant = WHILE;
|
||||||
|
_parser_state_step(state);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result = LIBAB_UNEXPECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(result == LIBAB_SUCCESS) {
|
||||||
|
result = _parser_consume_char(state, '(');
|
||||||
|
}
|
||||||
|
|
||||||
|
if(result == LIBAB_SUCCESS) {
|
||||||
|
PARSE_CHILD(result, state, _parse_expression, condition, &(*store_into)->children);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(result == LIBAB_SUCCESS) {
|
||||||
|
result = _parser_consume_char(state, ')');
|
||||||
|
}
|
||||||
|
|
||||||
|
if(result == LIBAB_SUCCESS) {
|
||||||
|
PARSE_CHILD(result, state, _parse_expression, value, &(*store_into)->children);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(result != LIBAB_SUCCESS) {
|
||||||
|
if(*store_into) libab_tree_free_recursive(*store_into);
|
||||||
|
*store_into = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
libab_result _parse_call(struct parser_state* state, libab_tree** store_into) {
|
libab_result _parse_call(struct parser_state* state, libab_tree** store_into) {
|
||||||
libab_result result = LIBAB_SUCCESS;
|
libab_result result = LIBAB_SUCCESS;
|
||||||
libab_tree* temp;
|
libab_tree* temp;
|
||||||
@ -285,6 +324,8 @@ libab_result _parse_atom(struct parser_state* state, libab_tree** store_into) {
|
|||||||
_parser_state_step(state);
|
_parser_state_step(state);
|
||||||
} else if(_parser_is_type(state, TOKEN_KW_IF)) {
|
} else if(_parser_is_type(state, TOKEN_KW_IF)) {
|
||||||
result = _parse_if(state, store_into);
|
result = _parse_if(state, store_into);
|
||||||
|
} else if(_parser_is_type(state, TOKEN_KW_WHILE)) {
|
||||||
|
result = _parse_while(state, store_into);
|
||||||
} else if(_parser_is_char(state, '{')) {
|
} else if(_parser_is_char(state, '{')) {
|
||||||
result = _parse_block(state, store_into, 1);
|
result = _parse_block(state, store_into, 1);
|
||||||
} else {
|
} else {
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
int libab_tree_has_vector(libab_tree_variant variant) {
|
int libab_tree_has_vector(libab_tree_variant variant) {
|
||||||
return variant == BASE || variant == OP ||
|
return variant == BASE || variant == OP ||
|
||||||
variant == UNARY_OP || variant == BLOCK ||
|
variant == UNARY_OP || variant == BLOCK ||
|
||||||
variant == IF || variant == CALL;
|
variant == IF || variant == CALL || variant == WHILE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int libab_tree_has_string(libab_tree_variant variant) {
|
int libab_tree_has_string(libab_tree_variant variant) {
|
||||||
|
Loading…
Reference in New Issue
Block a user