def do_statement(source, start):
start = pass_white(source, start)<EOL>if not start < len(source):  <EOL><INDENT>return None, start<EOL><DEDENT>if any(startswith_keyword(source[start:], e) for e in {'<STR_LIT>', '<STR_LIT:default>'}):<EOL><INDENT>return None, start<EOL><DEDENT>rest = source[start:]<EOL>for key, meth in KEYWORD_METHODS.items(<EOL>):  <EOL><INDENT>if rest.startswith(key):<EOL><INDENT>if len(key) == len(rest) or rest[len(key)] not in IDENTIFIER_PART:<EOL><INDENT>return meth(source, start)<EOL><DEDENT><DEDENT><DEDENT>if rest[<NUM_LIT:0>] == '<STR_LIT:{>':  <EOL><INDENT>return do_block(source, start)<EOL><DEDENT>cand = parse_identifier(source, start, False)<EOL>if cand is not None:  <EOL><INDENT>label, cand_start = cand<EOL>cand_start = pass_white(source, cand_start)<EOL>if source[cand_start] == '<STR_LIT::>':<EOL><INDENT>return do_label(source, start)<EOL><DEDENT><DEDENT>return do_expression(source, start)<EOL>
returns none if not found other functions that begin with 'do_' raise
    also this do_ type function passes white space