我正在为实验室开发自己的解析器,并且在使用 StreamTokenizer 时遇到了一些奇怪的行为。似乎任何用单引号括起来的东西都会被跳过。
代码
StreamTokenizer st = new StreamTokenizer(new FileReader("input.txt"));
boolean eof = false;
do{
int i = 0;
int token = st.nextToken();
switch (token){
case StreamTokenizer.TT_EOF:
System.out.println("EOF");
eof = true;
break;
case StreamTokenizer.TT_EOL:
System.out.println("EOL");
break;
case StreamTokenizer.TT_WORD:
System.out.println("Word: " + st.sval);
break;
case StreamTokenizer.TT_NUMBER:
System.out.println("Number: " + st.nval);
break;
default:
System.out.println((char) token + " encountered.");
break;
}
} while (!eof);
输入:
top 'AT THE TOP' {
l 2{ window{Open Up} }
}
输出:
Word: top
' encountered.
{ encountered.
Word: l
Number: 2.0
{ encountered.
Word: window
{ encountered.
Word: Open
Word: Up
} encountered.
} encountered.
} encountered.
EOF
我注意到我可以使用以下方法设置引号字符:
st.quoteChar('\'');
我认为这将允许我设置引号字符,如果遇到,下一个标记将是直到下一个引号字符为止的所有内容。
不幸的是,这并没有像我想象的那样起作用,现在我陷入了困境。
最佳答案
public int ttype
For a quoted string token, its value is the quote character.
和 sval
文档说
When the current token is a quoted string token, this field contains the body of the string.
所以你需要有一个
case '\'':
System.out.println("Quoted value is " + st.sval);
break;
或类似于处理单引号字符串或重置语法的东西,这样它就不会将 '
视为 quoteChar
。
关于java - StreamTokenizer 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23065434/