예제 #1
0
 /** Load frame for sibling arc(node) on fst */
 Frame loadNextFrame(Frame top, Frame frame) throws IOException {
   if (!canRewind(frame)) {
     return null;
   }
   while (!frame.fstArc.isLast()) {
     frame.fstArc = fst.readNextRealArc(frame.fstArc, fstReader);
     frame.fsaState = fsa.step(top.fsaState, frame.fstArc.label);
     if (frame.fsaState != -1) {
       break;
     }
   }
   // if (TEST) System.out.println(" loadNext frame="+frame);
   if (frame.fsaState == -1) {
     return null;
   }
   return frame;
 }
예제 #2
0
 static <T> void walk(FST<T> fst) throws IOException {
   final ArrayList<FST.Arc<T>> queue = new ArrayList<>();
   final BitSet seen = new BitSet();
   final FST.BytesReader reader = fst.getBytesReader();
   final FST.Arc<T> startArc = fst.getFirstArc(new FST.Arc<T>());
   queue.add(startArc);
   while (!queue.isEmpty()) {
     final FST.Arc<T> arc = queue.remove(0);
     final long node = arc.target;
     // System.out.println(arc);
     if (FST.targetHasArcs(arc) && !seen.get((int) node)) {
       seen.set((int) node);
       fst.readFirstRealTargetArc(node, arc, reader);
       while (true) {
         queue.add(new FST.Arc<T>().copyFrom(arc));
         if (arc.isLast()) {
           break;
         } else {
           fst.readNextRealArc(arc, reader);
         }
       }
     }
   }
 }