def FindStartOfExpressionInLine()

in cpplint.py [0:0]


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)