void readPattern(Scanner s) {
    List entry=null, level=entrytab[(int)s.pattern[Character.isDigit(s.pattern[0])?1:0]%256];
    int[] nodevalues=new int[s.patlen+1]; int ich=0, inv=0;
    java.util.Enumeration eentry=level.elements();
    PATTERN: for(;;) {
      if(Character.isDigit(s.pattern[ich])) {
	nodevalues[inv++]=((int)s.pattern[ich++]-(int)'0');
	if(ich==s.patlen) break;
      } else {
	nodevalues[inv++]=0;
      }
      for(;;) {
	if(!eentry.hasMoreElements()) {
	  int[] newnodevalues=new int[inv+1]; for(int jnv=0;jnv!=newnodevalues.length;++jnv) newnodevalues[jnv]=0;
	  entry=new List().snoc(new Character(s.pattern[ich])).snoc(newnodevalues);
	  level.snoc(entry); level=entry;
	  eentry=level.elements(); eentry.nextElement(); eentry.nextElement();
	  break;
	}
	entry=(List)eentry.nextElement();
	if(((Character)entry.car()).charValue()==s.pattern[ich]) {
	  level=entry;
	  eentry=level.elements(); eentry.nextElement(); eentry.nextElement();
	  break;
	}
      }
      if(++ich==s.patlen) {
	nodevalues[inv++]=0; break;
      }
    }
    System.arraycopy(nodevalues,0,((int[])entry.cdr().car()),0,inv);
  }