+struct psi_num_exp *psi_num_exp_init_ternary(token_t op,
+ struct psi_num_exp *cond, struct psi_num_exp *truthy,
+ struct psi_num_exp *falsy);
+struct psi_num_exp *psi_num_exp_init_binary(token_t op,
+ struct psi_num_exp *lhs, struct psi_num_exp *rhs);
+struct psi_num_exp *psi_num_exp_init_unary(token_t op,
+ struct psi_num_exp *u);
+struct psi_num_exp *psi_num_exp_init_num(struct psi_number *n);
+struct psi_num_exp *psi_num_exp_init_cast(struct psi_decl_type *typ,
+ struct psi_num_exp *num);
+void psi_num_exp_free(struct psi_num_exp **c_ptr);
+
+struct psi_num_exp *psi_num_exp_copy(struct psi_num_exp *exp);
+void psi_num_exp_dump(int fd, struct psi_num_exp *exp);
+bool psi_num_exp_validate(struct psi_data *data, struct psi_num_exp *exp,
+ struct psi_validate_scope *scope);
+
+token_t psi_num_exp_exec(struct psi_num_exp *exp, impl_val *res,
+ struct psi_call_frame *frame, HashTable *defs);
+
+struct psi_plist *psi_num_exp_tokens(struct psi_num_exp *exp,
+ struct psi_plist *list);
+
+
+#include "calc.h"
+static inline zend_long psi_num_exp_get_long(struct psi_num_exp *exp,
+ struct psi_call_frame *frame, HashTable *defs) {
+ impl_val res = {0};
+
+ psi_calc_cast(psi_num_exp_exec(exp, &res, frame, defs), &res,
+ PSI_T_INT64, &res);
+
+ return res.i64;
+}
+static inline double psi_num_exp_get_double(struct psi_num_exp *exp,
+ struct psi_call_frame *frame, HashTable *defs) {
+ impl_val res = {0};
+
+ psi_calc_cast(psi_num_exp_exec(exp, &res, frame, defs), &res,
+ PSI_T_DOUBLE, &res);