def extract_parts(usage):
    """Extract individual components from a usage string"""
    opp = {'{': '}', '[': ']', '(': ')'}
    cur_word = []
    tokens = []
    stack = []
    for c in usage:
        if c.isspace() and not stack:
            if cur_word:
                tokens.append(''.join(cur_word))
                cur_word.clear()
        elif c in '{[(':
            stack.append(c)
            cur_word.append(c)
        elif c in '}])' and stack and c == opp[stack[-1]]:
            stack.pop()
            cur_word.append(c)
            if not stack and cur_word:
                tokens.append(''.join(cur_word))
                cur_word.clear()
        else:
            cur_word.append(c)
    if cur_word:
        tokens.append(''.join(cur_word))
    return tokens
