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(})之前有空格时,这似乎只会发生.
我做错了什么?如果我在结束符号之前避免使用空格,那么它可以完美地运行.
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
.
您有两种方法可以解决您的问题:
tok
应该只消耗char之后的空格,所以它的定义是tok c = char c *> ws
((*>)
from Control.Applicative
); 将相同的规则应用于所有其他解析器.因为在以这种方式输入"错误的解析器"之后你永远不会消耗空白,所以你最终不必回溯.try
在可能消耗多个字符的解析器前面添加在Parsec中使用反向跟踪,并且如果它们失败则应该回退它们的输入.编辑:更新的ASCII图形更有意义.