X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParser.java;h=422bdc163ce29d810d888a4ceac2b3572022e0f2;hb=6e0ac72335464f3151c0621cc02433800d13c18a;hp=8af800585900246ae930d78bcf1f63dc73f18737;hpb=eeb3a8b49bdbf753b5a70734fbae7f2c1ac06702;p=sbp.git diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index 8af8005..422bdc1 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -1,8 +1,9 @@ -// Copyright 2006 all rights reserved; see LICENSE file for BSD-style license +// Copyright 2006-2007 all rights reserved; see LICENSE file for BSD-style license package edu.berkeley.sbp; import edu.berkeley.sbp.util.*; import edu.berkeley.sbp.Sequence.Position; +import edu.berkeley.sbp.Sequence.Pos; import java.io.*; import java.util.*; @@ -192,7 +193,7 @@ public abstract class Parser { // al will be sorted in DECREASING order (al[0] >= al[1]) ArrayList al = new ArrayList(); for(State s : all_states) { - for(Object po : s) { + for(Object po : s.positions()) { Sequence.Position p = (Sequence.Position)po; if (al.contains(p)) continue; int i=0; @@ -269,33 +270,35 @@ public abstract class Parser { private final transient HashSet hs; public HashSet> conjunctStates = new HashSet>(); - HashMap> gotoSetNonTerminals = new HashMap>(); + HashMap> gotoSetNonTerminals = new HashMap>(); private transient TopologicalBag> gotoSetTerminals = new TopologicalBag>(); - private TopologicalBag reductions = new TopologicalBag(); - private HashSet eofReductions = new HashSet(); + private TopologicalBag reductions = new TopologicalBag(); + private HashSet eofReductions = new HashSet(); private TopologicalBag> shifts = new TopologicalBag>(); private boolean accept = false; private VisitableMap> oshifts = null; - private VisitableMap oreductions = null; + private VisitableMap oreductions = null; public final boolean doomed; // Interface Methods ////////////////////////////////////////////////////////////////////////////// public boolean doomed() { return doomed; } boolean isAccepting() { return accept; } - public Iterator iterator() { return hs.iterator(); } + + Iterable positions() { return hs; } + boolean canShift(Token t) { return oshifts!=null && oshifts.contains(t); } void invokeShifts(Token t, GSS.Phase phase, Result r) { oshifts.invoke(t, phase, r); } boolean canReduce(Token t) { return oreductions != null && (t==null ? eofReductions.size()>0 : oreductions.contains(t)); } void invokeEpsilonReductions(Token t, Node node) { - if (t==null) for(Position r : eofReductions) node.invoke(r, null); + if (t==null) for(Pos r : eofReductions) node.invoke(r, null); else oreductions.invoke(t, node, null); } void invokeReductions(Token t, Node node, Result b) { - if (t==null) for(Position r : eofReductions) node.invoke(r, b); + if (t==null) for(Pos r : eofReductions) node.invoke(r, b); else oreductions.invoke(t, node, b); } @@ -399,10 +402,12 @@ public abstract class Parser { if (seq.needs.contains(y) || seq.hates.contains(y)) { // FIXME: assumption that no sequence is ever both usefully (non-lamely) matched // and also directly lamely matched - ((HashMap)gotoSetNonTerminals).put(y, dead_state); + for(Position pp = y.firstp(); pp != null; pp = pp.next()) + ((HashMap)gotoSetNonTerminals).put(pp, dead_state); continue OUTER; } - gotoSetNonTerminals.put(y, s); + for(Position pp = y.firstp(); pp != null; pp = pp.next()) + gotoSetNonTerminals.put(pp, s); } }