- public boolean newNode(Node parent, Forest pending, Parser.Table.State state, boolean fromEmptyReduction) {
+ public boolean newNode(Node parent, Forest pending, State state, boolean fromEmptyReduction) {
+ return newNode(parent, pending, state, fromEmptyReduction, null); }
+ public boolean newNode(Node parent, Forest pending, State state, boolean fromEmptyReduction, Reduction reduction) {
+ int pos = parent==null?0:parent.phase()==null?0:parent.phase().pos;
+ if (reduction!=null) {
+ if (inhibited.contains(pos, reduction.position.owner())) return false;
+ if (reduction.position.owner().needs != null) {
+ for(Sequence s : reduction.position.owner().needs) {
+ if (!performed.contains(pos, s)) {
+ waiting.add(s, new Waiting(parent, pending, state, fromEmptyReduction, reduction));
+ return false;
+ }
+ }
+ }
+ performed.add(pos, reduction.position.owner());
+ }