如何处理解析器错误

How to handle parser errors

我正在编写一个 JSON 解析器,但我很难想出好的错误处理设计。 假设在某个时刻,词法分析器发现了一个带有词法错误的记号。它应该如何反应?它应该立即停止还是继续到字符串的末尾?解析器通常如何处理词法错误?

如果出现词法错误,您应该继续评估整个字符串。当时显示多个错误可能会有所帮助。

如果出现语法错误,有两种方法:

  1. 出现第一个错误时停止一切。
  2. 继续寻找令牌的安全序列

安全序列是依赖于语言的句子,应该独立于上下文有效。这不会修复错误本身,但允许解析器显示其他最终错误(这是编译器的行为。如果有多个错误,他们可以检测并通知大多数错误)。

JSON 中的安全序列可以是例如正确的对象定义。像这样 (EBNF):

\{ <key>:<value>[, <key>:<value>] \}

希望对您有所帮助。

这取决于应用程序的目的,但在大多数情况下,JSON 解析器应该在出现第一个错误时停止。

JSON 是一种数据交换格式。在大多数应用程序中,输入最初是以编程方式创建的,语法错误表示通信损坏或错误生成器。如果编码数据已存储在数据库中,则可能表明存储已损坏。它甚至可能是攻击的迹象:试图修改途中的数据或手工制作有问题的数据。

在这种情况下,最好的策略通常是简单地删除数据而不是尝试 "fix"。不鼓励返回某种详细的错误消息,因为 (a) 原始应用程序不太可能能够处理这样的响应,并且 (b) 它可能会给攻击者额外的信息。通过尝试猜测正确的表示可能是什么来处理不正确的数据可能会默默地隐藏生成数据的应用程序中的错误。

当然,为了调试和记录目的,能够提供更多信息错误报告是很有用的。即便如此,在第一个错误之后继续进行下去也很少有用。

应用程序可能打算使用 JSON 作为人类可编辑的数据描述符,例如作为配置文件。在这种情况下,能够发现并报告多个错误可能很有用,就像在编程语言的解析器中一样。 (但即便如此,也没有必要。)