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 )