1 #include "errx.h" 2 3 struct node; 4 struct scalar; 5 struct vector; 6 struct sym; 7 8 typedef int ident_t; 9 typedef struct node *node_t; 10 typedef struct scalar *scalar_t; 11 typedef struct vector *vector_t; 12 typedef struct sym *sym_t; 13 14 #define SCALAR_ROUND(s) (floor(s + 0.5)) 15 16 struct scalar { 17 int width; 18 double *vals; 19 int refcnt; 20 }; 21 22 struct vector { 23 int len; 24 scalar_t *el; 25 int maxlen; 26 int refcnt; 27 }; 28 29 enum nodetype { 30 NODETYPE_ADD, 31 NODETYPE_SUB, 32 NODETYPE_MUL, 33 NODETYPE_DIV, 34 NODETYPE_POW, 35 NODETYPE_INDEX, 36 NODETYPE_SUM, 37 NODETYPE_PROD, 38 NODETYPE_AVG, 39 NODETYPE_LEN, 40 NODETYPE_MAX, 41 NODETYPE_MIN, 42 NODETYPE_IMAX, 43 NODETYPE_IMIN, 44 NODETYPE_IDENT, 45 NODETYPE_REAL, 46 NODETYPE_LET, 47 NODETYPE_VEC1, 48 NODETYPE_VEC2, 49 NODETYPE_GEN, 50 NODETYPE_RANGE, 51 NODETYPE_LT, 52 NODETYPE_LE, 53 NODETYPE_GT, 54 NODETYPE_GE, 55 NODETYPE_EQ, 56 NODETYPE_NE, 57 NODETYPE_NOT, 58 NODETYPE_AND, 59 NODETYPE_OR, 60 NODETYPE_ISNAN, 61 NODETYPE_SQRT, 62 NODETYPE_ABS, 63 NODETYPE_EXP, 64 NODETYPE_LOG, 65 NODETYPE_SIN, 66 NODETYPE_COS, 67 NODETYPE_TAN, 68 NODETYPE_ASIN, 69 NODETYPE_ACOS, 70 NODETYPE_ATAN, 71 NODETYPE_CLAMP, 72 NODETYPE_SEGMENT, 73 NODETYPE_EXPRLIST, 74 NODETYPE_ASSIGN, 75 NODETYPE_IFELSE, 76 NODETYPE_FOR 77 }; 78 79 #define RANGE_EXACT_UPPER 1 80 #define RANGE_EXACT_LOWER 2 81 #define ALLARGS_SCALAR 4 82 #define NODE_IS_SCALAR 8 83 84 struct node { 85 enum nodetype type; 86 node_t expr[3]; 87 ident_t ident; 88 int flags; 89 double real; 90 int pos; 91 int numargs; 92 }; 93 94 ident_t new_ident(const char *); 95 const char *ident_str(ident_t); 96 int ident_is_scalar(ident_t); 97 ident_t ident_lookup(char *string); 98 99 node_t new_node(int, int); 100 node_t new_scalar_node(int); 101 node_t new_vector_node(int); 102 const char * node_name(node_t); 103 int node_is_scalar(node_t); 104 node_t optimize(node_t); 105 106 vector_t new_vector(void); 107 void vector_append(vector_t, scalar_t); 108 void vector_free(vector_t); 109 void vector_incr_ref(vector_t); 110 111 scalar_t new_scalar(int); 112 void scalar_free(scalar_t); 113 void scalar_incr_ref(scalar_t); 114 115 sym_t sym_enter_scope(sym_t sym); 116 void sym_leave_scope(sym_t sym); 117 void sym_declare_ident(ident_t id, sym_t sym); 118 void sym_set_scalar(int, int *, scalar_t, ident_t, sym_t); 119 void sym_set_vector(int, int *, vector_t, ident_t, sym_t); 120 scalar_t sym_lookup_scalar(ident_t id, sym_t sym); 121 vector_t sym_lookup_vector(ident_t id, sym_t sym); 122 123 void lex_init(const char *); 124 void lex_finalize(void); 125 126 scalar_t eval_scalar(int, int *, node_t, sym_t); 127 void show_error(int, const char *); 128 129 int yyparse(void); 130 int yylex(void); 131 extern node_t root; 132 133