Make distinction between prefix and postfix unary operators in trees.

This commit is contained in:
Danila Fedorin 2018-03-17 18:25:23 -07:00
parent 4e86ccc253
commit 7ab5eba529
4 changed files with 11 additions and 7 deletions

View File

@ -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,

View File

@ -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",

View File

@ -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 {

View File

@ -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;
} }