view src/ploki/expr.h @ 8427:1fc808cd5b1f

<b_jonas> learn can\'t is the most frequent word whose pronunciation varies between /\xc9\x91\xcb\x90/ and /\xc3\xa6/ depending on dialect. The list is: advance after answer ask aunt brass can\'t cast castle chance class command dance demand draft enhance example fast father glass graph grass half last laugh mask master nasty pass past path plant rather sample shan\'t staff task vast
author HackBot
date Thu, 09 Jun 2016 21:28:47 +0000
parents ac0403686959
children
line wrap: on
line source

#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_ */