X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fparser_def.h;h=05489e73bd6c3e81d78822018c84f019f8628d18;hb=a887001351f8c6c963b2ff0fcd64d71b439c3d79;hp=e57f51e98d84ebeb3b81c9741bf8d253f98a54e3;hpb=9bcb1df0786a8193d65949c857baaba2f4296e84;p=m6w6%2Fext-psi diff --git a/src/parser_def.h b/src/parser_def.h index e57f51e..05489e7 100644 --- a/src/parser_def.h +++ b/src/parser_def.h @@ -79,21 +79,34 @@ DEF(%syntax_error, { } }) -DEF(%nonassoc, NAME.) -DEF(%left, PLUS MINUS.) -DEF(%left, ASTERISK SLASH.) -DEF(%nonassoc, AMPERSAND.) -DEF(%fallback, NAME TEMP FREE SET LET RETURN CALLOC CALLBACK ZVAL LIB STRING COUNT.) - DEF(%token_class, const_type_token BOOL INT FLOAT STRING.) DEF(%token_class, decl_type_token FLOAT DOUBLE INT8 UINT8 INT16 UINT16 INT32 UINT32 INT64 UINT64 NAME.) DEF(%token_class, impl_def_val_token NULL NUMBER TRUE FALSE QUOTED_STRING.) -DEF(%token_class, num_exp_token NUMBER NSNAME.) -DEF(%token_class, num_exp_op_token PLUS MINUS ASTERISK SLASH.) +DEF(%token_class, number_token NUMBER NSNAME.) +DEF(%token_class, num_exp_binary_op_token PIPE CARET AMPERSAND LSHIFT RSHIFT PLUS MINUS ASTERISK SLASH MODULO.) +DEF(%token_class, num_exp_unary_op_token TILDE NOT PLUS MINUS.) DEF(%token_class, let_func_token ZVAL OBJVAL ARRVAL PATHVAL STRLEN STRVAL FLOATVAL INTVAL BOOLVAL COUNT.) DEF(%token_class, set_func_token TO_OBJECT TO_ARRAY TO_STRING TO_INT TO_FLOAT TO_BOOL ZVAL VOID.) DEF(%token_class, impl_type_token VOID MIXED BOOL INT FLOAT STRING ARRAY OBJECT CALLABLE.) +DEF(%nonassoc, NAME.) +DEF(%right, NOT TILDE.) +DEF(%left, PIPE.) +DEF(%left, CARET.) +DEF(%left, AMPERSAND.) +DEF(%left, LSHIFT RSHIFT.) +DEF(%left, PLUS MINUS.) +DEF(%left, ASTERISK SLASH MODULO.) +/* +DEF(%left, ASTERISK SLASH MODULO.) +DEF(%left, PLUS MINUS.) +DEF(%left, LSHIFT RSHIFT.) +DEF(%left, AMPERSAND.) +DEF(%left, CARET.) +DEF(%left, PIPE.) +*/ +DEF(%fallback, NAME TEMP FREE SET LET RETURN CALLOC CALLBACK ZVAL LIB STRING COUNT.) + TOKEN_TYPE(decl_enum, struct psi_decl_enum *) TOKEN_DTOR(decl_enum, psi_decl_enum_free(&$$);) TOKEN_TYPE(decl_enum_items, struct psi_plist*) @@ -163,6 +176,8 @@ TOKEN_TYPE(impl_stmts, struct psi_plist*) TOKEN_DTOR(impl_stmts, psi_plist_free($$);) TOKEN_TYPE(impl_stmt, struct psi_token**) TOKEN_DTOR(impl_stmt, psi_impl_stmt_free(&$$);) +TOKEN_TYPE(number, struct psi_number*) +TOKEN_DTOR(number, psi_number_free(&$$);) TOKEN_TYPE(num_exp, struct psi_num_exp*) TOKEN_DTOR(num_exp, psi_num_exp_free(&$$);) TOKEN_TYPE(let_stmt, struct psi_let_stmt*) @@ -199,7 +214,7 @@ TOKEN_TYPE(free_exp, struct psi_free_exp*) TOKEN_DTOR(free_exp, psi_free_exp_free(&$$);) TOKEN_TYPE(impl_type, struct psi_impl_type*) TOKEN_DTOR(impl_type, psi_impl_type_free(&$$);) -TOKEN_TYPE(reference, char) +TOKEN_TYPE(reference, bool) TOKEN_TYPE(indirection, unsigned) TOKEN_TYPE(pointers, unsigned) @@ -1398,34 +1413,62 @@ PARSE_TYPED(impl_stmt, i, } /* - * num_exp: num_exp_token + * number: number_token */ -PARSE_TYPED(num_exp, exp, - NAMED(num_exp_token, tok)) { - exp = psi_num_exp_init(tok->type, tok->text); +PARSE_TYPED(number, exp, + NAMED(number_token, tok)) { + exp = psi_number_init(tok->type, tok->text); exp->token = tok; } /* * num_exp: decl_var */ -PARSE_TYPED(num_exp, exp, +PARSE_TYPED(number, exp, TYPED(decl_var, var)) { - exp = psi_num_exp_init(PSI_T_NAME, var); + exp = psi_number_init(PSI_T_NAME, var); exp->token = psi_token_copy(var->token); } /* - * num_exp: num_exp num_exp_op_token num_exp + * num_exp: num_exp + */ +PARSE_TYPED(num_exp, exp, + TYPED(number, num)) { + exp = psi_num_exp_init_num(num); + exp->token = psi_token_copy(num->token); +} + +/* + * num_exp: ( num_exp ) */ PARSE_TYPED(num_exp, exp, + NAMED(LPAREN, L) TYPED(num_exp, exp_) - NAMED(num_exp_op_token, operator_) - TYPED(num_exp, operand_)) { - exp_->op = operator_->type; - exp_->operand = operand_; - exp = exp_; - free(operator_); + TOKEN(RPAREN)) { + exp = psi_num_exp_init_unary(PSI_T_LPAREN, exp_); + exp->token = L; +} + +/* + * num_exp: num_exp num_exp_binary_op_token num_exp + */ +PARSE_TYPED(num_exp, exp, + TYPED(num_exp, lhs_) + NAMED(num_exp_binary_op_token, OP) + TYPED(num_exp, rhs_)) { + exp = psi_num_exp_init_binary(OP->type, lhs_, rhs_); + exp->token = OP; +} + +/* + * num_exp: num_exp_unary_op_token num_exp + */ +PARSE_TYPED(num_exp, exp, + NAMED(num_exp_unary_op_token, OP) + TYPED(num_exp, exp_)) { + exp = psi_num_exp_init_unary(OP->type, exp_); + exp->token = OP; } /* @@ -1782,10 +1825,11 @@ PARSE_TYPED(return_stmt, ret, * free_stmt: FREE free_exps ; */ PARSE_TYPED(free_stmt, free, - TOKEN(FREE) + NAMED(FREE, T) TYPED(free_exps, calls) TOKEN(EOS)) { free = psi_free_stmt_init(calls); + free->token = T; } /* @@ -1823,7 +1867,7 @@ PARSE_TYPED(free_exp, call, * reference: */ PARSE_TYPED(reference, r, ) { - r = 0; + r = false; } /* @@ -1831,7 +1875,7 @@ PARSE_TYPED(reference, r, ) { */ PARSE_TYPED(reference, r, TOKEN(AMPERSAND)) { - r = 1; + r = true; } /*