XML — Architecture, Tools, Techniques - Department of Computer ...
XML — Architecture, Tools, Techniques - Department of Computer ...
XML — Architecture, Tools, Techniques - Department of Computer ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
** lexical analyzer for arithmetic expressions.<br />
*/<br />
public class Scanner implements oops.parser.Scanner {<br />
protected StreamTokenizer st; // to read input<br />
protected Parser parser; // to get Lit/Token tokenSet values<br />
protected Set NUMBER; // tokenSet for Number<br />
protected Set tokenSet; // null or lookahead identifying token<br />
protected Object node; // Double/Long value for Number<br />
public Set tokenSet () { return tokenSet; }<br />
public Object node () { return node; }<br />
public String toString () { return st.toString(); }<br />
}<br />
public void scan (Reader r, Parser parser) throws IOException {<br />
st = new StreamTokenizer(new FilterReader(new BufferedReader(r)) {<br />
boolean addSpace; // kludge to duplicate \n<br />
public int read () throws IOException {<br />
int ch = '\n';<br />
addSpace = addSpace ? false : (ch = in.read()) == '\n';<br />
return ch;<br />
}<br />
});<br />
st.resetSyntax();<br />
st.commentChar('#'); // comments from # to end-<strong>of</strong>-line<br />
st.wordChars('0', '9'); // parse decimal numbers as words<br />
st.wordChars('.', '.');<br />
st.whitespaceChars(0, ' '); // ignore control-* and space<br />
st.eolIsSignificant(true); // need '\n'<br />
this.parser = parser;<br />
NUMBER = ((Token)parser.getPeer("Number")).getLookahead();<br />
advance(); // one token lookahead<br />
}<br />
public boolean atEnd () { return st.ttype == st.TT_EOF; }<br />
40<br />
oops/Scanner.java<br />
public boolean advance () throws IOException {<br />
if (atEnd()) return false;<br />
switch (st.nextToken()) {<br />
case StreamTokenizer.TT_EOF: node = null; tokenSet = null; return false;<br />
case StreamTokenizer.TT_EOL: node = null; tokenSet = parser.getLitSet("\n");<br />
break;<br />
case StreamTokenizer.TT_WORD: node = st.sval.indexOf(".") < 0<br />
? (Number)new Long(st.sval)<br />
: (Number)new Double(st.sval);<br />
tokenSet = NUMBER;<br />
break;<br />
default: node = ""+(char)st.ttype;<br />
tokenSet = parser.getLitSet((String)node);<br />
break;<br />
}<br />
return true;<br />
}