(command.CommandList
  children: [
    (C {<set>} {<-u>})
    (command.ShFunction
      name: init
      body: 
        (BraceGroup
          children: [
            (command.Sentence child:(C {<_Dbg_debugger>}) terminator:<Id.Op_Semi _>)
            (C {<Id.Lit_Colon ':'>})
          ]
        )
    )
    (command.ShFunction
      name: hanoi
      body: 
        (BraceGroup
          children: [
            (C {<typeset>} {<-i>} {<Id.Lit_VarLike 'n='> ($ Id.VSub_Number '$1')})
            (C {<typeset>} {<-r>} {<Id.Lit_VarLike 'a='> ($ Id.VSub_Number '$2')})
            (C {<typeset>} {<-r>} {<Id.Lit_VarLike 'b='> ($ Id.VSub_Number '$3')})
            (C {<typeset>} {<-r>} {<Id.Lit_VarLike 'c='> ($ Id.VSub_Number '$4')})
            (C {<_Dbg_set_trace>})
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DParen
                              child: 
                                (arith_expr.Binary
                                  op_id: Id.Arith_Great
                                  left: <Id.Lit_ArithVarLike n>
                                  right: {<Id.Lit_Digits 0>}
                                )
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.DParen
                      child: 
                        (arith_expr.UnaryAssign
                          op_id: Id.Node_PostDMinus
                          child: <Id.Lit_ArithVarLike n>
                        )
                    )
                    (C {<hanoi>} {($ Id.VSub_DollarName '$n')} {($ Id.VSub_DollarName '$a')} 
                      {($ Id.VSub_DollarName '$c')} {($ Id.VSub_DollarName '$b')}
                    )
                    (command.DParen
                      child: 
                        (arith_expr.BinaryAssign
                          op_id: Id.Arith_Equal
                          left: <Id.Lit_ArithVarLike disc_num>
                          right: 
                            (arith_expr.Binary
                              op_id: Id.Arith_Minus
                              left: <Id.Lit_ArithVarLike max>
                              right: <Id.Lit_ArithVarLike n>
                            )
                        )
                    )
                    (C {<echo>} 
                      {
                        (DQ <'Move disk '> ($ Id.VSub_DollarName '$n') <' on '> 
                          ($ Id.VSub_DollarName '$a') <' to '> ($ Id.VSub_DollarName '$b')
                        )
                      }
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (command.DParen
                                      child: 
                                        (arith_expr.Binary
                                          op_id: Id.Arith_Great
                                          left: <Id.Lit_ArithVarLike n>
                                          right: {<Id.Lit_Digits 0>}
                                        )
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (C {<hanoi>} {($ Id.VSub_DollarName '$n')} {($ Id.VSub_DollarName '$c')} 
                              {($ Id.VSub_DollarName '$b')} {($ Id.VSub_DollarName '$a')}
                            )
                          ]
                          spids: [130 145]
                        )
                      ]
                    )
                  ]
                  spids: [70 85]
                )
              ]
            )
          ]
        )
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.DParen
                      child: 
                        (arith_expr.Binary
                          op_id: Id.Arith_Great
                          left: {($ Id.VSub_Pound '$#')}
                          right: {<Id.Lit_Digits 0>}
                        )
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:top_builddir)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [185]
                )
              ]
            )
          ]
          spids: [167 182]
        )
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.DBracket
                      expr: 
                        (bool_expr.Unary
                          op_id: Id.BoolUnary_z
                          child: 
                            {
                              (braced_var_sub
                                token: <Id.VSub_Name top_builddir>
                                suffix_op: (suffix_op.Unary tok:<Id.VTest_ColonHyphen ':-'> arg_word:{(SQ )})
                              )
                            }
                        )
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:top_builddir)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_DollarName '$PWD') <'/../..'>}
                  spids: [208]
                )
              ]
            )
          ]
          spids: [188 205]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.DParen
                      child: 
                        (arith_expr.Binary
                          op_id: Id.Arith_Great
                          left: {($ Id.VSub_Pound '$#')}
                          right: {<Id.Lit_Digits 1>}
                        )
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:cmdfile)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$2')}
                  spids: [232]
                )
              ]
            )
          ]
          spids: [215 229]
        )
      ]
      else_action: [
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:srcdir)
              op: assign_op.Equal
              rhs: 
                {
                  (braced_var_sub
                    token: <Id.VSub_Name top_srcdir>
                    suffix_op: (suffix_op.Unary tok:<Id.VTest_ColonHyphen ':-'> arg_word:{(SQ <.>)})
                  )
                }
              spids: [238]
            )
          ]
        )
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:cmdfile)
              op: assign_op.Equal
              rhs: {(${ Id.VSub_Name top_srcdir) <'/test/data/settrace.cmd'>}
              spids: [248]
            )
          ]
        )
      ]
    )
    (C {<source>} {(${ Id.VSub_Name top_builddir) <'/bashdb-trace'>} {<-q>} {<--no-init>} {<-L>} 
      {($ Id.VSub_DollarName '$top_srcdir')} {<-B>} {<-x>} {($ Id.VSub_DollarName '$cmdfile')}
    )
    (C {<typeset>} {<-i>} {<Id.Lit_VarLike 'max='> <1>})
    (C {<init>})
    (C {<hanoi>} {($ Id.VSub_DollarName '$max')} {(SQ <a>)} {(SQ <b>)} {(SQ <c>)})
    (C {<_Dbg_debugger>} {<1>} {<_Dbg_do_quit>})
  ]
)