import mit16_410_13.*; import java.util.LinkedList; import java.io.*; class PS9base { public PS9base () { ; } // reads the HMM description as XML invoking addTransition as necessary. public void readHMM (String pathname) throws java.io.FileNotFoundException { XMLStream strm; FileInputStream istrm=null; boolean inhmm=false, instate=false, intransition=false; String state=null; try { istrm=new FileInputStream(pathname); strm=new XMLStream(istrm, System.out); System.out.println("Reading from "+pathname); String txt=strm.readText(); // Read any preceding text for (XMLTag atag=strm.readNextTag(); atag!=null; atag=strm.readNextTag()) { String tagid=atag.getTagID(); if (tagid.equals("HMM")) { if (inhmm) System.out.println("Nested HMM not allowed\n"); inhmm=true; } else if (tagid.equals("/HMM")) { if (instate||intransition||(!inhmm)) System.out.println("/HMM nesting error"); inhmm=false; } else if (tagid.equals("STATE")) { if (instate) System.out.println("Nested states not allowed\n"); else if (intransition||(!inhmm)) System.out.println("STATE nesting error"); else state=atag.getAttribute("name"); instate=true; } else if (tagid.equals("/STATE")) { if ((!instate)||intransition||(!inhmm)) System.out.println("/STATE nesting error"); instate=false; } else if (tagid.equals("TRANSITION")) { if (intransition) System.out.println("Nested transitions not allowed\n"); else if ((!instate)||(!inhmm)) System.out.println("TRANSITION nesting error"); else { addTransition(state, atag.getAttribute("to"), atag.getAttribute("symbol"), (new Double(atag.getAttribute("probability"))).doubleValue()); } intransition=true; } else if (tagid.equals("/TRANSITION")) { if ((!instate)||(!intransition)||(!inhmm)) System.out.println("/TRANSITION nesting error"); intransition=false; } else { System.out.println("Unknown Tag: "); atag.writeTag(strm); } txt=strm.readText(); } } catch (Exception e) { System.out.println("Exception: "+e.toString()); } finally { try { if (istrm!=null) istrm.close(); } catch (Exception e) {} } } // You are expected to implement this in your subclass. The default // implementation simply prints out the void addTransition (String from, // originating state String to, // state transitioned to String symbol, // transition action symbol double probability) // transition probability { System.out.println("Transition from state "+from+" to state "+to+" with action="+symbol+" and probability="+probability); } }