Make distinction between prefix and postfix unary operators in trees.
This commit is contained in:
parent
4e86ccc253
commit
7ab5eba529
|
@ -15,7 +15,8 @@ enum libab_tree_variant_e {
|
||||||
TREE_NUM,
|
TREE_NUM,
|
||||||
TREE_OP,
|
TREE_OP,
|
||||||
TREE_RESERVED_OP,
|
TREE_RESERVED_OP,
|
||||||
TREE_UNARY_OP,
|
TREE_PREFIX_OP,
|
||||||
|
TREE_POSTFIX_OP,
|
||||||
TREE_BLOCK,
|
TREE_BLOCK,
|
||||||
TREE_VOID,
|
TREE_VOID,
|
||||||
TREE_IF,
|
TREE_IF,
|
||||||
|
|
|
@ -10,7 +10,8 @@ const char* _debug_node_name(libab_tree_variant var) {
|
||||||
"num",
|
"num",
|
||||||
"op",
|
"op",
|
||||||
"reserved_op",
|
"reserved_op",
|
||||||
"unary_op",
|
"prefix_op",
|
||||||
|
"postfix_op",
|
||||||
"block",
|
"block",
|
||||||
"void",
|
"void",
|
||||||
"if",
|
"if",
|
||||||
|
|
|
@ -721,8 +721,10 @@ libab_result _parser_construct_op(struct parser_state* state, libab_lexer_match*
|
||||||
(*into)->variant = TREE_OP;
|
(*into)->variant = TREE_OP;
|
||||||
} else if(match->type == TOKEN_OP_RESERVED) {
|
} else if(match->type == TOKEN_OP_RESERVED) {
|
||||||
(*into)->variant = TREE_RESERVED_OP;
|
(*into)->variant = TREE_RESERVED_OP;
|
||||||
|
} else if(match->type == TOKEN_OP_PREFIX) {
|
||||||
|
(*into)->variant = TREE_PREFIX_OP;
|
||||||
} else {
|
} else {
|
||||||
(*into)->variant = TREE_UNARY_OP;
|
(*into)->variant = TREE_POSTFIX_OP;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -828,7 +830,7 @@ libab_result _parser_expression_tree(struct parser_state* state, ll* source, lib
|
||||||
free(top);
|
free(top);
|
||||||
top = NULL;
|
top = NULL;
|
||||||
}
|
}
|
||||||
} else if(top->variant == TREE_UNARY_OP || top->variant == TREE_CALL) {
|
} else if(top->variant == TREE_PREFIX_OP || top->variant == TREE_POSTFIX_OP || top->variant == TREE_CALL) {
|
||||||
libab_tree* child = NULL;
|
libab_tree* child = NULL;
|
||||||
|
|
||||||
result = _parser_expression_tree(state, source, &child);
|
result = _parser_expression_tree(state, source, &child);
|
||||||
|
@ -839,7 +841,7 @@ libab_result _parser_expression_tree(struct parser_state* state, ll* source, lib
|
||||||
|
|
||||||
if(result != LIBAB_SUCCESS) {
|
if(result != LIBAB_SUCCESS) {
|
||||||
if(child) libab_tree_free_recursive(child);
|
if(child) libab_tree_free_recursive(child);
|
||||||
if(top->variant == TREE_UNARY_OP) {
|
if(top->variant == TREE_PREFIX_OP || top->variant == TREE_POSTFIX_OP) {
|
||||||
libab_tree_free(top);
|
libab_tree_free(top);
|
||||||
free(top);
|
free(top);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
int libab_tree_has_vector(libab_tree_variant variant) {
|
int libab_tree_has_vector(libab_tree_variant variant) {
|
||||||
return variant == TREE_BASE || variant == TREE_OP ||
|
return variant == TREE_BASE || variant == TREE_OP ||
|
||||||
variant == TREE_UNARY_OP || variant == TREE_BLOCK ||
|
variant == TREE_PREFIX_OP || variant == TREE_POSTFIX_OP || variant == TREE_BLOCK ||
|
||||||
variant == TREE_IF || variant == TREE_CALL || variant == TREE_WHILE ||
|
variant == TREE_IF || variant == TREE_CALL || variant == TREE_WHILE ||
|
||||||
variant == TREE_DOWHILE || variant == TREE_FUN ||
|
variant == TREE_DOWHILE || variant == TREE_FUN ||
|
||||||
variant == TREE_RETURN || variant == TREE_RESERVED_OP;
|
variant == TREE_RETURN || variant == TREE_RESERVED_OP;
|
||||||
|
@ -11,7 +11,7 @@ int libab_tree_has_vector(libab_tree_variant variant) {
|
||||||
|
|
||||||
int libab_tree_has_string(libab_tree_variant variant) {
|
int libab_tree_has_string(libab_tree_variant variant) {
|
||||||
return variant == TREE_ID || variant == TREE_NUM ||
|
return variant == TREE_ID || variant == TREE_NUM ||
|
||||||
variant == TREE_OP || variant == TREE_UNARY_OP ||
|
variant == TREE_OP || variant == TREE_PREFIX_OP || variant == TREE_POSTFIX_OP ||
|
||||||
variant == TREE_FUN || variant == TREE_FUN_PARAM ||
|
variant == TREE_FUN || variant == TREE_FUN_PARAM ||
|
||||||
variant == TREE_RESERVED_OP;
|
variant == TREE_RESERVED_OP;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user