【问题标题】:Java's PushbackReader and EOFJava 的 PushbackReader 和 EOF
【发布时间】:2011-02-11 22:37:07
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 似乎不太可能。您的代码可能有问题。

标签: java parsing eof


【解决方案1】:

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

【讨论】:

  • 这很好。谢谢。我猜 PushbackReader 只是不适合这个解析任务。
  • @Luther Baker,我以前使用 PushbackReader 进行解析,但仅在我只需要最多 3 个字符的前瞻的情况下,它工作得很好。您能否包含更多有关您正在解析的语法的信息?如果您需要回溯到字符串的开头,您还可以查看 BufferedReader 的 mark 和 reset 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 2020-08-22
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多