我正在编写一个StreamTokenizer
的解析器。我需要像"8a"
这样的输入来回显一个数字包含char的错误。相反,它打印:
NUM: 8 ID: a
似乎将char标识为单独的标记,即使没有空格将它们分开。
有解决方法吗?
答案 0 :(得分:0)
您可以识别当前令牌是否为StreamTokenizer.TT_WORD
并输出错误。检查下面的代码片段,它会使用带有数字和字符的文本,不带空格,并在到达字符时输出错误。
import java.io.*;
public class StreamCharacterChecker{
public static void main(String []args) throws IOException{
String text = "123458a787";
Reader r = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(text.getBytes())));
StreamTokenizer st = new StreamTokenizer(r);
int token;
while ((token = st.nextToken()) != StreamTokenizer.TT_EOF){
if (token == StreamTokenizer.TT_WORD){
System.out.println("Error characters detected!");
break;
}
}
}
}
答案 1 :(得分:0)
您可以覆盖StringTokenizer
的{{1}}方法来禁用对数字字符的特殊处理。
请注意,这可能非常危险,否则不合适。
根据javadoc https://docs.oracle.com/javase/7/docs/api/java/io/StreamTokenizer.html#parseNumbers():
parseNumbers
以下是示例 - 我没有为数字中使用的典型字符添加“数字”属性:
* When the parser encounters a word token that has the format of a
* double precision floating-point number, it treats the token as a
* number rather than a word, by setting the {@code ttype}
* field to the value {@code TT_NUMBER} and putting the numeric
* value of the token into the {@code nval} field.
输出:
TT_WORD 8a
使用上述配置,您可以获得 final Reader rd = new StringReader("8a");
final StreamTokenizer tk = new StreamTokenizer(rd) {
@Override
public void parseNumbers() {
// super.parseNumbers(); - by not calling super. I disable special handling of numeric characters
}
};
tk.wordChars('a', 'z');
tk.wordChars('0', '9');
while ((tk.nextToken()) != StreamTokenizer.TT_EOF) {
if (tk.ttype == StreamTokenizer.TT_WORD) {
System.out.println("TT_WORD " + tk.sval);
}
if (tk.ttype == StreamTokenizer.TT_NUMBER) {
System.out.println("TT_NUMBER " + tk.nval);
}
}
String
,然后执行8a
以检查内部是否存在数字。