package rationals.converters.analyzers;
import java.io.IOException;
import java.io.Reader;
import java.io.StreamTokenizer;
import java.io.StringReader;
import rationals.converters.ConverterException;
/**
* Default lexical analyser for regular expressions.
* This lexer parse a regular expression and treats each letter
* as a label.
*
* @author yroos
* @version $Id: DefaultLexer.java 2 2006-08-24 14:41:48Z oqube $
*/
public class DefaultLexer implements Lexer {
private StreamTokenizer tokenizer;
private boolean end;
private String image;
private int value;
private int current;
/**
* Construct a lexical analyzer to parse given string.
*
* @param in the String to parse.
*/
public DefaultLexer(String in) {
this(new StreamTokenizer(new StringReader(in)));
}
/**
* construct a lexical analyzer to parse the characters from given
* Reader object.
*
* @param rd the character stream to parse.
*/
public DefaultLexer(Reader rd) {
this(new StreamTokenizer(rd));
}
/**
* Construct a lexical analyzer that uses given StreamTokenizer object
* to get data from.
* Note that the tokenizer is reset and given new attributes.
*
* @param st
*/
public DefaultLexer(StreamTokenizer st) {
tokenizer = st;
tokenizer.resetSyntax();
tokenizer.eolIsSignificant(false);
tokenizer.lowerCaseMode(false);
tokenizer.slashSlashComments(true);
tokenizer.quoteChar('\"');
tokenizer.wordChars('0', '9');
tokenizer.whitespaceChars(0, 32);
end = false;
}
public void read() throws ConverterException {
if (end) {
current = END;
return;
}
;
int tk;
try {
tk = tokenizer.nextToken();
} catch (IOException e) {
throw new ConverterException("Unexpected character");
}
if (tk == StreamTokenizer.TT_EOF) {
end = true;
value = 0;
image = "";
current = END;
return;
}
if (tk == StreamTokenizer.TT_WORD) {
image = tokenizer.sval;
if (image.charAt(0) >= '0' && image.charAt(0) <= '9') {
try {
value = Integer.parseInt(tokenizer.sval);
image = "";
if (value == 0)
current = EMPTY;
else {
if (value == 1)
current = EPSILON;
else
current = INT;
}
return;
} catch (Exception e) {
current = UNKNOWN;
return;
}
}
value = 0;
current = LABEL;
return;
}
image = "";
value = 0;
switch (tk) {
case '+':
current = UNION;
return;
case '*':
current = STAR;
return;
case '^':
current = ITERATION;
return;
case '|':
current = SHUFFLE;
return;
case '#':
current = MIX;
return;
case '(':
current = OPEN;
return;
case ')':
current = CLOSE;
return;
case '{':
current = OBRACE;
return;
case '}':
current = CBRACE;
return;
default:
current = LABEL;
image = "" + new Character((char) tk);
}
}
public int lineNumber() {
return tokenizer.lineno();
}
public Object label() {
return image;
}
public int value() {
return value;
}
public int current() {
return current;
}
}