Code

parser: Determine the data-type of each node.
[sysdb.git] / src / include / parser / ast.h
index 3bdc5b6c1e5d69d23d96f0175b6eb6ad9136efe5..41fb2179e805e5c1bbd9ea1e3a591b1a685735ae 100644 (file)
@@ -107,6 +107,10 @@ typedef enum {
        SDB_AST_CONCAT = 2005,
 
        /* iterators */
+#define SDB_AST_IS_ITERATOR(n) \
+       (((n)->type == SDB_AST_TYPE_ITERATOR) \
+               && ((SDB_AST_ALL <= SDB_AST_ITER(n)->kind) \
+                       && (SDB_AST_ITER(n)->kind <= SDB_AST_ANY)))
        SDB_AST_ALL    = 3000,
        SDB_AST_ANY    = 3001,
 } sdb_ast_operator_t;
@@ -135,6 +139,20 @@ typedef enum {
                : ((op) == SDB_AST_ANY) ? "ANY" \
                : "UNKNOWN")
 
+#define SDB_AST_TYPE_TO_STRING(n) \
+       (((n)->type == SDB_AST_TYPE_FETCH) ? "FETCH" \
+               : ((n)->type == SDB_AST_TYPE_LIST) ? "LIST" \
+               : ((n)->type == SDB_AST_TYPE_LOOKUP) ? "LOOKUP" \
+               : ((n)->type == SDB_AST_TYPE_STORE) ? "STORE" \
+               : ((n)->type == SDB_AST_TYPE_TIMESERIES) ? "TIMESERIES" \
+               : ((n)->type == SDB_AST_TYPE_OPERATOR) \
+                       ? SDB_AST_OP_TO_STRING(SDB_AST_OP(n)->kind) \
+               : ((n)->type == SDB_AST_TYPE_ITERATOR) ? "ITERATOR" \
+               : ((n)->type == SDB_AST_TYPE_CONST) ? "CONSTANT" \
+               : ((n)->type == SDB_AST_TYPE_VALUE) ? "VALUE" \
+               : ((n)->type == SDB_AST_TYPE_TYPED) ? "TYPED VALUE" \
+               : "UNKNOWN")
+
 /*
  * sdb_ast_node_t is the interface for AST nodes. The first field of any
  * actual implementation of the interface is of type sdb_ast_node_t to
@@ -148,6 +166,9 @@ typedef struct {
 
        /* type describes the type of the actual node */
        int type;
+
+       /* data-type describes the type of the result value */
+       int data_type;
 } sdb_ast_node_t;
 #define SDB_AST_NODE(obj) ((sdb_ast_node_t *)(obj))
 
@@ -162,6 +183,8 @@ typedef struct {
        sdb_ast_node_t *right;
 } sdb_ast_op_t;
 #define SDB_AST_OP(obj) ((sdb_ast_op_t *)(obj))
+#define SDB_AST_OP_INIT \
+       { { SDB_OBJECT_INIT, SDB_AST_TYPE_OPERATOR, -1 }, -1, NULL, NULL }
 
 /*
  * sdb_ast_iter_t represents an iterator.
@@ -169,13 +192,14 @@ typedef struct {
 typedef struct {
        sdb_ast_node_t super;
        int kind;
-       int op;
        sdb_ast_node_t *iter;
        /* exactly one operand of the expression has to be unset and will be
         * filled in by the iterator value */
        sdb_ast_node_t *expr;
 } sdb_ast_iter_t;
 #define SDB_AST_ITER(obj) ((sdb_ast_iter_t *)(obj))
+#define SDB_AST_ITER_INIT \
+       { { SDB_OBJECT_INIT, SDB_AST_TYPE_ITERATOR, -1 }, -1, NULL, NULL }
 
 /*
  * sdb_ast_typed_t represents a typed value.
@@ -186,6 +210,8 @@ typedef struct {
        sdb_ast_node_t *expr;
 } sdb_ast_typed_t;
 #define SDB_AST_TYPED(obj) ((sdb_ast_typed_t *)(obj))
+#define SDB_AST_TYPED_INIT \
+       { { SDB_OBJECT_INIT, SDB_AST_TYPE_TYPED, -1 }, -1, NULL }
 
 /*
  * sdb_ast_const_t represents a constant value.
@@ -195,6 +221,8 @@ typedef struct {
        sdb_data_t value;
 } sdb_ast_const_t;
 #define SDB_AST_CONST(obj) ((sdb_ast_const_t *)(obj))
+#define SDB_AST_CONST_INIT \
+       { { SDB_OBJECT_INIT, SDB_AST_TYPE_CONST, -1 }, SDB_DATA_INIT }
 
 /*
  * sdb_ast_value_t represents an object-specific value: sibling nodes,
@@ -206,6 +234,8 @@ typedef struct {
        char *name; /* object name; optional */
 } sdb_ast_value_t;
 #define SDB_AST_VALUE(obj) ((sdb_ast_value_t *)(obj))
+#define SDB_AST_VALUE_INIT \
+       { { SDB_OBJECT_INIT, SDB_AST_TYPE_VALUE, -1 }, -1, NULL }
 
 /*
  * sdb_ast_fetch_t represents a FETCH command.
@@ -218,6 +248,8 @@ typedef struct {
        sdb_ast_node_t *filter; /* optional */
 } sdb_ast_fetch_t;
 #define SDB_AST_FETCH(obj) ((sdb_ast_fetch_t *)(obj))
+#define SDB_AST_FETCH_INIT \
+       { { SDB_OBJECT_INIT, SDB_AST_TYPE_FETCH, -1 }, -1, NULL, NULL, NULL }
 
 /*
  * sdb_ast_list_t represents a LIST command.
@@ -228,6 +260,8 @@ typedef struct {
        sdb_ast_node_t *filter; /* optional */
 } sdb_ast_list_t;
 #define SDB_AST_LIST(obj) ((sdb_ast_list_t *)(obj))
+#define SDB_AST_LIST_INIT \
+       { { SDB_OBJECT_INIT, SDB_AST_TYPE_LIST, -1 }, -1, NULL }
 
 /*
  * sdb_ast_lookup_t represents a LOOKUP command.
@@ -239,6 +273,8 @@ typedef struct {
        sdb_ast_node_t *filter; /* optional */
 } sdb_ast_lookup_t;
 #define SDB_AST_LOOKUP(obj) ((sdb_ast_lookup_t *)(obj))
+#define SDB_AST_LOOKUP_INIT \
+       { { SDB_OBJECT_INIT, SDB_AST_TYPE_LOOKUP, -1 }, -1, NULL, NULL }
 
 /*
  * sdb_ast_store_t represents a STORE command.
@@ -260,6 +296,9 @@ typedef struct {
        sdb_data_t value;
 } sdb_ast_store_t;
 #define SDB_AST_STORE(obj) ((sdb_ast_store_t *)(obj))
+#define SDB_AST_STORE_INIT \
+       { { SDB_OBJECT_INIT, SDB_AST_TYPE_STORE, -1 }, \
+               -1, NULL, -1, NULL, NULL, 0, NULL, NULL, SDB_DATA_INIT }
 
 /*
  * sdb_ast_timeseries_t represents a TIMESERIES command.
@@ -272,6 +311,8 @@ typedef struct {
        sdb_time_t end;
 } sdb_ast_timeseries_t;
 #define SDB_AST_TIMESERIES(obj) ((sdb_ast_timeseries_t *)(obj))
+#define SDB_AST_TIMESERIES_INIT \
+       { { SDB_OBJECT_INIT, SDB_AST_TYPE_TIMESERIES, -1 }, NULL, NULL, 0, 0 }
 
 /*
  * AST constructors:
@@ -297,8 +338,7 @@ sdb_ast_op_create(int kind, sdb_ast_node_t *left, sdb_ast_node_t *right);
  * ownership of the iter and expr nodes.
  */
 sdb_ast_node_t *
-sdb_ast_iter_create(int kind, int op,
-               sdb_ast_node_t *iter, sdb_ast_node_t *expr);
+sdb_ast_iter_create(int kind, sdb_ast_node_t *iter, sdb_ast_node_t *expr);
 
 /*
  * sdb_ast_typed_create: