10.10.2013 Views

XML — Architecture, Tools, Techniques - Department of Computer ...

XML — Architecture, Tools, Techniques - Department of Computer ...

XML — Architecture, Tools, Techniques - Department of Computer ...

SHOW MORE
SHOW LESS

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

}

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!