@staticmethod<EOL><INDENT>def __ascii_reader(fh, header):<DEDENT>
lines = header.split('<STR_LIT:\n>')<EOL>recoverable = [True]<EOL>def get(prefix='<STR_LIT>'):<EOL><INDENT>if lines:<EOL><INDENT>line = lines.pop(<NUM_LIT:0>)<EOL><DEDENT>else:<EOL><INDENT>raise RuntimeError(recoverable[<NUM_LIT:0>], '<STR_LIT>')<EOL><DEDENT>if not lines:<EOL><INDENT>recoverable[<NUM_LIT:0>] = False<EOL>lines[:] = fh.read(Stl.BUFFER_SIZE).split('<STR_LIT:\n>')<EOL>line += lines.pop(<NUM_LIT:0>)<EOL><DEDENT>line = line.lower().strip()<EOL>if prefix:<EOL><INDENT>if line.startswith(prefix):<EOL><INDENT>values = line.replace(prefix, '<STR_LIT>', <NUM_LIT:1>).strip().split()<EOL><DEDENT>elif line.startswith('<STR_LIT>'):<EOL><INDENT>raise StopIteration()<EOL><DEDENT>else:<EOL><INDENT>raise RuntimeError(recoverable[<NUM_LIT:0>],<EOL>'<STR_LIT>' % (line,<EOL>prefix))<EOL><DEDENT>if len(values) == <NUM_LIT:3>:<EOL><INDENT>vertex = [float(v) for v in values]<EOL>return vertex<EOL><DEDENT>else:  <EOL><INDENT>raise RuntimeError(recoverable[<NUM_LIT:0>],<EOL>'<STR_LIT>' % line)<EOL><DEDENT><DEDENT>else:<EOL><INDENT>return line<EOL><DEDENT><DEDENT>line = get()<EOL>if not line.startswith('<STR_LIT>') and line.startswith('<STR_LIT>'):<EOL><INDENT>print("<STR_LIT>")<EOL><DEDENT>if not lines:<EOL><INDENT>raise RuntimeError(recoverable[<NUM_LIT:0>],<EOL>'<STR_LIT>')<EOL><DEDENT>while True:<EOL><INDENT>try:<EOL><INDENT>normals = get('<STR_LIT>')<EOL>assert get() == '<STR_LIT>'<EOL>v0 = get('<STR_LIT>')<EOL>v1 = get('<STR_LIT>')<EOL>v2 = get('<STR_LIT>')<EOL>assert get() == '<STR_LIT>'<EOL>assert get() == '<STR_LIT>'<EOL>attrs = <NUM_LIT:0><EOL>yield (normals, (v0, v1, v2), attrs)<EOL><DEDENT>except AssertionError as e:<EOL><INDENT>raise RuntimeError(recoverable[<NUM_LIT:0>], e)<EOL><DEDENT>except StopIteration:<EOL><INDENT>if any(lines):<EOL><INDENT>fh.seek(-len('<STR_LIT:\n>'.join(lines)), os.SEEK_CUR)<EOL><DEDENT>raise<EOL><DEDENT><DEDENT>
:param fh:
:param header:
:return: