private boolean ruleInvocation(final int pos) {
    boolean change = false;
    for(int i = pos; i < chart.size(); i++) {
      final Edge e = chart.get(i);
      if(!e.isActive()) {
        for(final String lhs : grammar.withLeftmost(e.lhs)) {
          for(final String[] rhs : grammar.rhs(lhs)) {
            if(!rhs[0].equals(e.lhs) || rhs.length > tokens.length - e.start) {
              continue;
            }
            final Edge nw = new Edge(e.start, e.end, 1, lhs, rhs,
                new ArrayList<Edge>(Arrays.asList(e)));
            if(!chart.contains(nw)) {
              chart.add(nw);
              change = true;
              log("IV", "Adding edge: " + nw);
            }
          }
        }
      }
    }
    return change;
  }