diff options
Diffstat (limited to 'expr.h')
-rw-r--r-- | expr.h | 61 |
1 files changed, 61 insertions, 0 deletions
@@ -0,0 +1,61 @@ +typedef struct sheet sheet; + +typedef struct expr expr; +typedef struct value value; /* for recursive case */ +typedef struct postfix postfix; + +typedef enum exprType { + VALUE, + POSTFIX, + NESTED, +} exprType; + +typedef enum valueType { + NUM, + LOC, +} valueType; + +typedef struct loc { + int x, y; +} loc; + +typedef struct expr { + char *expr; + exprType t; + union { + expr *nested; + struct { + value *value; + postfix *postfix; + }; + }; +} expr; + +typedef struct postfix { + char op; + expr *expr; +} postfix; + +typedef struct value { + valueType t; + union { + int num; + loc *loc; + }; +} value; + +extern char *in; +extern char *Pin; + +char isop(char c); +void consumeleading(char c); +expr *parseExpr(); +loc *parseLoc(); +postfix *parsePostfix(); +value *parseValue(); +expr *parseExpr(); +double evalValue(value *v, sheet *s); +double evalPostfix(value *v, postfix *p, sheet *s); +double evalExpr(expr *e, sheet *s); +expr *makeNumber(int n); +void freeExpr(expr *e); |