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