| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #ifndef _PLY_NODE_H
- #define _PLY_NODE_H
- #include <stdint.h>
- #include <stdio.h>
- #include "type.h"
- typedef struct atom atom_t;
- typedef struct expr expr_t;
- typedef struct node node_t;
- typedef enum atype {
- A_INVALID,
- A_IDENT,
- A_NUM,
- A_STRING,
- } atype_t;
- struct atom {
- atype_t atype;
- union {
- char *ident;
- int64_t num;
- char *string;
- };
- };
- typedef enum etype {
- E_INVALID = '\0',
- E_AGG = '@',
- E_CALL = '(',
- E_DEREF = '*',
- E_DOT = '.',
- E_MAP = 'm',
- E_SCOPE = '{',
-
- } etype_t;
- struct expr {
- etype_t etype;
- node_t *arg;
- };
- typedef enum ntype {
- N_INVALID,
- N_ATOM,
- N_EXPR,
- } ntype_t;
- struct node {
- ntype_t ntype;
- node_t *up;
- node_t *next;
- type_t *type;
- union {
- atom_t atom;
- expr_t expr;
- };
- };
- /* walk a node tree */
- typedef int (*walk_fn)(node_t *, void *);
- int node_walk(node_t *n, walk_fn pre, walk_fn post, void *ctx);
- /* node constructors */
- node_t *node_ident (char *name);
- node_t *node_num (int64_t num);
- node_t *node_string(char *string);
- node_t *node_expr (etype_t etype, node_t *arg);
- node_t *node_cons (node_t *head, node_t *tail);
- /* debug */
- typedef struct node_dump_info {
- FILE *fp;
- int indent;
- } node_dump_info_t;
- void node_dump(node_t *n, node_dump_info_t *info);
- #endif /* _PLY_NODE_H */
|