我正在为我的课程使用java中的StreamTokenizer
类解析器。在解析错误的情况下,我希望能够打印出现错误的令牌开始的字符的确切行和偏移量。但是,尽管StreamTokenizer
有一个lineno()
方法来查找分词器所在的行,但没有找到该行内字符偏移的方法。如何获取StreamTokenizer中的行偏移量?
我希望能有办法使用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
是一个驱动程序类,它包含主函数,其中上述c ode(BufferedReader
和StreamTokenizer
)被调用。
但是,问题在于它忽略了令牌分隔符,因为它仅基于令牌的长度而递增。
我怀疑可能有一些方法可以直接去BufferedReader
来获取这方面的信息,但我不确定。
有谁知道我怎么能得到StreamTokenizer
函数的确切线偏移?
谢谢你的信息,斯蒂芬。你有什么建议,让我标记输入文件,并如实记录分析错误的偏移?我想读取文件中的行由行,但问题是该行的结尾没有特殊的意义,而且由于我使用的是自上而下的“预测”的解析器,我需要能够读取特定标记/套在块令牌,这似乎像它会做处理行尾有点乱。 – Paul