def _parse_table(self, node, state):
if not self.tabular:<EOL><INDENT>logger.error("<STR_LIT>")<EOL>return state<EOL><DEDENT>if node.tag == "<STR_LIT>":<EOL><INDENT>table_idx = state["<STR_LIT>"]["<STR_LIT>"]<EOL>stable_id = f"<STR_LIT>"<EOL>name = node.attrib["<STR_LIT:name>"] if "<STR_LIT:name>" in node.attrib else None<EOL>parts = {}<EOL>parts["<STR_LIT>"] = state["<STR_LIT>"]<EOL>parts["<STR_LIT>"] = stable_id<EOL>parts["<STR_LIT:name>"] = name<EOL>parts["<STR_LIT>"] = table_idx<EOL>parent = state["<STR_LIT>"][node]<EOL>if isinstance(parent, Cell):<EOL><INDENT>parts["<STR_LIT>"] = parent.table.section<EOL><DEDENT>elif isinstance(parent, Section):<EOL><INDENT>parts["<STR_LIT>"] = parent<EOL><DEDENT>else:<EOL><INDENT>raise NotImplementedError("<STR_LIT>")<EOL><DEDENT>state["<STR_LIT>"][node] = Table(**parts)<EOL>state["<STR_LIT>"][table_idx] = {<EOL>"<STR_LIT>": defaultdict(int),<EOL>"<STR_LIT>": <NUM_LIT:0>,<EOL>"<STR_LIT>": -<NUM_LIT:1>,<EOL>"<STR_LIT>": <NUM_LIT:0>,<EOL>}<EOL>state["<STR_LIT>"]["<STR_LIT>"] += <NUM_LIT:1><EOL><DEDENT>elif node.tag == "<STR_LIT>":<EOL><INDENT>if not isinstance(state["<STR_LIT>"][node], Table):<EOL><INDENT>raise NotImplementedError("<STR_LIT>")<EOL><DEDENT>state["<STR_LIT>"][state["<STR_LIT>"][node].position]["<STR_LIT>"] = <NUM_LIT:0><EOL>state["<STR_LIT>"][state["<STR_LIT>"][node].position]["<STR_LIT>"] += <NUM_LIT:1><EOL><DEDENT>elif node.tag in ["<STR_LIT>", "<STR_LIT>"]:<EOL><INDENT>if not isinstance(state["<STR_LIT>"][node], Table):<EOL><INDENT>raise NotImplementedError("<STR_LIT>")<EOL><DEDENT>if not state["<STR_LIT>"][state["<STR_LIT>"][node].position]["<STR_LIT>"] >= <NUM_LIT:0>:<EOL><INDENT>raise NotImplementedError("<STR_LIT>")<EOL><DEDENT>while state["<STR_LIT>"][state["<STR_LIT>"][node].position]["<STR_LIT>"][<EOL>(<EOL>state["<STR_LIT>"][state["<STR_LIT>"][node].position]["<STR_LIT>"],<EOL>state["<STR_LIT>"][state["<STR_LIT>"][node].position]["<STR_LIT>"],<EOL>)<EOL>]:  <EOL><INDENT>state["<STR_LIT>"][state["<STR_LIT>"][node].position]["<STR_LIT>"] += <NUM_LIT:1><EOL><DEDENT>col_start = state["<STR_LIT>"][state["<STR_LIT>"][node].position]["<STR_LIT>"]<EOL>row_start = state["<STR_LIT>"][state["<STR_LIT>"][node].position]["<STR_LIT>"]<EOL>row_end = row_start<EOL>if "<STR_LIT>" in node.attrib:<EOL><INDENT>try:<EOL><INDENT>row_end += int(node.get("<STR_LIT>")) - <NUM_LIT:1><EOL><DEDENT>except ValueError:<EOL><INDENT>logger.error(f"<STR_LIT>")<EOL><DEDENT><DEDENT>col_end = col_start<EOL>if "<STR_LIT>" in node.attrib:<EOL><INDENT>try:<EOL><INDENT>col_end += int(node.get("<STR_LIT>")) - <NUM_LIT:1><EOL><DEDENT>except ValueError:<EOL><INDENT>logger.error(f"<STR_LIT>")<EOL><DEDENT><DEDENT>for r, c in itertools.product(<EOL>list(range(row_start, row_end + <NUM_LIT:1>)), list(range(col_start, col_end + <NUM_LIT:1>))<EOL>):<EOL><INDENT>state["<STR_LIT>"][state["<STR_LIT>"][node].position]["<STR_LIT>"][(r, c)] = <NUM_LIT:1><EOL><DEDENT>name = node.attrib["<STR_LIT:name>"] if "<STR_LIT:name>" in node.attrib else None<EOL>parts = defaultdict(list)<EOL>parts["<STR_LIT>"] = state["<STR_LIT>"]<EOL>parts["<STR_LIT:name>"] = name<EOL>parts["<STR_LIT>"] = state["<STR_LIT>"][node]<EOL>parts["<STR_LIT>"] = row_start<EOL>parts["<STR_LIT>"] = row_end<EOL>parts["<STR_LIT>"] = col_start<EOL>parts["<STR_LIT>"] = col_end<EOL>parts["<STR_LIT>"] = state["<STR_LIT>"][state["<STR_LIT>"][node].position][<EOL>"<STR_LIT>"<EOL>]<EOL>stable_id = (<EOL>f"<STR_LIT>"<EOL>f"<STR_LIT>"<EOL>f"<STR_LIT>"<EOL>f"<STR_LIT::>"<EOL>f"<STR_LIT>"<EOL>f"<STR_LIT::>"<EOL>f"<STR_LIT>"<EOL>f"<STR_LIT::>"<EOL>f"<STR_LIT>"<EOL>)<EOL>parts["<STR_LIT>"] = stable_id<EOL>state["<STR_LIT>"][node] = Cell(**parts)<EOL>state["<STR_LIT>"][state["<STR_LIT>"][node].position]["<STR_LIT>"] += <NUM_LIT:1><EOL>state["<STR_LIT>"][state["<STR_LIT>"][node].position]["<STR_LIT>"] += <NUM_LIT:1><EOL><DEDENT>return state<EOL>
Parse a table node.

        :param node: The lxml table node to parse
        :param state: The global state necessary to place the node in context
            of the document as a whole.