pragma Ada_2012; -- Make sure compiler uses Ada 2012 options package tree_pkg is subtype Op_Chr is Character with Static_Predicate => Op_Chr in '+' | '-' | '*' | '/' | '^'; -- The Static_Predicate is a 2012 option. It can safely be removed type Tree is private; function new_tree(i: Integer) return Tree; function new_tree(o: Op_Chr; L, R : Tree) return Tree; -- Create some new trees function eval(n : Tree) return Integer; function size(n : Tree) return Integer; -- How many nodes in the tree procedure pretty_print (n : Tree); -- Print tree, with root first procedure infix_print (n : Tree); -- Print tree in infix order, with parentheses procedure infix_print_no_parens (n : Tree); -- Print tree in infix order, as a tree procedure print_rpn (n : Tree); -- Print tree in rpn order private type Node(<>); -- Type Node will have a discriminant type Tree is access Node; type NodeKind is (int, oper); -- Two kinds of nodes -- Desciminant kind determines the fields type Node (kind : NodeKind) is record size : Natural := 1; -- Fields depend on discriminant case kind is when int => intval: Integer; when oper => opval: Op_Chr; left, right: Tree; end case; end record; end tree_pkg;