parameters: (line, endpos, stack)
return_statement: return (-1, stack)
docstring: Find position at the matching start of current expression.
  
      This is almost the reverse of FindEndOfExpressionInLine, but note
      that the input position and returned position differs by 1.
  
      Args:
        line: a CleansedLines line.
        endpos: start searching at this position.
        stack: nesting stack at endpos.
  
      Returns:
        On finding matching start: (index at matching start, None)
        On finding an unclosed expression: (-1, None)
        Otherwise: (-1, new stack at beginning of this line)
docstring_summary: Find position at the matching start of current expression.
docstring_tokens: Find position at the matching start of current expression .
function: def FindStartOfExpressionInLine(line, endpos, stack):
      """Find position at the matching start of current expression.
  
      This is almost the reverse of FindEndOfExpressionInLine, but note
      that the input position and returned position differs by 1.
  
      Args:
        line: a CleansedLines line.
        endpos: start searching at this position.
        stack: nesting stack at endpos.
  
      Returns:
        On finding matching start: (index at matching start, None)
        On finding an unclosed expression: (-1, None)
        Otherwise: (-1, new stack at beginning of this line)
      """
      i = endpos
      while i >= 0:
          char = line[i]
          if char in ')]}':
              # Found end of expression, push to expression stack
              stack.append(char)
          elif char == '>':
              # Found potential end of template argument list.
              #
              # Ignore it if it's a "->" or ">=" or "operator>"
              if (i > 0
                  and (line[i - 1] == '-'
                       or Match(r'\s>=\s', line[i - 1:])
                       or Search(r'\boperator\s*$', line[0:i]))):
                  i -= 1
              else:
                  stack.append('>')
          elif char == '<':
              # Found potential start of template argument list
              if i > 0 and line[i - 1] == '<':
                  # Left shift operator
                  i -= 1
              else:
                  # If there is a matching '>', we can pop the expression stack.
                  # Otherwise, ignore this '<' since it must be an operator.
                  if stack and stack[-1] == '>':
                      stack.pop()
                      if not stack:
                          return (i, None)
          elif char in '([{':
              # Found start of expression.
              #
              # If there are any unmatched '>' on the stack, they must be
              # operators.  Remove those.
              while stack and stack[-1] == '>':
                  stack.pop()
              if not stack:
                  return (-1, None)
              if ((char == '(' and stack[-1] == ')')
                  or (char == '[' and stack[-1] == ']')
                      or (char == '{' and stack[-1] == '}')):
                  stack.pop()
                  if not stack:
                      return (i, None)
              else:
                  # Mismatched parentheses
                  return (-1, None)
          elif char == ';':
              # Found something that look like end of statements.  If we are currently
              # expecting a '<', the matching '>' must have been an operator, since
              # template argument list should not contain statements.
              while stack and stack[-1] == '>':
                  stack.pop()
              if not stack:
                  return (-1, None)
  
          i -= 1
  
      return (-1, stack)
function_tokens: def FindStartOfExpressionInLine ( line , endpos , stack ) : i = endpos while i >= 0 : char = line [ i ] if char in ')]}' : # Found end of expression, push to expression stack stack . append ( char ) elif char == '>' : # Found potential end of template argument list. # # Ignore it if it's a "->" or ">=" or "operator>" if ( i > 0 and ( line [ i - 1 ] == '-' or Match ( r'\s>=\s' , line [ i - 1 : ] ) or Search ( r'\boperator\s*$' , line [ 0 : i ] ) ) ) : i -= 1 else : stack . append ( '>' ) elif char == '<' : # Found potential start of template argument list if i > 0 and line [ i - 1 ] == '<' : # Left shift operator i -= 1 else : # If there is a matching '>', we can pop the expression stack. # Otherwise, ignore this '<' since it must be an operator. if stack and stack [ - 1 ] == '>' : stack . pop ( ) if not stack : return ( i , None ) elif char in '([{' : # Found start of expression. # # If there are any unmatched '>' on the stack, they must be # operators.  Remove those. while stack and stack [ - 1 ] == '>' : stack . pop ( ) if not stack : return ( - 1 , None ) if ( ( char == '(' and stack [ - 1 ] == ')' ) or ( char == '[' and stack [ - 1 ] == ']' ) or ( char == '{' and stack [ - 1 ] == '}' ) ) : stack . pop ( ) if not stack : return ( i , None ) else : # Mismatched parentheses return ( - 1 , None ) elif char == ';' : # Found something that look like end of statements.  If we are currently # expecting a '<', the matching '>' must have been an operator, since # template argument list should not contain statements. while stack and stack [ - 1 ] == '>' : stack . pop ( ) if not stack : return ( - 1 , None ) i -= 1 return ( - 1 , stack )