--- /dev/null
+#ifndef __TREE_H_
+#define __TREE_H_
+
+#ifndef CODE
+typedef struct burm_state *STATEPTR_TYPE;
+#endif
+
+enum {
+ OP_Not=1,
+ OP_Negation,
+ OP_Addition,
+ OP_Multiplication,
+ OP_Disjunction,
+ OP_Greater,
+ OP_Equal,
+ OP_ID,
+ OP_Number,
+ OP_Field,
+ OP_Return,
+ OP_Zero,
+ OP_One,
+ OP_Exprs,
+ OP_Call
+};
+
+static char rule_names[100][100]={
+ "",
+ "OP_Not",
+ "OP_Negation",
+ "OP_Addition",
+ "OP_Multiplication",
+ "OP_Disjunction",
+ "OP_Greater",
+ "OP_Equal",
+ "OP_ID",
+ "OP_Number",
+ "OP_Field",
+ "OP_Return",
+ "OP_Zero",
+ "OP_One",
+ "OP_Exprs",
+ "OP_Call"
+};
+
+
+/* struct for the tree build by ox for iburg */
+typedef struct treenode {
+ int op;
+ struct treenode *kids[2];
+ STATEPTR_TYPE label;
+ char *name;
+ long value;
+ char *reg;
+ struct treenode *parent;
+ int skip_reg;
+} treenode;
+
+typedef treenode *treenodep;
+
+/* macros for iburg being able to traverse the tree */
+#define NODEPTR_TYPE treenodep
+#define OP_LABEL(p) ((p)->op)
+#define LEFT_CHILD(p) ((p)->kids[0])
+#define RIGHT_CHILD(p) ((p)->kids[1])
+#define STATE_LABEL(p) ((p)->label)
+#define PANIC printf
+
+/* see tree.c for description about these procedures */
+treenode *new_node(int op, treenode *left, treenode *right);
+treenode *new_node_value(int op, treenode *left, treenode *right, long value);
+treenode *new_leaf(int op);
+treenode *new_number_leaf(long value);
+treenode *new_named_leaf(int op, char *name);
+treenode *new_named_leaf_value(int op, char *name, long value);
+treenode *new_named_node(int op, treenode *left, treenode *right, char *name);
+
+void write_indent(int indent);
+void write_tree(treenode *node, int indent);
+
+#endif /* __TREE_H */
+