mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 08:14:09 -08:00
Add StreamTokenizer
This commit is contained in:
parent
7f152c0137
commit
82b96da215
|
@ -0,0 +1,482 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.teavm.classlib.java.io;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.Reader;
|
||||||
|
|
||||||
|
public class TStreamTokenizer {
|
||||||
|
public double nval;
|
||||||
|
public String sval;
|
||||||
|
public static final int TT_EOF = -1;
|
||||||
|
public static final int TT_EOL = '\n';
|
||||||
|
public static final int TT_NUMBER = -2;
|
||||||
|
public static final int TT_WORD = -3;
|
||||||
|
private static final int TT_UNKNOWN = -4;
|
||||||
|
public int ttype = TT_UNKNOWN;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal character meanings, 0 implies TOKEN_ORDINARY
|
||||||
|
*/
|
||||||
|
private byte[] tokenTypes = new byte[256];
|
||||||
|
|
||||||
|
private static final byte TOKEN_COMMENT = 1;
|
||||||
|
|
||||||
|
private static final byte TOKEN_QUOTE = 2;
|
||||||
|
|
||||||
|
private static final byte TOKEN_WHITE = 4;
|
||||||
|
|
||||||
|
private static final byte TOKEN_WORD = 8;
|
||||||
|
|
||||||
|
private static final byte TOKEN_DIGIT = 16;
|
||||||
|
|
||||||
|
private int lineNumber = 1;
|
||||||
|
|
||||||
|
private boolean forceLowercase;
|
||||||
|
|
||||||
|
private boolean isEOLSignificant;
|
||||||
|
|
||||||
|
private boolean slashStarComments;
|
||||||
|
|
||||||
|
private boolean slashSlashComments;
|
||||||
|
|
||||||
|
private boolean pushBackToken;
|
||||||
|
|
||||||
|
private boolean lastCr;
|
||||||
|
|
||||||
|
/* One of these will have the stream */
|
||||||
|
private InputStream inStream;
|
||||||
|
|
||||||
|
private Reader inReader;
|
||||||
|
|
||||||
|
private int peekChar = -2;
|
||||||
|
|
||||||
|
private TStreamTokenizer() {
|
||||||
|
/*
|
||||||
|
* Initialize the default state per specification. All byte values 'A'
|
||||||
|
* through 'Z', 'a' through 'z', and '\u00A0' through '\u00FF' are
|
||||||
|
* considered to be alphabetic.
|
||||||
|
*/
|
||||||
|
wordChars('A', 'Z');
|
||||||
|
wordChars('a', 'z');
|
||||||
|
wordChars(160, 255);
|
||||||
|
/*
|
||||||
|
* All byte values '\u0000' through '\u0020' are considered to be white
|
||||||
|
* space.
|
||||||
|
*/
|
||||||
|
whitespaceChars(0, 32);
|
||||||
|
/*
|
||||||
|
* '/' is a comment character. Single quote '\'' and double quote '"'
|
||||||
|
* are string quote characters.
|
||||||
|
*/
|
||||||
|
commentChar('/');
|
||||||
|
quoteChar('"');
|
||||||
|
quoteChar('\'');
|
||||||
|
/*
|
||||||
|
* Numbers are parsed.
|
||||||
|
*/
|
||||||
|
parseNumbers();
|
||||||
|
/*
|
||||||
|
* Ends of lines are treated as white space, not as separate tokens.
|
||||||
|
* C-style and C++-style comments are not recognized. These are the
|
||||||
|
* defaults and are not needed in constructor.
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
|
public TStreamTokenizer(InputStream is) {
|
||||||
|
this();
|
||||||
|
if (is == null) {
|
||||||
|
throw new NullPointerException();
|
||||||
|
}
|
||||||
|
inStream = is;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TStreamTokenizer(Reader r) {
|
||||||
|
this();
|
||||||
|
if (r == null) {
|
||||||
|
throw new NullPointerException();
|
||||||
|
}
|
||||||
|
inReader = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void commentChar(int ch) {
|
||||||
|
if (0 <= ch && ch < tokenTypes.length) {
|
||||||
|
tokenTypes[ch] = TOKEN_COMMENT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void eolIsSignificant(boolean flag) {
|
||||||
|
isEOLSignificant = flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int lineno() {
|
||||||
|
return lineNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void lowerCaseMode(boolean flag) {
|
||||||
|
forceLowercase = flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int nextToken() throws IOException {
|
||||||
|
if (pushBackToken) {
|
||||||
|
pushBackToken = false;
|
||||||
|
if (ttype != TT_UNKNOWN) {
|
||||||
|
return ttype;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sval = null; // Always reset sval to null
|
||||||
|
int currentChar = peekChar == -2 ? read() : peekChar;
|
||||||
|
|
||||||
|
if (lastCr && currentChar == '\n') {
|
||||||
|
lastCr = false;
|
||||||
|
currentChar = read();
|
||||||
|
}
|
||||||
|
if (currentChar == -1) {
|
||||||
|
ttype = TT_EOF;
|
||||||
|
return ttype;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte currentType = currentChar > 255 ? TOKEN_WORD : tokenTypes[currentChar];
|
||||||
|
while ((currentType & TOKEN_WHITE) != 0) {
|
||||||
|
/*
|
||||||
|
* Skip over white space until we hit a new line or a real token
|
||||||
|
*/
|
||||||
|
if (currentChar == '\r') {
|
||||||
|
lineNumber++;
|
||||||
|
if (isEOLSignificant) {
|
||||||
|
lastCr = true;
|
||||||
|
peekChar = -2;
|
||||||
|
ttype = TT_EOL;
|
||||||
|
return ttype;
|
||||||
|
}
|
||||||
|
currentChar = read();
|
||||||
|
if (currentChar == '\n') {
|
||||||
|
currentChar = read();
|
||||||
|
}
|
||||||
|
} else if (currentChar == '\n') {
|
||||||
|
lineNumber++;
|
||||||
|
if (isEOLSignificant) {
|
||||||
|
peekChar = -2;
|
||||||
|
ttype = TT_EOL;
|
||||||
|
return ttype;
|
||||||
|
}
|
||||||
|
currentChar = read();
|
||||||
|
} else {
|
||||||
|
// Advance over this white space character and try again.
|
||||||
|
currentChar = read();
|
||||||
|
}
|
||||||
|
if (currentChar == -1) {
|
||||||
|
ttype = TT_EOF;
|
||||||
|
return ttype;
|
||||||
|
}
|
||||||
|
currentType = currentChar > 255 ? TOKEN_WORD : tokenTypes[currentChar];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for digits before checking for words since digits can be
|
||||||
|
* contained within words.
|
||||||
|
*/
|
||||||
|
if ((currentType & TOKEN_DIGIT) != 0) {
|
||||||
|
StringBuilder digits = new StringBuilder(20);
|
||||||
|
boolean haveDecimal = false;
|
||||||
|
boolean checkJustNegative = currentChar == '-';
|
||||||
|
while (true) {
|
||||||
|
if (currentChar == '.') {
|
||||||
|
haveDecimal = true;
|
||||||
|
}
|
||||||
|
digits.append((char) currentChar);
|
||||||
|
currentChar = read();
|
||||||
|
if ((currentChar < '0' || currentChar > '9')
|
||||||
|
&& (haveDecimal || currentChar != '.')) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
peekChar = currentChar;
|
||||||
|
if (checkJustNegative && digits.length() == 1) {
|
||||||
|
// Didn't get any other digits other than '-'
|
||||||
|
ttype = '-';
|
||||||
|
return ttype;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
nval = Double.valueOf(digits.toString());
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
// Unsure what to do, will write test.
|
||||||
|
nval = 0;
|
||||||
|
}
|
||||||
|
ttype = TT_NUMBER;
|
||||||
|
return ttype;
|
||||||
|
}
|
||||||
|
// Check for words
|
||||||
|
if ((currentType & TOKEN_WORD) != 0) {
|
||||||
|
StringBuilder word = new StringBuilder(20);
|
||||||
|
while (true) {
|
||||||
|
word.append((char) currentChar);
|
||||||
|
currentChar = read();
|
||||||
|
if (currentChar == -1
|
||||||
|
|| (currentChar < 256 && (tokenTypes[currentChar] & (TOKEN_WORD | TOKEN_DIGIT)) == 0)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
peekChar = currentChar;
|
||||||
|
sval = forceLowercase ? word.toString().toLowerCase() : word
|
||||||
|
.toString();
|
||||||
|
ttype = TT_WORD;
|
||||||
|
return ttype;
|
||||||
|
}
|
||||||
|
// Check for quoted character
|
||||||
|
if (currentType == TOKEN_QUOTE) {
|
||||||
|
StringBuilder quoteString = new StringBuilder();
|
||||||
|
int peekOne = read();
|
||||||
|
while (peekOne >= 0 && peekOne != currentChar && peekOne != '\r' && peekOne != '\n') {
|
||||||
|
boolean readPeek = true;
|
||||||
|
if (peekOne == '\\') {
|
||||||
|
int c1 = read();
|
||||||
|
// Check for quoted octal IE: \377
|
||||||
|
if (c1 <= '7' && c1 >= '0') {
|
||||||
|
int digitValue = c1 - '0';
|
||||||
|
c1 = read();
|
||||||
|
if (c1 > '7' || c1 < '0') {
|
||||||
|
readPeek = false;
|
||||||
|
} else {
|
||||||
|
digitValue = digitValue * 8 + (c1 - '0');
|
||||||
|
c1 = read();
|
||||||
|
// limit the digit value to a byte
|
||||||
|
if (digitValue > 31 || c1 > '7' || c1 < '0') {
|
||||||
|
readPeek = false;
|
||||||
|
} else {
|
||||||
|
digitValue = digitValue * 8 + (c1 - '0');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!readPeek) {
|
||||||
|
// We've consumed one to many
|
||||||
|
quoteString.append((char) digitValue);
|
||||||
|
peekOne = c1;
|
||||||
|
} else {
|
||||||
|
peekOne = digitValue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (c1) {
|
||||||
|
case 'a':
|
||||||
|
peekOne = 0x7;
|
||||||
|
break;
|
||||||
|
case 'b':
|
||||||
|
peekOne = 0x8;
|
||||||
|
break;
|
||||||
|
case 'f':
|
||||||
|
peekOne = 0xc;
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
peekOne = 0xA;
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
peekOne = 0xD;
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
peekOne = 0x9;
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
peekOne = 0xB;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
peekOne = c1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (readPeek) {
|
||||||
|
quoteString.append((char) peekOne);
|
||||||
|
peekOne = read();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (peekOne == currentChar) {
|
||||||
|
peekOne = read();
|
||||||
|
}
|
||||||
|
peekChar = peekOne;
|
||||||
|
ttype = currentChar;
|
||||||
|
sval = quoteString.toString();
|
||||||
|
return ttype;
|
||||||
|
}
|
||||||
|
// Do comments, both "//" and "/*stuff*/"
|
||||||
|
if (currentChar == '/' && (slashSlashComments || slashStarComments)) {
|
||||||
|
currentChar = read();
|
||||||
|
if (currentChar == '*' && slashStarComments) {
|
||||||
|
int peekOne = read();
|
||||||
|
while (true) {
|
||||||
|
currentChar = peekOne;
|
||||||
|
peekOne = read();
|
||||||
|
if (currentChar == -1) {
|
||||||
|
peekChar = -1;
|
||||||
|
ttype = TT_EOF;
|
||||||
|
return ttype;
|
||||||
|
}
|
||||||
|
if (currentChar == '\r') {
|
||||||
|
if (peekOne == '\n') {
|
||||||
|
peekOne = read();
|
||||||
|
}
|
||||||
|
lineNumber++;
|
||||||
|
} else if (currentChar == '\n') {
|
||||||
|
lineNumber++;
|
||||||
|
} else if (currentChar == '*' && peekOne == '/') {
|
||||||
|
peekChar = read();
|
||||||
|
return nextToken();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (currentChar == '/' && slashSlashComments) {
|
||||||
|
// Skip to EOF or new line then return the next token
|
||||||
|
do {
|
||||||
|
currentChar = read();
|
||||||
|
} while (currentChar >= 0 && currentChar != '\r' && currentChar != '\n');
|
||||||
|
peekChar = currentChar;
|
||||||
|
return nextToken();
|
||||||
|
} else if (currentType != TOKEN_COMMENT) {
|
||||||
|
// Was just a slash by itself
|
||||||
|
peekChar = currentChar;
|
||||||
|
ttype = '/';
|
||||||
|
return ttype;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Check for comment character
|
||||||
|
if (currentType == TOKEN_COMMENT) {
|
||||||
|
// Skip to EOF or new line then return the next token
|
||||||
|
do {
|
||||||
|
currentChar = read();
|
||||||
|
} while (currentChar >= 0 && currentChar != '\r' && currentChar != '\n');
|
||||||
|
peekChar = currentChar;
|
||||||
|
return nextToken();
|
||||||
|
}
|
||||||
|
|
||||||
|
peekChar = read();
|
||||||
|
ttype = currentChar;
|
||||||
|
return ttype;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ordinaryChar(int ch) {
|
||||||
|
if (0 <= ch && ch < tokenTypes.length) {
|
||||||
|
tokenTypes[ch] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ordinaryChars(int low, int hi) {
|
||||||
|
if (low < 0) {
|
||||||
|
low = 0;
|
||||||
|
}
|
||||||
|
if (hi > tokenTypes.length) {
|
||||||
|
hi = tokenTypes.length - 1;
|
||||||
|
}
|
||||||
|
for (int i = low; i <= hi; i++) {
|
||||||
|
tokenTypes[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void parseNumbers() {
|
||||||
|
for (int i = '0'; i <= '9'; i++) {
|
||||||
|
tokenTypes[i] |= TOKEN_DIGIT;
|
||||||
|
}
|
||||||
|
tokenTypes['.'] |= TOKEN_DIGIT;
|
||||||
|
tokenTypes['-'] |= TOKEN_DIGIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void pushBack() {
|
||||||
|
pushBackToken = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void quoteChar(int ch) {
|
||||||
|
if (0 <= ch && ch < tokenTypes.length) {
|
||||||
|
tokenTypes[ch] = TOKEN_QUOTE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int read() throws IOException {
|
||||||
|
// Call the read for the appropriate stream
|
||||||
|
if (inStream == null) {
|
||||||
|
return inReader.read();
|
||||||
|
}
|
||||||
|
return inStream.read();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetSyntax() {
|
||||||
|
for (int i = 0; i < 256; i++) {
|
||||||
|
tokenTypes[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void slashSlashComments(boolean flag) {
|
||||||
|
slashSlashComments = flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void slashStarComments(boolean flag) {
|
||||||
|
slashStarComments = flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
// Values determined through experimentation
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
result.append("Token[");
|
||||||
|
switch (ttype) {
|
||||||
|
case TT_EOF:
|
||||||
|
result.append("EOF");
|
||||||
|
break;
|
||||||
|
case TT_EOL:
|
||||||
|
result.append("EOL");
|
||||||
|
break;
|
||||||
|
case TT_NUMBER:
|
||||||
|
result.append("n=");
|
||||||
|
result.append(nval);
|
||||||
|
break;
|
||||||
|
case TT_WORD:
|
||||||
|
result.append(sval);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (ttype == TT_UNKNOWN || tokenTypes[ttype] == TOKEN_QUOTE) {
|
||||||
|
result.append(sval);
|
||||||
|
} else {
|
||||||
|
result.append('\'');
|
||||||
|
result.append((char) ttype);
|
||||||
|
result.append('\'');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.append("], line ");
|
||||||
|
result.append(lineNumber);
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void whitespaceChars(int low, int hi) {
|
||||||
|
if (low < 0) {
|
||||||
|
low = 0;
|
||||||
|
}
|
||||||
|
if (hi > tokenTypes.length) {
|
||||||
|
hi = tokenTypes.length - 1;
|
||||||
|
}
|
||||||
|
for (int i = low; i <= hi; i++) {
|
||||||
|
tokenTypes[i] = TOKEN_WHITE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void wordChars(int low, int hi) {
|
||||||
|
if (low < 0) {
|
||||||
|
low = 0;
|
||||||
|
}
|
||||||
|
if (hi > tokenTypes.length) {
|
||||||
|
hi = tokenTypes.length - 1;
|
||||||
|
}
|
||||||
|
for (int i = low; i <= hi; i++) {
|
||||||
|
tokenTypes[i] |= TOKEN_WORD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,336 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.teavm.classlib.java.io;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.Reader;
|
||||||
|
import java.io.StreamTokenizer;
|
||||||
|
import java.io.StringReader;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.teavm.junit.TeaVMTestRunner;
|
||||||
|
|
||||||
|
@RunWith(TeaVMTestRunner.class)
|
||||||
|
public class StreamTokenizerTest {
|
||||||
|
private StreamTokenizer st;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public void constructorLjava_io_InputStream() throws IOException {
|
||||||
|
st = new StreamTokenizer(new StringReader("/comments\n d 8 'h'"));
|
||||||
|
|
||||||
|
assertEquals("the next token returned should be the letter d", StreamTokenizer.TT_WORD, st.nextToken());
|
||||||
|
assertEquals("the next token returned should be the letter d", "d", st.sval);
|
||||||
|
|
||||||
|
assertEquals("the next token returned should be the digit 8", StreamTokenizer.TT_NUMBER, st.nextToken());
|
||||||
|
assertEquals("the next token returned should be the digit 8", 8.0, st.nval, 0.0001);
|
||||||
|
|
||||||
|
assertEquals("the next token returned should be the quote character", 39, st.nextToken());
|
||||||
|
assertEquals("the next token returned should be the quote character", "h", st.sval);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void constructorLjava_io_Reader() throws IOException {
|
||||||
|
setTest("/testing\n d 8 'h' ");
|
||||||
|
assertEquals("the next token returned should be the letter d skipping the comments",
|
||||||
|
StreamTokenizer.TT_WORD, st.nextToken());
|
||||||
|
assertEquals("the next token returned should be the letter d", "d", st.sval);
|
||||||
|
|
||||||
|
assertEquals("the next token returned should be the digit 8", StreamTokenizer.TT_NUMBER, st.nextToken());
|
||||||
|
assertEquals("the next token returned should be the digit 8", 8.0, st.nval, 0.001);
|
||||||
|
|
||||||
|
assertEquals("the next token returned should be the quote character", 39, st.nextToken());
|
||||||
|
assertEquals("the next token returned should be the quote character", "h", st.sval);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void commentCharI() throws IOException {
|
||||||
|
setTest("*comment \n / 8 'h' ");
|
||||||
|
st.ordinaryChar('/');
|
||||||
|
st.commentChar('*');
|
||||||
|
assertEquals("nextToken() did not return the character / skiping the comments starting with *",
|
||||||
|
47, st.nextToken());
|
||||||
|
assertTrue("the next token returned should be the digit 8",
|
||||||
|
st.nextToken() == StreamTokenizer.TT_NUMBER && st.nval == 8.0);
|
||||||
|
assertTrue("the next token returned should be the quote character",
|
||||||
|
st.nextToken() == 39 && st.sval.equals("h"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void eolIsSignificantZ() throws IOException {
|
||||||
|
setTest("d 8\n");
|
||||||
|
// by default end of line characters are not significant
|
||||||
|
assertTrue("nextToken did not return d", st.nextToken() == StreamTokenizer.TT_WORD && st.sval.equals("d"));
|
||||||
|
assertTrue("nextToken did not return 8", st.nextToken() == StreamTokenizer.TT_NUMBER && st.nval == 8.0);
|
||||||
|
assertTrue("nextToken should be the end of file", st.nextToken() == StreamTokenizer.TT_EOF);
|
||||||
|
setTest("d\n");
|
||||||
|
st.eolIsSignificant(true);
|
||||||
|
// end of line characters are significant
|
||||||
|
assertTrue("nextToken did not return d", st.nextToken() == StreamTokenizer.TT_WORD && st.sval.equals("d"));
|
||||||
|
assertTrue("nextToken is the end of line", st.nextToken() == StreamTokenizer.TT_EOL);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void lineno() throws IOException {
|
||||||
|
setTest("d\n 8\n");
|
||||||
|
assertEquals("the lineno should be 1", 1, st.lineno());
|
||||||
|
st.nextToken();
|
||||||
|
st.nextToken();
|
||||||
|
assertEquals("the lineno should be 2", 2, st.lineno());
|
||||||
|
st.nextToken();
|
||||||
|
assertEquals("the next line no should be 3", 3, st.lineno());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void lowerCaseModeZ() throws Exception {
|
||||||
|
// SM.
|
||||||
|
setTest("HELLOWORLD");
|
||||||
|
st.lowerCaseMode(true);
|
||||||
|
|
||||||
|
st.nextToken();
|
||||||
|
assertEquals("sval not converted to lowercase.", "helloworld", st.sval);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public void nextToken() throws IOException {
|
||||||
|
// SM.
|
||||||
|
setTest("\r\n/* fje fje 43.4 f \r\n f g */ 456.459 \r\nHello / \t\r\n \r\n \n \r \257 Hi \'Hello World\'");
|
||||||
|
st.ordinaryChar('/');
|
||||||
|
st.slashStarComments(true);
|
||||||
|
st.nextToken();
|
||||||
|
assertTrue("Wrong Token type1: " + (char) st.ttype, st.ttype == StreamTokenizer.TT_NUMBER);
|
||||||
|
st.nextToken();
|
||||||
|
assertTrue("Wrong Token type2: " + st.ttype, st.ttype == StreamTokenizer.TT_WORD);
|
||||||
|
st.nextToken();
|
||||||
|
assertTrue("Wrong Token type3: " + st.ttype, st.ttype == '/');
|
||||||
|
st.nextToken();
|
||||||
|
assertTrue("Wrong Token type4: " + st.ttype, st.ttype == StreamTokenizer.TT_WORD);
|
||||||
|
st.nextToken();
|
||||||
|
assertTrue("Wrong Token type5: " + st.ttype, st.ttype == StreamTokenizer.TT_WORD);
|
||||||
|
st.nextToken();
|
||||||
|
assertTrue("Wrong Token type6: " + st.ttype, st.ttype == '\'');
|
||||||
|
assertTrue("Wrong Token type7: " + st.ttype, st.sval.equals("Hello World"));
|
||||||
|
st.nextToken();
|
||||||
|
assertTrue("Wrong Token type8: " + st.ttype, st.ttype == -1);
|
||||||
|
|
||||||
|
StreamTokenizer s = new StreamTokenizer(new StringReader("hello\n\n\n"));
|
||||||
|
s.eolIsSignificant(true);
|
||||||
|
assertTrue("Wrong token 1,1", s.nextToken() == StreamTokenizer.TT_WORD && s.sval.equals("hello"));
|
||||||
|
assertTrue("Wrong token 1,2", s.nextToken() == '\n');
|
||||||
|
assertTrue("Wrong token 1,3", s.nextToken() == '\n');
|
||||||
|
assertTrue("Wrong token 1,4", s.nextToken() == '\n');
|
||||||
|
assertTrue("Wrong token 1,5", s.nextToken() == StreamTokenizer.TT_EOF);
|
||||||
|
StreamTokenizer tokenizer = new StreamTokenizer(new StringReader("\n \r\n#"));
|
||||||
|
tokenizer.ordinaryChar('\n'); // make \n ordinary
|
||||||
|
tokenizer.eolIsSignificant(true);
|
||||||
|
assertTrue("Wrong token 2,1", tokenizer.nextToken() == '\n');
|
||||||
|
assertTrue("Wrong token 2,2", tokenizer.nextToken() == '\n');
|
||||||
|
assertEquals("Wrong token 2,3", '#', tokenizer.nextToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void ordinaryCharI() throws IOException {
|
||||||
|
// SM.
|
||||||
|
setTest("Ffjein 893");
|
||||||
|
st.ordinaryChar('F');
|
||||||
|
st.nextToken();
|
||||||
|
assertTrue("OrdinaryChar failed." + (char) st.ttype, st.ttype == 'F');
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void ordinaryCharsII() throws IOException {
|
||||||
|
setTest("azbc iof z 893");
|
||||||
|
st.ordinaryChars('a', 'z');
|
||||||
|
assertEquals("OrdinaryChars failed.", 'a', st.nextToken());
|
||||||
|
assertEquals("OrdinaryChars failed.", 'z', st.nextToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void parseNumbers() throws IOException {
|
||||||
|
// SM
|
||||||
|
setTest("9.9 678");
|
||||||
|
assertTrue("Base behavior failed.", st.nextToken() == StreamTokenizer.TT_NUMBER);
|
||||||
|
st.ordinaryChars('0', '9');
|
||||||
|
assertEquals("setOrdinary failed.", '6', st.nextToken());
|
||||||
|
st.parseNumbers();
|
||||||
|
assertTrue("parseNumbers failed.", st.nextToken() == StreamTokenizer.TT_NUMBER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void pushBack() throws IOException {
|
||||||
|
// SM.
|
||||||
|
setTest("Hello 897");
|
||||||
|
st.nextToken();
|
||||||
|
st.pushBack();
|
||||||
|
assertTrue("PushBack failed.", st.nextToken() == StreamTokenizer.TT_WORD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void quoteCharI() throws IOException {
|
||||||
|
// SM
|
||||||
|
setTest("<Hello World< HelloWorldH");
|
||||||
|
st.quoteChar('<');
|
||||||
|
assertEquals("QuoteChar failed.", '<', st.nextToken());
|
||||||
|
assertEquals("QuoteChar failed.", "Hello World", st.sval);
|
||||||
|
st.quoteChar('H');
|
||||||
|
st.nextToken();
|
||||||
|
assertEquals("QuoteChar failed for word.", "elloWorld", st.sval);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void resetSyntax() throws IOException {
|
||||||
|
// SM
|
||||||
|
setTest("H 9\' ello World");
|
||||||
|
st.resetSyntax();
|
||||||
|
assertTrue("resetSyntax failed1." + (char) st.ttype, st.nextToken() == 'H');
|
||||||
|
assertTrue("resetSyntax failed1." + (char) st.ttype, st.nextToken() == ' ');
|
||||||
|
assertTrue("resetSyntax failed2." + (char) st.ttype, st.nextToken() == '9');
|
||||||
|
assertTrue("resetSyntax failed3." + (char) st.ttype, st.nextToken() == '\'');
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void slashSlashCommentsZ() throws IOException {
|
||||||
|
// SM.
|
||||||
|
setTest("// foo \r\n /fiji \r\n -456");
|
||||||
|
st.ordinaryChar('/');
|
||||||
|
st.slashSlashComments(true);
|
||||||
|
assertEquals("Test failed.", '/', st.nextToken());
|
||||||
|
assertTrue("Test failed.", st.nextToken() == StreamTokenizer.TT_WORD);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void slashSlashComments_withSSOpen() throws IOException {
|
||||||
|
Reader reader = new StringReader("t // t t t");
|
||||||
|
|
||||||
|
StreamTokenizer st = new StreamTokenizer(reader);
|
||||||
|
st.slashSlashComments(true);
|
||||||
|
|
||||||
|
assertEquals(StreamTokenizer.TT_WORD, st.nextToken());
|
||||||
|
assertEquals(StreamTokenizer.TT_EOF, st.nextToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void slashSlashComments_withSSOpen_NoComment() throws IOException {
|
||||||
|
Reader reader = new StringReader("// t");
|
||||||
|
|
||||||
|
StreamTokenizer st = new StreamTokenizer(reader);
|
||||||
|
st.slashSlashComments(true);
|
||||||
|
st.ordinaryChar('/');
|
||||||
|
|
||||||
|
assertEquals(StreamTokenizer.TT_EOF, st.nextToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void slashSlashComments_withSSClosed() throws IOException {
|
||||||
|
Reader reader = new StringReader("// t");
|
||||||
|
|
||||||
|
StreamTokenizer st = new StreamTokenizer(reader);
|
||||||
|
st.slashSlashComments(false);
|
||||||
|
st.ordinaryChar('/');
|
||||||
|
|
||||||
|
assertEquals('/', st.nextToken());
|
||||||
|
assertEquals('/', st.nextToken());
|
||||||
|
assertEquals(StreamTokenizer.TT_WORD, st.nextToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void slashStarCommentsZ() throws IOException {
|
||||||
|
setTest("/* foo \r\n /fiji \r\n*/ -456");
|
||||||
|
st.ordinaryChar('/');
|
||||||
|
st.slashStarComments(true);
|
||||||
|
assertTrue("Test failed.", st.nextToken() == StreamTokenizer.TT_NUMBER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void slashStarComments_withSTOpen() throws IOException {
|
||||||
|
Reader reader = new StringReader("t /* t */ t");
|
||||||
|
|
||||||
|
StreamTokenizer st = new StreamTokenizer(reader);
|
||||||
|
st.slashStarComments(true);
|
||||||
|
|
||||||
|
assertEquals(StreamTokenizer.TT_WORD, st.nextToken());
|
||||||
|
assertEquals(StreamTokenizer.TT_WORD, st.nextToken());
|
||||||
|
assertEquals(StreamTokenizer.TT_EOF, st.nextToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void slashStarComments_withSTClosed() throws IOException {
|
||||||
|
Reader reader = new StringReader("t /* t */ t");
|
||||||
|
|
||||||
|
StreamTokenizer st = new StreamTokenizer(reader);
|
||||||
|
st.slashStarComments(false);
|
||||||
|
|
||||||
|
assertEquals(StreamTokenizer.TT_WORD, st.nextToken());
|
||||||
|
assertEquals(StreamTokenizer.TT_EOF, st.nextToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Test
|
||||||
|
public void test_toString() throws IOException {
|
||||||
|
setTest("ABC Hello World");
|
||||||
|
st.nextToken();
|
||||||
|
assertTrue("toString failed." + st.toString(), st.toString().equals("Token[ABC], line 1"));
|
||||||
|
|
||||||
|
// Regression test for HARMONY-4070
|
||||||
|
byte[] data = new byte[] { (byte) '-' };
|
||||||
|
StreamTokenizer tokenizer = new StreamTokenizer(new ByteArrayInputStream(data));
|
||||||
|
tokenizer.nextToken();
|
||||||
|
String result = tokenizer.toString();
|
||||||
|
assertEquals("Token['-'], line 1", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whitespaceCharsII() throws IOException {
|
||||||
|
setTest("azbc iof z 893");
|
||||||
|
st.whitespaceChars('a', 'z');
|
||||||
|
assertTrue("OrdinaryChar failed.", st.nextToken() == StreamTokenizer.TT_NUMBER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void wordCharsII() throws IOException {
|
||||||
|
setTest("A893 -9B87");
|
||||||
|
st.wordChars('0', '9');
|
||||||
|
assertTrue("WordChar failed1.",
|
||||||
|
st.nextToken() == StreamTokenizer.TT_WORD);
|
||||||
|
assertEquals("WordChar failed2.", "A893", st.sval);
|
||||||
|
assertTrue("WordChar failed3.",
|
||||||
|
st.nextToken() == StreamTokenizer.TT_NUMBER);
|
||||||
|
st.nextToken();
|
||||||
|
assertEquals("WordChar failed4.", "B87", st.sval);
|
||||||
|
|
||||||
|
setTest(" Hello World");
|
||||||
|
st.wordChars(' ', ' ');
|
||||||
|
st.nextToken();
|
||||||
|
assertEquals("WordChars failed for whitespace.", "Hello World", st.sval);
|
||||||
|
|
||||||
|
setTest(" Hello World\r\n \'Hello World\' Hello\' World");
|
||||||
|
st.wordChars(' ', ' ');
|
||||||
|
st.wordChars('\'', '\'');
|
||||||
|
st.nextToken();
|
||||||
|
assertTrue("WordChars failed for whitespace: " + st.sval, st.sval.equals("Hello World"));
|
||||||
|
st.nextToken();
|
||||||
|
assertTrue("WordChars failed for quote1: " + st.sval, st.sval.equals("\'Hello World\' Hello\' World"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setTest(String s) {
|
||||||
|
st = new StreamTokenizer(new StringReader(s));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user