Java';s推回读取器和EOF

Java';s推回读取器和EOF,java,parsing,eof,Java,Parsing,Eof,我正在用Java编写一个解析器,并试图利用Java的PushbackReader。如果猜错了,我的解析器可能需要回溯——但一旦读取器达到EOF,就失败了 假设我正在分析一个带引号的字符串,并且我正在寻找结束引号。如果我的任何解析器插件不能完全完成,它们会尝试将阅读器保持在原始状态,并将其传递给下一个插件。IE:我通常将字符推回缓冲区,让下一个元素尝试解析缓冲区 不幸的是,如果我一直读到最后一个字符。。。然后读EOF,PushbackReader不允许我把任何东西推回去。因此,我的解析无法完成,因

我正在用Java编写一个解析器,并试图利用Java的PushbackReader。如果猜错了,我的解析器可能需要回溯——但一旦读取器达到EOF,就失败了

假设我正在分析一个带引号的字符串,并且我正在寻找结束引号。如果我的任何解析器插件不能完全完成,它们会尝试将阅读器保持在原始状态,并将其传递给下一个插件。IE:我通常将字符推回缓冲区,让下一个元素尝试解析缓冲区

不幸的是,如果我一直读到最后一个字符。。。然后读EOF,PushbackReader不允许我把任何东西推回去。因此,我的解析无法完成,因为这些字符丢失了

我是否需要为这种类型的字符串处理编写自己的读取器


编辑:此外,当我读最后一个字符(EOF之前的那个字符)时,我也不能“未读”那个字符。除了创建自己的堆栈或缓冲区实现之外,是否有一个标准的解决方法?

注意不要未读EOF标记,PushbackReader中的缓冲区类型为char[],因此整数-1将转换为char 0xFFFF,这将是read方法返回的下一个字符。例如,在解析带引号的字符串时,除了结尾的引号字符外,还要检查-1,并将其作为失败案例处理,例如抛出IOException。

这是一个很好的观点。谢谢我猜PushbackReader不适合这个解析任务。@Luther Baker,我以前用过PushbackReader进行解析,但只在我最多只需要3个字符的lookahead的情况下,它工作得很好。你能提供更多关于你正在分析的语法的信息吗?如果需要回溯到字符串的开头,还可以查看BufferedReader.com的
标记
重置
方法。您的代码可能有问题。