X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParser.java;h=5ec5b0771cc2442b3f203c672a607adf907a7e14;hb=1a0f984a6f85c7d67778c2e5f835812968c94c03;hp=18bec5a0aebfa2c5179116f1c92617f1162dd04b;hpb=21da21b94e794fa4d7c7207327764895d92ea528;p=sbp.git diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index 18bec5a..5ec5b07 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -96,16 +96,8 @@ public abstract class Parser { Reduction red = new Reduction(p); Topology follow = wf.walk(p.owner()); - if (p.owner() instanceof Sequence.RewritingSequence && - (((Sequence.RewritingSequence)p.owner()).tag+"").equals("emailaddr")) { - System.out.println("follow before: " + new edu.berkeley.sbp.misc.CharToken.CharRange(follow)); - } for(Position p2 = p; p2 != null && p2.element() != null; p2 = p2.next()) follow = follow.intersect(new Walk.Follow(top.empty(), p2.element(), all_elements, cache).walk(p2.element())); - if (p.owner() instanceof Sequence.RewritingSequence && - (((Sequence.RewritingSequence)p.owner()).tag+"").equals("emailaddr")) { - System.out.println("follow after: " + new edu.berkeley.sbp.misc.CharToken.CharRange(follow)); - } state.reductions.put(follow, red); if (wf.includesEof()) state.eofReductions.add(red); } @@ -131,36 +123,6 @@ public abstract class Parser { public class State implements Comparable, IntegerMappable, Iterable { - public int toInt() { return idx; } - - public boolean lame() { - for(Position p : this) - for(Position p2 = p; p2!=null; p2=p2.next()) - if (p2.isLast() && !p2.owner().lame) - return false; - return true; - } - /* - public boolean isResolvable(Token t) { - boolean found = false; - for(Reduction r : getReductions(t)) { - Position p = r.position; - if (!p.isRightNullable(cache)) continue; - if (p.owner().firstp()==p) continue; - if (found) { - // found two items meeting criteria #1 - return false; - } else { - found = true; - continue; - } - if (p.element()==null) continue; - Topology first = new Walk.First(top(), cache).walk(p.element()); - if (first.contains(t)) - } - } - */ - public final int idx = master_state_idx++; private final HashSet hs; @@ -177,17 +139,16 @@ public abstract class Parser { // Interface Methods ////////////////////////////////////////////////////////////////////////////// - public boolean isAccepting() { return accept; } - - public boolean canShift(Token t) { return oshifts.contains(t); } - public boolean canReduce(Token t) { return t==null ? eofReductions.size()>0 : oreductions.contains(t); } - + boolean isAccepting() { return accept; } public Iterator iterator() { return hs.iterator(); } - public void invokeShifts(Token t, Invokable irbc, B b, C c) { + boolean canShift(Token t) { return oshifts.contains(t); } + void invokeShifts(Token t, Invokable irbc, B b, C c) { oshifts.invoke(t, irbc, b, c); } - public void invokeReductions(Token t, Invokable irbc, B b, C c) { + + boolean canReduce(Token t) { return t==null ? eofReductions.size()>0 : oreductions.contains(t); } + void invokeReductions(Token t, Invokable irbc, B b, C c) { if (t==null) for(Reduction r : eofReductions) irbc.invoke(r, b, c); else oreductions.invoke(t, irbc, b, c); } @@ -274,7 +235,6 @@ public abstract class Parser { } public String toString() { - //return "state["+idx+"]"; StringBuffer ret = new StringBuffer(); ret.append("state["+idx+"]: "); for(Position p : this) ret.append("{"+p+"} "); @@ -282,6 +242,7 @@ public abstract class Parser { } public int compareTo(Table.State s) { return idx==s.idx ? 0 : idx < s.idx ? -1 : 1; } + public int toInt() { return idx; } } /** @@ -290,7 +251,6 @@ public abstract class Parser { */ public class Reduction { // FIXME: cleanup; almost everything in here could go in either Sequence.Position.getRewrite() or else in GSS.Reduct - public final int numPop; /*private*/ final Position position; private final Forest[] holder; // to avoid constant reallocation public int hashCode() { return position.hashCode(); } @@ -303,26 +263,25 @@ public abstract class Parser { } public Reduction(Position p) { this.position = p; - this.numPop = p.pos; - this.holder = new Forest[numPop]; + this.holder = new Forest[position.pos]; } public String toString() { return "[reduce " + position + "]"; } private Forest zero = null; public Forest zero() { if (zero != null) return zero; - if (numPop > 0) throw new Error(); + if (position.pos > 0) throw new Error(); return zero = position.rewrite(null); } public void reduce(GSS.Phase.Node parent) { - if (numPop==0) finish(parent, zero(), parent.phase()); - else reduce(parent, numPop-1, parent.phase()); + if (position.pos==0) finish(parent, zero(), parent.phase()); + else reduce(parent, position.pos-1, parent.phase()); } public void reduce(GSS.Phase.Node parent, GSS.Phase.Node onlychild) { - if (numPop<=0) throw new Error("called wrong form of reduce()"); - int pos = numPop-1; + if (position.pos<=0) throw new Error("called wrong form of reduce()"); + int pos = position.pos-1; Forest old = holder[pos]; holder[pos] = parent.pending(); if (pos==0) { @@ -352,7 +311,7 @@ public abstract class Parser { State state = parent.state.gotoSetNonTerminals.get(position.owner()); if (result==null) throw new Error(); if (state!=null) - target.newNode(parent, result, state, numPop<=0, this); + target.newNode(parent, result, state, position.pos<=0, this); } } }