def METHOD_NAME(f):
    r = csv.reader(f, delimiter=";")
    prev_codepoint = 0
    class_first = None
    for row in r:
        codepoint = int(row[0], 16)
        name = row[1]
        class_ = row[2]
        if class_first is not None:
            if not name.endswith("Last>"):
                raise ValueError("Missing Last after First")
        for c in range(prev_codepoint + 1, codepoint):
            yield Codepoint(c, class_first)
        class_first = None
        if name.endswith("First>"):
            class_first = class_
        yield Codepoint(codepoint, class_)
        prev_codepoint = codepoint
    if class_first is not None:
        raise ValueError("Missing Last after First")
    for c in range(prev_codepoint + 1, NUM_CODEPOINTS):
        yield Codepoint(c, None)