1typedef enum {2 OP_PLUS,3 OP_MINUS,4 OP_MULTI,5 OP_DIVIDE,6} binop;78typedef enum {9 EXP_LIT,10 EXP_VAR,11 EXP_BIN,12} expr_t;1314typedef struct parser parser;1516struct parser {17 int cur;18 size_t max;19 scanner *scr;20 token **buf, *peektok;21};2223typedef struct expr expr;2425struct expr {26 expr_t type;27 union {28 struct {29 int num;30 } literal;31 struct {32 char *var;33 } variable;34 struct {35 binop op;36 expr *expr1, *expr2;37 } operation;38 } d;39};4041typedef enum {42 STMT_ERROR,43 STMT_DEFINE,44 STMT_ASSIGN,45 STMT_READ,46 STMT_WRITE,47 STMT_COND,48 STMT_LOOP,49} stmt_t;5051typedef struct statement statement;5253struct statement {54 stmt_t type;55 union {56 struct {57 int line;58 char *msg;59 } error;60 struct {61 expr *exp;62 char *var;63 } define;64 struct {65 expr *exp;66 char *var;67 } assign;68 struct {69 char *var;70 } read;71 struct {72 expr *exp;73 } write;74 struct {75 expr *cond;76 statement **brn1, **brn2;77 } cond;78 struct {79 expr *cond;80 statement **brn;81 } loop;82 } d;83};8485parser *newpar(char *m);86void freepar(parser *p);87void freestmt(statement *s);88void freestmts(statement **s);89statement **parseprog(parser *p, statement *e);