我正在为使用Java中StreamTokenizer类的类的解析器进行工作。在发生解析错误的情况下,我希望能够打印出发生错误的以令牌开头的字符的确切行和偏移量。但是,尽管StreamTokenizer具有lineno()方法来查找标记生成器所在的行,但没有方法可以找到该行内的字符偏移量。

我希望以某种方式可以使用StreamTokenizerBufferedReaderStreamTokenizer构造函数的输入)中的可用函数来获取此偏移量。

到目前为止,我已经尝试使用以下方法:

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是一个驱动程序类,其中包含调用上述代码(BufferedReaderStreamTokenizer)的主要功能。

但是,这样做的问题是它忽略了令牌定界符,因为它仅基于令牌的长度递增。

我怀疑可能有某种方法可以直接转到BufferedReader以获得有关此信息,但是我不确定。

有谁知道我如何获得StreamTokenizer函数的确切行偏移量?

最佳答案

简短的答案是,您不能使用StringTokenizer获得确切的行/字符偏移量。您需要使用其他机制进行标记。


我怀疑可能有某种方法可以直接转到BufferedReader以获得有关此的信息,但是我不确定。


那将无法可靠地工作。 StringTokenizer需要先阅读(尝试)以找到当前令牌或下一个令牌的结尾(如果您调用hasMoreTokens())。读取器中记录的位置是预读的“高水位标记”,而不是令牌的开头。

09-27 00:07