def parse_moves
      s0 = @current_pos
      s1 = parse_firstboard
      if s1 != :failed
        parse_split
        s2 = []
        s3 = parse_move
        while s3 != :failed
          s2 << s3
          s3 = parse_move
        end
        parse_result
        @reported_pos = s0
        s0 = s2.unshift(s1)
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
def parse_moves
      s0 = @current_pos
      s1 = parse_firstboard
      if s1 != :failed
        parse_split
        s2 = []
        s3 = parse_move
        while s3 != :failed
          s2 << s3
          s3 = parse_move
        end
        parse_result
        @reported_pos = s0
        s0 = s2.unshift(s1)
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
moves : firstboard split? move* result?