docs: def _parse_variable(s: str, curr_row: int, curr_col: int) -> Tuple:
          '''
          $A,$2 <- constant col and row
          $row,$2 <- current col, row 2
          $A+1,$2 <- col A + 1 = 2, row 2
          $row+1,$2 <- current col + 1, row 2
          $A,$2-1 <-- col A, row 2 - 1 = 1
          '''
  
          def parse_expression(ss, curr_row, curr_col):
              ss = ss.replace('$row', str(curr_row))
              ss = ss.replace('$col', str(curr_col))
              ss = ExcelExtractor._re_row_identifier.sub(
                  lambda x: str(ExcelExtractor._row_name_to_num(x.group()[1:])) if len(x.group()) > 0 else '', ss)
              ss = ExcelExtractor._re_col_identifier.sub(
                  lambda x: str(ExcelExtractor._col_name_to_num(x.group()[1:])) if len(x.group()) > 0 else '', ss)
              return eval(ss)
  
          ss = s.split(',')
          if len(ss) == 1:
              return parse_expression(ss[0], curr_row, curr_col),
          elif len(ss) == 2:
              rr, cc = (ss[1], ss[0])
              return parse_expression(rr, curr_row, curr_col), parse_expression(cc, curr_row, curr_col)
          else:
              raise ValueError('Invalid variable')