aboutsummaryrefslogtreecommitdiff
path: root/ast.h
diff options
context:
space:
mode:
Diffstat (limited to 'ast.h')
-rw-r--r--ast.h93
1 files changed, 93 insertions, 0 deletions
diff --git a/ast.h b/ast.h
new file mode 100644
index 0000000..6679a6b
--- /dev/null
+++ b/ast.h
@@ -0,0 +1,93 @@
+#ifndef AST_H
+#define AST_H
+#include <stdarg.h>
+#include "const.h"
+#include "semantics.h"
+#include "cibic.tab.h"
+
+typedef struct CNode {
+ enum {
+ /* Top Level */
+ PROG,
+ FUNC_DEF,
+ DECL, /* declaration */
+ DECLR, /* declarator */
+ DECLRS,
+ INIT_DECLR,
+ INIT_DECLRS,
+ INITR, /* initializer */
+ TYPE_SPEC,
+ FIELD, /* struct-or-union field */
+ FIELDS,
+ PLAIN_DECL,
+ DECLS,
+ FUNCS,
+ TYPEDEF,
+
+ /* Statments */
+ STMT,
+
+ /* Expressions */
+ EXP,
+ ID, /* identifier */
+ INT, /* INT_CONST */
+ CHAR,
+ STR,
+ NOP,
+
+ COMP_STMTS,
+ COMP_DECLS,
+ ARGS,
+ PARAMS
+ } type;
+ union {
+ int intval;
+ int subtype;
+ char *strval;
+ } rec;
+ struct {
+ CType_t type;
+ CVar_t var;
+ CVList_t autos;
+ long const_val;
+ int is_const;
+ int offset; /* offset from var */
+ } ext;
+ struct CNode *chd, *next;
+ /* For error reporting */
+ struct {
+ int row, col;
+ } loc;
+} CNode;
+
+CNode *cnode_add_loc(CNode *node, YYLTYPE loc);
+CNode *cnode_create_ast(CNode *wrapped);
+CNode *cnode_create_nop(void);
+CNode *cnode_create_general(int type, int subtype, int pnum, va_list ap);
+CNode *cnode_list_append(CNode *list, CNode *tail);
+CNode *cnode_list_wrap(int type, CNode *list);
+
+CNode *cnode_create_exp(int exp_type, int pnum, ...);
+CNode *cnode_create_type_spec(int spec_type, int pnum, ...);
+CNode *cnode_create_declr(int declr_type, int pnum, ...);
+CNode *cnode_create_stmt(int stmt_type, int pnum, ...);
+CNode *cnode_create_initr(int initr_type, CNode *body);
+
+CNode *cnode_create_decl(CNode *type, CNode *init_declrs);
+CNode *cnode_create_func(CNode *type, CNode *declr, CNode *stmt);
+CNode *cnode_create_init_declr(CNode *declr, CNode *initr);
+CNode *cnode_create_struct_field(CNode *type_spec, CNode *declrs);
+CNode *cnode_create_plain_decl(CNode *type_spec, CNode *declr);
+CNode *cnode_create_typedef(CNode *type, CNode *declrs);
+
+CNode *cnode_create_identifier(char *val);
+CNode *cnode_create_int_const(int val);
+CNode *cnode_create_char_const(char *val);
+CNode *cnode_create_str_const(char *val);
+
+void cnode_debug_print(CNode *ast, int fancy);
+
+extern CNode *ast_root;
+extern CNode *null;
+
+#endif