修复错误的JSON语法

Cla*_*bel 3 parsing json haskell parsec

我刚开始学习解析,我在Haskell中编写了这个简单的解析器(使用parsec)来读取JSON并为它构造一个简单的树.我在RFC 4627中使用语法.

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

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

当我在结束括号(])或mustachio(})之前有空格时,这似乎只会发生.

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

dfl*_*str 6

Parsec不会自动进行倒带和回溯.当你写sepBy member 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
Run Code Online (Sandbox Code Playgroud)

valueSeparator失败时,Parsec将不会返回并尝试不同的解析组合,因为一个角色已经匹配valueSeparator.

您有两种方法可以解决您的问题:

  1. 由于JSON中的空白空间无关紧要,因此在重要令牌之后始终消耗空白空间.所以,a tok应该只消耗char之后的空格,所以它的定义是tok c = char c *> ws((*>)from Control.Applicative); 将相同的规则应用于所有其他解析器.因为在以这种方式输入"错误的解析器"之后你永远不会消耗空白,所以你最终不必回溯.
  2. 通过try在可能消耗多个字符的解析器前面添加在Parsec中使用反向跟踪,并且如果它们失败则应该回退它们的输入.

编辑:更新的ASCII图形更有意义.