nl_tokens: 根据给定的字节数组，在环中作标记，以便 dump
pl_tokens: private MarkMode mark ( byte [ ] bs , int [ ] fails ) throws IOException { RingItem ri = item ; int re ; while ( ( re = ri . mark ( bs , fails ) ) >= 0 && ri . isDone4Mark ( ) ) { // 结尾匹配 bs 的开始，看不出这是否是一个结束，所以暂时当作
   // 结束标记，并看看下一个节点。如果不是结束，则需要将 r 置到 max
   if ( re > 0 ) { // 下一个节点没有加载，加载一下
   if ( ! ri . next . isLoaded ) { ri . next . load ( ins ) ; readed += ri . next . <mask> ; } // 如果当前的环节点的 next指向最初节点，说明整个当前的环已经被读满了，
   // 因此所以不能判断这个位置是不是边界
   // 因此做一下记录，下次加载时，本节点应该为头部
   else if ( ri . next == this . item ) { ri . nextmark = ri . r ; return MarkMode . NOT_FOUND ; } // 匹配头部
   if ( ri . next . matchHeadingWithRemain ( bs , re ) ) { return MarkMode . FOUND ; } // 没有匹配上，重置当前节点
   else { ri . r = ri . max ; ri . nextmark = ri . max ; } } if ( ri . isStreamEnd ) break ; // 指向下一个节点
   ri = ri . next ; // 保证该节点已经加载了
   if ( ! ri . isLoaded ) { ri . load ( ins ) ; readed += ri . max ; } // 如果已经循环了一圈，退出
   if ( ri == item ) break ; } if ( re == - 1 ) return MarkMode . FOUND ; return ri . isStreamEnd ? MarkMode . STREAM_END : MarkMode . NOT_FOUND ; }