def parse_hms
      s0 = @current_pos
      s1 = match_digits!

      if s1 != :failed
        if match_str(":") != :failed
          s3 = match_digits!
          if s3 != :failed
            if match_str(":") != :failed
              s5 = match_digits!
              if s5 != :failed
                @reported_pos = s0
                s0 = { "h" => s1.join.to_i, "m" => s3.join.to_i, "s" => s5.join.to_i }
              else
                @current_pos = s0
                s0 = :failed
              end
            else
              @current_pos = s0
              s0 = :failed
            end
          else
            @current_pos = s0
            s0 = :failed
          end
        else
          @current_pos = s0
          s0 = :failed
        end
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
def parse_hms
      s0 = @current_pos
      s1 = match_digits!

      if s1 != :failed
        if match_str(":") != :failed
          s3 = match_digits!
          if s3 != :failed
            if match_str(":") != :failed
              s5 = match_digits!
              if s5 != :failed
                @reported_pos = s0
                s0 = { "h" => s1.join.to_i, "m" => s3.join.to_i, "s" => s5.join.to_i }
              else
                @current_pos = s0
                s0 = :failed
              end
            else
              @current_pos = s0
              s0 = :failed
            end
          else
            @current_pos = s0
            s0 = :failed
          end
        else
          @current_pos = s0
          s0 = :failed
        end
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
hms : [0-9]+ ":" [0-9]+ ":" [0-9]+