HashSet<Phase.Waiting> tail = new HashSet<Phase.Waiting>();
/** corresponds to a positions <i>between tokens</i> the input stream; same as Tomita's U_i's */
- public class Phase implements Invokable<State, Forest, GSS.Phase.Node> {
+ public class Phase implements Invokable<State, Forest, GSS.Phase.Node>, IntegerMappable {
+ public int toInt() { return pos+1; }
/** the token immediately after this phase */
public final Token token;
ret.append("\n ");
ret.append(message);
HashMap<String,HashSet<String>> errors = new HashMap<String,HashSet<String>>();
- for(Node n : hash.values()) complain(n, errors, false);
+ for(Node n : hash.values()) {
+ //System.out.println(n.state);
+ complain(n, errors, false);
+ }
for(String s : errors.keySet()) {
ret.append(" while parsing " + yellow(s));
HashSet<String> hs = errors.get(s);
class Reset extends RuntimeException { }
public void invoke(State st, Forest result, Node n) {
- good |= next.newNode(n, result, st, false);
+ boolean ok = next.newNode(n, result, st, false);
+ if (ok && !good) {
+ good = !st.lame();
+ //if (good) System.out.println(st);
+ }
}
/** perform all shift operations, adding promoted nodes to <tt>next</tt> */
Forest res = null;
boolean ok = false;
for(Phase.Node n : hash.values()) {
- //if (n.holder().empty() && pos>0) continue;
if (token == null && n.state.isAccepting()) {
if (finalResult==null) finalResult = new Forest.Ref();
finalResult.merge(n.holder);
this.fe = fe;
this.state = state;
this.holder().merge(pending);
- //if (holder().empty()) throw new Error(holder()+"");
Phase start = parent==null ? null : parent.phase();
if (parent != null) parents().add(parent, true);
if (Phase.this.hash.get(code(state, start)) != null) throw new Error("severe problem!");