1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 | package body aada_compiler_node_package is procedure init(node: in out compiler_node; token: in aada_compiler_token_package.compiler_token_type) is begin node.token := token; end init; -- note that the children remains! procedure unlink(node: in out compiler_node_access) is begin if node.previous /= null then node.previous.next := node.next; elsif node.parent /= null then node.parent.child(node.index) := node.next; end if; if node.next /= null then node.next.previous := node.previous; end if; node.parent := null; node.next := null; node.previous := null; end unlink; procedure parent(node: in out compiler_node_access; parent: in out compiler_node_access; child_index: in compiler_node_index := 1) is l: compiler_node_access; begin node := first(node); -- attach to the new parent if not null if parent /= null and then node.parent /= parent then if parent.child(child_index) /= null then -- we're not the first... attach at the end of the existing children l := last(parent.child(child_index)); l.next := node; node.previous := l; else -- we're the first parent.child(child_index) := node; end if; -- avoid the detach (see loop below) node.parent := parent; end if; -- now reparent all the siblings in this list while node /= null loop -- detach from the old parent if any if node.parent /= null and then node.parent /= parent then node.parent.child(node.index) := null; end if; node.parent := parent; node.index := child_index; -- loop through all the siblings node := node.next; end loop; end parent; function parent(node: in compiler_node_access) return compiler_node_access is begin return node.parent; end parent; function child(node: in compiler_node_access; child_index: in compiler_node_index := 1) return compiler_node_access is begin return node.child(child_index); end child; procedure next(node: in out compiler_node_access; next: in out compiler_node_access) is f: compiler_node_access; l: compiler_node_access; begin f := first(next); l := last(next); l.next := node.next; f.previous := node; node.next := f; if l.next /= null then l.next.previous := l; end if; -- reparent our new children parent(node, node.parent, node.index); end next; function next(node: in compiler_node_access) return compiler_node_access is begin return node.next; end next; function last(node: in compiler_node_access) return compiler_node_access is n: compiler_node_access := node; begin if n /= null then while n.next /= null loop n := n.next; end loop; end if; return n; end last; procedure previous(node: in out compiler_node_access; previous: in out compiler_node_access) is f: compiler_node_access; l: compiler_node_access; begin f := first(previous); l := last(previous); l.next := node; f.previous := node.previous; node.previous := l; if f.previous /= null then f.previous.next := f; end if; -- reparent our new children parent(node, node.parent, node.index); end previous; function previous(node: in compiler_node_access) return compiler_node_access is begin return node.previous; end previous; function first(node: in compiler_node_access) return compiler_node_access is n: compiler_node_access := node; begin if n /= null then while n.previous /= null loop n := n.previous; end loop; end if; return n; end first; procedure create_node(node_handle: in out compiler_node_handle; token: in aada_compiler_token_package.compiler_token_type; children: in compiler_node_index := 0) is begin node_handle.node := new compiler_node(children); init(node_handle.node.all, token); end create_node; procedure init(node_handle: compiler_node_handle; token: in aada_compiler_token_package.compiler_token_type) is begin init(node_handle.node.all, token); end init; procedure parent(node_handle: in out compiler_node_handle; parent_handle: in out compiler_node_handle; child_index: in compiler_node_index := 1) is begin parent(node_handle.node, parent_handle.node, child_index); end parent; procedure next(node_handle: in out compiler_node_handle; next_handle: in out compiler_node_handle) is begin next(node_handle.node, next_handle.node); end next; end aada_compiler_node_package; -- vim: ts=2 sw=2 et syntax=ada |
Project | aada v1.0-338 (Project id #3) |
Process | Done (Last compiled on 2012/01/13 01:21:26) |
Description | Alexis Ada Compiler written in Ada (my first attempt was in C++ which is not correct for an Ada compiler.) |