gpt4 book ai didi

json - 修复错误的 JSON 语法

转载 作者:行者123 更新时间:2023-12-04 20:00:19 42 4
gpt4 key购买 nike

我刚开始学习解析,我写了this simple parser在 Haskell 中(使用 parsec)读取 JSON 并为它构建一个简单的树。我正在使用 RFC 4627 中的语法.

但是,当我尝试解析字符串 {"x":1 } 时,我得到了输出:

parse error at (line 1, column 8):unexpected "}"expecting whitespace character or ","

这似乎只发生在我在右大括号 (]) 或 mustache (}) 之前有空格时。

我做错了什么?如果我在结束符号前避免使用空格,它就可以完美运行。

最佳答案

Parsec 不会自动倒带和回溯。当您编写 sepBy 成员 valueSeparator 时,valueSeparator 会占用空白,因此解析器将像这样解析您的值:

{"x":1 }
[------- object
% beginObject
[-] name
% nameSeparator
% jvalue
[- valueSeparator
X In valueSeparator: unexpected "}"

Legend:
[--] full match
% full char match
[-- incomplete match
X incomplete char match

valueSeparator 失败时,Parsec 不会返回并尝试不同的解析组合,因为一个字符已经在 valueSeparator 中匹配。

您有两种选择来解决您的问题:

  1. 由于空格在 JSON 中无关紧要,因此始终在 一个重要标记之后消耗空格,以前从未如此。所以,tok 应该只消耗 char 之后的空白,所以它的定义是 tok c = char c *> ws ((*>) 来自 Control.Applicative);将相同的规则应用于所有其他解析器。由于您在以这种方式输入“错误的解析器”后永远不会消耗空白,因此您最终不必回溯。
  2. 通过在可能使用多个字符的解析器前添加 try 来在 Parsec 中使用回溯,如果失败则应该倒回输入。

编辑:更新了 ASCII 图形以使其更有意义。

关于json - 修复错误的 JSON 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8698064/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com