我正在为使用Java中StreamTokenizer
类的类的解析器进行工作。在发生解析错误的情况下,我希望能够打印出发生错误的以令牌开头的字符的确切行和偏移量。但是,尽管StreamTokenizer
具有lineno()
方法来查找标记生成器所在的行,但没有方法可以找到该行内的字符偏移量。
我希望以某种方式可以使用StreamTokenizer
或BufferedReader
(StreamTokenizer
构造函数的输入)中的可用函数来获取此偏移量。
到目前为止,我已经尝试使用以下方法:
BufferedReader dataReader = new BufferedReader(new FileReader(filename));
StreamTokenizer st = new StreamTokenizer(dataReader);
st.eolIsSignificant(true);
然后,我在
StreamTokenizer.nextToken()
函数,使其看起来像这样:
public int nextTokenSpec(StreamTokenizer st) throws IOException{
int token = st.nextToken();
if (token == StreamTokenizer.TT_EOL){
Linker2.offsetCounter = 0;
token = st.nextToken();
} else{
Linker2.offsetCounter += st.sval.length();
}
return token;
}
请注意,
Linker2
是一个驱动程序类,其中包含调用上述代码(BufferedReader
和StreamTokenizer
)的主要功能。但是,这样做的问题是它忽略了令牌定界符,因为它仅基于令牌的长度递增。
我怀疑可能有某种方法可以直接转到
BufferedReader
以获得有关此信息,但是我不确定。有谁知道我如何获得
StreamTokenizer
函数的确切行偏移量? 最佳答案
简短的答案是,您不能使用StringTokenizer
获得确切的行/字符偏移量。您需要使用其他机制进行标记。
我怀疑可能有某种方法可以直接转到BufferedReader以获得有关此的信息,但是我不确定。
那将无法可靠地工作。 StringTokenizer
需要先阅读(尝试)以找到当前令牌或下一个令牌的结尾(如果您调用hasMoreTokens()
)。读取器中记录的位置是预读的“高水位标记”,而不是令牌的开头。