通过延续传播(Mega)Parsec错误

时间:2018-04-16 15:28:03

标签: haskell parsec megaparsec

我对(Mega)Parsec的内部运作有一些技术性的问题,其非正式背景是:

  

通过Parsec中的延续来管理错误消息的累积/传播的想法是什么?

具体做法是: 考虑mplus操作使ParsecT成为MonadPlus的实例。 (sourcemplus m n作为输入,需要一个字符串s来解析和延续cokcerreokeerr,以便根据解析的结果。

首先使用s解析m

  • 如果解析成功并消耗(分别,不消耗)s的一部分,请按照cok(分别为eok)继续。
  • 如果s与[{1}}的解析失败,而m占用了s,请按照cerr继续进行。
  • 假设sm的解析失败而没有消耗任何东西;让err成为与此失败相关的解析错误。然后我们尝试使用s解析n,并相应地选择一个延续:
    • 如果sn的解析在消费输入时成功,请按照cok继续进行。
    • 如果sn的解析在消费输入时失败,请按照cerr继续进行。
    • 如果sn的解析成功而没有消费输入,请按照neok eok推导出的neok y s' err' = eok y s' (mergeError err err')继续:s
    • 如果nneerr的解析失败而没有消费输入,请按照eerr的{​​{1}}延续neerr y s' err' = eerr (mergeError err err')if request.method =='POST': form = FileForm(request.POST, request.FILES) if form.is_valid(): # file is saved form.save() csvfile = request.FILES['f'] try: csvfile.open() except: msg = "Cannot open file - is it CSV?" return render ... my_data = csv.reader(csvfile) for row in my_data: f = fourmisseur ( id_facture = row[0], numpiece = row[1]) f.save()

我的问题是:

  

为什么我们在遵循“空”延续时合并错误,而不是在跟随“消耗”延续时合并错误,从而忘记以前的所有错误?

这必须是一个设计决定,但我无法弄清楚其背后的原因。或许有一个简单的例子可以澄清这一点吗?

0 个答案:

没有答案