static char* lispy_version = "Lispy version 0.0.0.0.5"; /* Parser language defintion */ static char* parser = " \ number : /-?[0-9]+([.][0-9]*|[0-9]*)/ ; \ symbol : '+' | '-' | '*' | '/' | '%' | '^' | \ \"min\" | \"max\" ; \ sexpr : '(' * ')' ; \ expr : | | ; \ lispy : /^/ * /$/ ; \ "; /* Declare new lval struct */ typedef struct lval { int type; long num; double dec; /* Error & symbol types have some string data */ char* err; char* sym; /* Counter & pointer to a list of lval */ size_t count; struct lval** cell; } lval; /* Create enumeration of possible lval types */ enum {LVAL_NUM, LVAL_DEC, LVAL_SYM, LVAL_SEXPR, LVAL_ERR}; /* lval constructor functions */ lval* lval_num(long x); lval* lval_dec(double x); lval* lval_err(char* m); lval* lval_sym(char* s); lval* lval_sexpr(void); /* lval destructor function */ void lval_del(lval* v); /* lval manipulating functions */ lval* lval_add(lval* v, lval* x); lval* lval_pop(lval* v, size_t i); lval* lval_take(lval* v, size_t i); lval* lval_read_num(mpc_ast_t* t); lval* lval_read(mpc_ast_t* t); lval* lval_eval_sexpr(lval* v); lval* lval_eval(lval* v); void lval_expr_print(lval* v, char open, char close); void lval_print(lval* v); void lval_println(lval* v); long min(long x, long y); long max(long x, long y); lval* builtin_op(lval* a, char* op);