2

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

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

不幸的是,如果我一直“阅读”到最后一个字符……然后阅读 EOF,PushbackReader 将不允许我将任何内容推回它上面。因此,由于这些字符丢失,我的解析无法完成!

我需要为这种类型的字符串处理编写自己的阅读器吗?

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

4

1 回答 1

5

注意永远不要未读取 EOF 标记,PushbackReader 中的缓冲区是 char[] 类型,因此整数 -1 将被转换为 char 0xFFFF,然后它将是从 read 方法返回的下一个字符。例如,在解析带引号的字符串时,除了结束引号字符外,始终包括对 -1 的检查,并将其作为失败情况处理,例如通过抛出 IOException。

于 2011-02-11T22:41:38.390 回答