/media/sda-magnetic/david/Dokumente-15/fernuni-hagen/cs-i-ii/old-cs-2-03/java-new/2020-11-27/MyParser.java


class MyParser {
    static final int greater = -2;
    static final int smaller = -3;
    static final int ulstarts = -4;
    static final int ulstops = -5;
    static final int listarts = -6;
    static final int listops = -7;
    static final int undefined = -8;

    public static void main (String [] args) {
        String str = args [0];
        
        CharInputStream cs;
        cs = new StringRdr (str);
        cs = new TagFilter (cs);
        
        int ch;
        
        while ((ch = cs.read()) != -1)
            System.out.println (ch + "  " + (char) (ch));
    }
    
    interface CharInputStream {
        int read ();
    }
    static public class StringRdr implements CharInputStream {
        private String src;
        private int index;
        
        public StringRdr (String src) {
            this.src = src;
        }
        
        @Override
        public int read () {
            if (index == src.length()) return -1;
            return src.charAt (index++);
        }
    }
    static public class TagFilter implements CharInputStream {
        private CharInputStream src;
        
        public TagFilter (CharInputStream src) {
            this.src = src;
        }
        
        @Override
        public int read () {
            int ch = src.read();
            int retval;
            if (ch == -1) 
                return -1;
            if (ch == '<') {
                    int ch2 = src.read();
                    if (ch2 == -1)
                        return -1;
                    if (ch2 == 'g') 
                        retval = greater;
                    else if (ch2 == 'l') 
                        retval = listarts;
                    else if (ch2 == 'u') 
                        retval = ulstarts;
                    else if (ch2 == '/') {
                        int ch3;
                        ch3 = src.read ();
                        if (ch3 == 'g')
                            retval = smaller;
                        else if (ch3 == 'l') 
                            retval = listops;
                        else if (ch3 == 'u') 
                            retval = ulstops;
                        else 
                            return undefined;
                    }
                    else   
                        return undefined;
                    int ch4 = src.read();
                    if (ch4 == -1)
                        return -1;
                    else if (ch4 != '>')
                        return undefined;
            }
            else 
                retval = ch;
        return retval;
        }
    }
    
    /* Gramatik */
    
    /*  text := list | format 
        list := <ul> listelement </ul> 
        listelement := <li> text </li> | <li> text </li> listelement
        format := character | character text | <g> text </g> */
        
    
}