Mercurial > repo
diff src/ploki/expr.h @ 4223:ac0403686959
<oerjan> rm -rf src/ploki; mv ploki src
author | HackBot |
---|---|
date | Fri, 20 Dec 2013 22:18:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/ploki/expr.h Fri Dec 20 22:18:50 2013 +0000 @@ -0,0 +1,181 @@ +#ifndef EXPR_H_ +#define EXPR_H_ + +#include "config.h" +#include "Str.h" +#include "op.h" +#include "re.h" +#include "stack.h" +#include "strhash.h" +#include "val.h" +#include "variable.h" + +#include <stddef.h> +#include <setjmp.h> + +enum t_expr { + literE, + varE, + varhashE, + symbolE, + unopE, + binopE, + listE +}; + +enum t_func { + F_CALL = -1, + F_NUL, + F_ABS, + F_ACOS, + F_ASIN, + F_ATAN, + F_ATAN2, + F_CATCH, + F_CHR, + F_COS, + F_DEFINED, + F_EOF, + F_ERROR, + F_EXP, + F_FREEZE, + F_GETC, + F_GETENV, + F_GETS, + F_HANG, + F_INT, + F_IO, + F_LENGTH, + F_LOG, + F_LOG10, + F_LOWER, + F_MATCH, + F_MOEND, + F_MOSTART, + F_NEG, + F_NOT, + F_NUM, + F_OPEN, + F_OPENR, + F_OPENW, + F_ORD, + F_QUOTE, + F_RE_ESC, + F_REMOVE, + F_RENAME, + F_REVERSE, + F_SEEK, + F_SIN, + F_SQRT, + F_STR, + F_TAN, + F_TELL, + F_TYPEOF, + F_UPPER +}; + +enum t_symbol { + S_NUL, + S_ARG, + S_ARGC, + S_ARGV, + S_ERR, + S_EULER, + S_LUDOLF, + S_MATCH, + S_RAND, + S_RESULT, + S_STDIN, + S_STDOUT, + S_STDERR +}; + +enum t_binop { + B_AMPERSAND, + B_ANGLE, + B_BACKSPARK, + B_BRACELET, + B_DOUBLE_OH_SEVEN, + B_EMBRACE, + B_FLATWORM, + B_HALF_MESH, + B_HYBRID, + B_INTERSECTION, + B_RIGHT_ANGLE, + B_SHARK_FIN, + B_SLAT, + B_SPARK, + B_SPARK_SPOT, + B_SPIKE, + B_SPLAT, + B_SPOT, + B_SQIGGLE, + B_TAIL, + B_TWO_SPOT, + B_U_TURN, + B_U_TURN_BACK, + B_WORM, + B_XMATCH +}; + +struct expr { + enum t_expr type; + int op; + union { + t_vr_cookie tent; + struct val *val; + t_strhash *hash; + } v; + struct expr *right; + union { + struct expr *expr; + struct op *op; + t_regex *rx; + size_t bonus; + } left; +}; + +void expr_init(void); +void expr_end(void); + +void free_expr(struct expr *); +struct expr *get_expr(struct op *); +struct expr *get_lval(struct op *); +struct expr *get_iobj(struct op *); + +void eval_push(struct expr *); +void eval_into(struct expr *, struct val *); +struct val *eval_pop(void); +struct val *eval_expr(struct expr *); + +ATTR_PURE +enum t_binop expr_binop(int); + +void expr_pp(enum t_binop, struct val *, struct val *); + +typedef struct { + jmp_buf buf; + size_t depth; +} t_context; + +stack_declare(t_context, extern) +extern stack(t_context) Context; + +#define OPERATORS "_+-*/%^[]<>=!{}:;&|~`'.," +#define OPERATOR_P(c) strchr(OPERATORS, c) + +#define TOLABEL(v) \ +do { \ + V_NUM(v); \ + V_xxx_OFF(v); \ + (v)->num = floor((v)->num + .5); \ + (v)->type = V_NUM_K; \ + v_ok_str(v); \ + ko_grep(v->ko, isdigit); \ + while (ko_at(v->ko, 0) == '0') { \ + ko_shift(v->ko, 1); \ + } \ + (v)->type = V_STR_K; \ +} while (0) + +#endif /* EXPR_H_ */