Использование StreamTokenizer
Я пишу лексер, который будет токенизировать математическое выражение.
В качестве ввода я даю выражение (1+π)²(1−π)²+(5.3−-2)/6
.
Я ожидаю, что он будет помечен как
( 1 + π ) ² ( 1 - π ) ² + ( 5.3 − - 2 ) / 6
но я получаю ( 1 +π ) ² ( 1 -π ) ² + ( 5.3 −-2 ) / 6
.
Я знаю, что мне нужно вставить операторы умножения в определенные места вывода, сделаю это позже.
/* s: The inputted expression */
public static String tokenize(String s)[] throws IOException
{
StreamTokenizer tokenizer = new StreamTokenizer(new StringReader(s));
tokenizer.parseNumbers();
tokenizer.wordChars('a', 'z');
tokenizer.wordChars('A', 'Z');
tokenizer.wordChars('A', 'Z');
tokenizer.wordChars(SQUARED, SQUARED); // the superscript 2
tokenizer.wordChars(PI, PI);
tokenizer.wordChars(SUB.charAt(0), SUB.charAt(0)); // subtract (takeaway)
tokenizer.wordChars(NEG.charAt(0), NEG.charAt(0)); // negate
tokenizer.wordChars('/', '/');
tokenizer.wordChars('*', '*');
tokenizer.wordChars('+', '+');
tokenizer.ordinaryChar(',');
tokenizer.ordinaryChar('/'); // do not consider / as comment start
ArrayList<String> tokBuf = new ArrayList<>();
while (tokenizer.nextToken() != StreamTokenizer.TT_EOF) {
switch (tokenizer.ttype) {
case StreamTokenizer.TT_NUMBER:
tokBuf.add(String.valueOf(tokenizer.nval));
break;
case StreamTokenizer.TT_WORD:
tokBuf.add(tokenizer.sval);
break;
default:
tokBuf.add(String.valueOf((char) tokenizer.ttype));
}
}
String ret[] = new String[tokBuf.size()];
ret = tokBuf.toArray(ret);
return ret;
}