(CommandList
  children: [
    (C {(set)} {(-u)})
    (FuncDef
      name: init
      body: 
        (BraceGroup
          children: [
            (Sentence child:(C {(_Dbg_debugger)}) terminator:<Op_Semi ";">)
            (C {(Lit_Other ":")})
          ]
          spids: [15]
        )
      spids: [11 14]
    )
    (FuncDef
      name: hanoi
      body: 
        (BraceGroup
          children: [
            (C {(typeset)} {(-i)} {(Lit_VarLike "n=") ($ VSub_Number "$1")})
            (C {(typeset)} {(-r)} {(Lit_VarLike "a=") ($ VSub_Number "$2")})
            (C {(typeset)} {(-r)} {(Lit_VarLike "b=") ($ VSub_Number "$3")})
            (C {(typeset)} {(-r)} {(Lit_VarLike "c=") ($ VSub_Number "$4")})
            (C {(_Dbg_set_trace)})
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DParen
                          child: 
                            (ArithBinary
                              op_id: Arith_Great
                              left: (ArithVarRef name:n)
                              right: (ArithWord w:{(Lit_Digits 0)})
                            )
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (DParen
                      child: (UnaryAssign op_id:Node_PostDMinus child:(LhsName name:n))
                    )
                    (C {(hanoi)} {($ VSub_Name "$n")} {($ VSub_Name "$a")} {($ VSub_Name "$c")} 
                      {($ VSub_Name "$b")}
                    )
                    (DParen
                      child: 
                        (BinaryAssign
                          op_id: Arith_Equal
                          left: (LhsName name:disc_num)
                          right: 
                            (ArithBinary
                              op_id: Arith_Minus
                              left: (ArithVarRef name:max)
                              right: (ArithVarRef name:n)
                            )
                        )
                    )
                    (C {(echo)} 
                      {
                        (DQ ("Move disk ") ($ VSub_Name "$n") (" on ") ($ VSub_Name "$a") (" to ") 
                          ($ VSub_Name "$b")
                        )
                      }
                    )
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (DParen
                                  child: 
                                    (ArithBinary
                                      op_id: Arith_Great
                                      left: (ArithVarRef name:n)
                                      right: (ArithWord w:{(Lit_Digits 0)})
                                    )
                                )
                              terminator: <Op_Semi ";">
                            )
                          ]
                          action: [
                            (C {(hanoi)} {($ VSub_Name "$n")} {($ VSub_Name "$c")} {($ VSub_Name "$b")} 
                              {($ VSub_Name "$a")}
                            )
                          ]
                          spids: [-1 145]
                        )
                      ]
                      spids: [-1 159]
                    )
                  ]
                  spids: [-1 85]
                )
              ]
              spids: [-1 162]
            )
          ]
          spids: [30]
        )
      spids: [26 29]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (DParen
                  child: 
                    (ArithBinary
                      op_id: Arith_Great
                      left: (ArithWord w:{($ VSub_Pound "$#")})
                      right: (ArithWord w:{(Lit_Digits 0)})
                    )
                )
              terminator: <Op_Semi ";">
            )
          ]
          action: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:top_builddir)
                  op: Equal
                  rhs: {($ VSub_Number "$1")}
                  spids: [185]
                )
              ]
              spids: [185]
            )
          ]
          spids: [-1 182]
        )
        (if_arm
          cond: [
            (Sentence
              child: 
                (DBracket
                  expr: 
                    (BoolUnary
                      op_id: BoolUnary_z
                      child: 
                        {
                          (BracedVarSub
                            token: <VSub_Name top_builddir>
                            suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(SQ )})
                            spids: [194 199]
                          )
                        }
                    )
                )
              terminator: <Op_Semi ";">
            )
          ]
          action: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:top_builddir)
                  op: Equal
                  rhs: {($ VSub_Name "$PWD") (/../..)}
                  spids: [208]
                )
              ]
              spids: [208]
            )
          ]
          spids: [188 205]
        )
      ]
      spids: [-1 212]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (DParen
                  child: 
                    (ArithBinary
                      op_id: Arith_Great
                      left: (ArithWord w:{($ VSub_Pound "$#")})
                      right: (ArithWord w:{(Lit_Digits 1)})
                    )
                )
              terminator: <Op_Semi ";">
            )
          ]
          action: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:cmdfile)
                  op: Equal
                  rhs: {($ VSub_Number "$2")}
                  spids: [232]
                )
              ]
              spids: [232]
            )
          ]
          spids: [-1 229]
        )
      ]
      else_action: [
        (Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (LhsName name:srcdir)
              op: Equal
              rhs: 
                {
                  (BracedVarSub
                    token: <VSub_Name top_srcdir>
                    suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(SQ <.>)})
                    spids: [239 245]
                  )
                }
              spids: [238]
            )
          ]
          spids: [238]
        )
        (Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (LhsName name:cmdfile)
              op: Equal
              rhs: {(${ VSub_Name top_srcdir) (/test/data/settrace.cmd)}
              spids: [248]
            )
          ]
          spids: [248]
        )
      ]
      spids: [235 254]
    )
    (C {(source)} {(${ VSub_Name top_builddir) (/bashdb-trace)} {(-q)} {(--no-init)} {(-L)} 
      {($ VSub_Name "$top_srcdir")} {(-B)} {(-x)} {($ VSub_Name "$cmdfile")}
    )
    (C {(typeset)} {(-i)} {(Lit_VarLike "max=") (1)})
    (C {(init)})
    (C {(hanoi)} {($ VSub_Name "$max")} {(SQ <a>)} {(SQ <b>)} {(SQ <c>)})
    (C {(_Dbg_debugger)} {(1)} {(_Dbg_do_quit)})
  ]
)