recursive subroutine print_tree_internal(tree, node_i, uni)
implicit none
type(tree_node_t), intent(in) :: tree(:)
integer, intent(in) :: node_i
integer, intent(in) :: uni
if (node_i == INVALID_INDEX) return
select case (tree(node_i)%op)
case (op_char)
write(uni, '(a)', advance='no') trim(print_class_simplify(tree, node_i))
case (op_concat)
write(uni, '(a)', advance='no') "(concatenate "
call print_tree_internal(tree, tree(node_i)%left_i, uni)
write(uni, '(a)', advance='no') ' '
call print_tree_internal(tree, tree(node_i)%right_i, uni)
write(uni, '(a)', advance='no') ')'
case (op_union)
write(uni, '(a)', advance='no') "(or "
call print_tree_internal(tree, tree(node_i)%left_i, uni)
write(uni, '(a)', advance='no') ' '
call print_tree_internal(tree, tree(node_i)%right_i, uni)
write(uni, '(a)', advance='no') ')'
case (op_closure)
write(uni, '(a)', advance='no') "(closure"
call print_tree_internal(tree, tree(node_i)%left_i, uni)
write(uni, '(a)', advance='no') ')'
case (op_repeat)
write(uni, '(a)', advance='no') "(repeat "
call print_tree_internal(tree, tree(node_i)%left_i, uni)
if (tree(node_i)%min_repeat == INVALID_REPEAT_VAL) then
write(uni, "('{', ',', i0, '}')", advance='no') tree(node_i)%max_repeat
else if (tree(node_i)%max_repeat == INVALID_REPEAT_VAL) then
write(uni, "('{', i0, ',}')", advance='no') tree(node_i)%min_repeat
else
write(uni, "('{', i0, ',', i0, '}')",advance='no') tree(node_i)%min_repeat, tree(node_i)%max_repeat
end if
write(uni, '(a)', advance='no') ')'
case (op_empty)
write(uni, '(a)', advance='no') 'EMPTY'
case default
write(uni, '(a)') "This will not occur in 'print_tree'."
error stop
end select
end subroutine print_tree_internal