def parse_field(lexer: Lexer) -> FieldNode:
    """Field: Alias? Name Arguments? Directives? SelectionSet?"""
    start = lexer.token
    name_or_alias = parse_name(lexer)
    if expect_optional_token(lexer, TokenKind.COLON):
        alias: Optional[NameNode] = name_or_alias
        name = parse_name(lexer)
    else:
        alias = None
        name = name_or_alias
    return FieldNode(
        alias=alias,
        name=name,
        arguments=parse_arguments(lexer, False),
        directives=parse_directives(lexer, False),
        selection_set=parse_selection_set(lexer)
        if peek(lexer, TokenKind.BRACE_L)
        else None,
        loc=loc(lexer, start),
    )
Field: Alias? Name Arguments? Directives? SelectionSet?