如何处理解析器错误

时间:2017-06-14 16:12:10

标签: json parsing lexical-analysis

我正在编写一个JSON解析器,但我在设置好错误处理方面遇到了麻烦。 让我们说,在某些时候,词法分析器会发现一个带有词汇错误的令牌。它应该如何反应?它应该立即停止还是继续到弦的末尾?解析器通常如何处理词汇错误?

2 个答案:

答案 0 :(得分:2)

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

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

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

当然,出于调试和日志记录的目的,能够提供更多信息性错误报告是很有用的。即使这样,超出第一个错误也很少有用。

应用程序可能会将JSON用作人工可编辑的数据描述符,例如作为配置文件。在这种情况下,能够查找和报告多个错误可能是有用的,因为它将在编程语言的解析器中。 (但即便如此,也没有必要。)

答案 1 :(得分:1)

在词汇错误的情况下,你应该继续评估整个字符串。当时显示的错误可能会有所帮助。

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

  1. 在第一次出错时停止一切。
  2. 继续寻找令牌的安全序列
  3. 安全序列是依赖于语言的句子,它应该独立于上下文而有效。这不会修复错误本身,但允许解析器显示其他最终错误(这是编译器的行为。如果有多个错误,他们可以检测并通知大多数错误。)

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

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

    我希望它有所帮助。