diff options
Diffstat (limited to 'sem1/osc/miniproject/cnasm/ast.h')
-rw-r--r-- | sem1/osc/miniproject/cnasm/ast.h | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/sem1/osc/miniproject/cnasm/ast.h b/sem1/osc/miniproject/cnasm/ast.h new file mode 100644 index 0000000..61a8f4f --- /dev/null +++ b/sem1/osc/miniproject/cnasm/ast.h @@ -0,0 +1,53 @@ +#ifndef AST_HEADER +#define AST_HEADER + +#include <stdbool.h> +#include <stdint.h> + +#define CEQ 0x10 +#define CNEQ CEQ ^ 0x80 +#define CGT 0x20 +#define CLT 0x30 +#define CLEQ CGT ^ 0x80 +#define CGEQ CLT ^ 0x80 + +enum ntype { TSTM_LIST, TIF, TFOR, TIDENT, TWHILE}; + +typedef struct cond { + uint8_t cmp; + char *a; + char *b; +} cond_t; + +typedef struct ast_node { + enum ntype t; + // Dependent on type + union { + struct { + cond_t *condition; + struct ast_node *iftrue; + struct ast_node *iffalse; + } flowctrl; + struct { + cond_t *condition; + char *pre; + char *inc; + struct ast_node *stuff; + } forloop; + char *ident; + struct { + struct ast_node *children[2]; + } list; + }; +} ast_node_t; + +ast_node_t *insert_ctrl(enum ntype t, cond_t *c, ast_node_t *iftrue, ast_node_t *iffalse); +ast_node_t *insert_stm(ast_node_t *stm, ast_node_t *stm_list); +ast_node_t *insert_ident(char *ident); +ast_node_t *insert_for(char *pre, cond_t *c, char *inc, ast_node_t *stuff); + +cond_t *insert_cond(uint8_t cmp, char *a, char *b); + +void node_print(ast_node_t *node); + +#endif |