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