doc: paulchen beispiele {code{a,b},gesamt} entpackt (jedes mal entpacken nervt langsa...
[uebersetzerbau-ss10.git] / aus_sammelwut / paulchen / ublu / ss08 / abgabe / codea / tree.h
1 #ifndef __TREE_H_
2 #define __TREE_H_
3
4 #ifndef CODE
5 typedef struct burm_state *STATEPTR_TYPE; 
6 #endif
7
8 enum {
9         OP_Not=1,
10         OP_Negation,
11         OP_Addition,
12         OP_Multiplication,
13         OP_Disjunction,
14         OP_Greater,
15         OP_Equal,
16         OP_ID,
17         OP_Number,
18         OP_Field,
19         OP_Return,
20         OP_Zero,
21         OP_One,
22         OP_Exprs,
23         OP_Call
24 };
25
26 static char rule_names[100][100]={
27         "",
28         "OP_Not",
29         "OP_Negation",
30         "OP_Addition",
31         "OP_Multiplication",
32         "OP_Disjunction",
33         "OP_Greater",
34         "OP_Equal",
35         "OP_ID",
36         "OP_Number",
37         "OP_Field",
38         "OP_Return",
39         "OP_Zero",
40         "OP_One",
41         "OP_Exprs",
42         "OP_Call"
43 };
44           
45
46 /* struct for the tree build by ox for iburg */
47 typedef struct treenode {
48         int op;
49         struct treenode *kids[2];
50         STATEPTR_TYPE label;
51         char *name;
52         long value;
53         char *reg;
54         struct treenode *parent;
55         int skip_reg;
56         int param_index; /* -1 if not a parameter */
57 } treenode;
58
59 typedef treenode *treenodep;
60
61 /* macros for iburg being able to traverse the tree */
62 #define NODEPTR_TYPE            treenodep
63 #define OP_LABEL(p)             ((p)->op)
64 #define LEFT_CHILD(p)           ((p)->kids[0])
65 #define RIGHT_CHILD(p)          ((p)->kids[1])
66 #define STATE_LABEL(p)          ((p)->label)
67 #define PANIC                   printf
68
69 /* see tree.c for description about these procedures */
70 treenode *new_node(int op, treenode *left, treenode *right);
71 treenode *new_node_value(int op, treenode *left, treenode *right, long value, int param);
72 treenode *new_leaf(int op);
73 treenode *new_number_leaf(long value);
74 treenode *new_named_leaf(int op, char *name);
75 treenode *new_named_leaf_value(int op, char *name, long value, int param);
76 treenode *new_named_node(int op, treenode *left, treenode *right, char *name);
77
78 void write_indent(int indent);
79 void write_tree(treenode *node, int indent);
80
81 #endif /* __TREE_H */
82