gesamt: leerstehende Expr's auswerten (weil da Methodenaufrufe drin sein koennten)
[uebersetzerbau-ss10.git] / gesamt / tree.h
1 #ifndef __TREE_H
2 #define __TREE_H
3
4 #define TREENULL (struct treenode *)NULL
5 #define TREESIZE (sizeof(struct treenode))
6 #define TREECAST struct treenode *
7
8 #ifndef BFEHAX
9 typedef struct burm_state *STATEPTR_TYPE;
10 #endif
11
12 enum {
13         O_RET=1, O_NULL, O_SUB, O_MUL,
14         O_OR=5, O_LESS, O_EQ, O_ID, O_ADD,
15         O_NUM=10, O_FIELD, O_MTWO, O_MFOUR, O_MEIGHT,
16         O_MONE=15, O_ASSIGN, O_IF, O_BOOL, O_CALL,
17         O_ARG=20, O_NOTHING, O_EXPR
18 };
19
20 static char *o_names[] = {
21         "", "O_RET", "O_NULL", "O_SUB", "O_MUL",
22         "O_OR", "O_LESS", "O_EQ", "O_ID", "O_ADD",
23         "O_NUM", "O_FIELD", "O_MTWO", "O_MFOUR", "O_MEIGHT",
24         "O_MONE", "O_ASSIGN", "O_IF", "O_BOOL", "O_CALL",
25         "O_ARG", "O_NOTHING", "O_EXPR"
26 };
27
28 struct treenode {
29         int op;
30         struct treenode *kids[2];
31         STATEPTR_TYPE label;
32         char *name;
33         long val;
34         char *reg;
35         struct treenode *parent;
36         int param_index;
37         int soffset;
38         int paramges;
39         int vars;
40 };
41
42 typedef struct treenode *treenodep;
43
44 #define NODEPTR_TYPE treenodep
45 #define OP_LABEL(p) ((p)->op)
46 #define LEFT_CHILD(p) ((p)->kids[0])
47 #define RIGHT_CHILD(p) ((p)->kids[1])
48 #define STATE_LABEL(p) ((p)->label)
49 #define PANIC printf
50
51 struct treenode *new_node(int op, struct treenode *l, struct treenode *r);
52 struct treenode *new_number(long val);
53 struct treenode *new_param(int op, char *name, struct treenode *l, struct treenode *r, int param_index);
54 struct treenode *new_field(char *name, struct treenode *l, struct treenode *r, int soffset);
55 struct treenode *new_call(char *name, struct treenode *l, struct treenode *r, int paramges, int vars);
56 struct treenode *new_arg(struct treenode *l, struct treenode *r, int soffset);
57 struct treenode *new_nothing(void);
58 void write_tree(struct treenode *node, int ident);
59
60 #endif