private void __parse() {
        int size = this.table.size();

        for (int width = 2; width <= size; width++)
            for (int start = 0; start <= size-width; start++) {
                int end = start+width;
                for (int mid = start+1; mid < end; mid++) {
                    for (Rule leftCell : this.table.get(start).get(mid-1))
                        for (Rule rightCell : this.table.get(mid).get(end-1)) {
                            LinkedList<String> right = new LinkedList<String>();
                            right.add(leftCell.getLeftTags().getFirst());
                            right.add(rightCell.getLeftTags().getFirst());

                            ArrayList<Integer> pos = Rule.findRuleRight(right, this.rules);
                            nextRule: for (int i : pos) {
                                Rule rule = this.rules.get(i);
                                ArrayList<Rule> cellList = this.table.get(start).get(end-1);
                                ArrayList<Integer> pos1 = Rule.findRule(rule, cellList);

                                for (int j : pos1)
                                    if (((CYKCell)(cellList.get(j))).mid == mid)
                                        continue nextRule;

                                this.table.get(start).get(end-1).add(new CYKCell(
                                        rule.getLeftTags().getFirst(), rule.getRightTags().getFirst(),
                                        rule.getRightTags().get(1), start, mid, end
                                ));
                            }
                        }
                }
                scanSingularRules(start, end-1);
            }
    }