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> */
}