gpt4 book ai didi

haskell - 如果取消缩进与任何外部缩进级别不匹配,则使 Text.Parsec.Indent 解析失败

转载 作者:行者123 更新时间:2023-12-02 13:48:26 26 4
gpt4 key购买 nike

我正在尝试解析 Haskell 中代表一棵树的字符串。每个节点都在一行上,其中的缩进决定了嵌套(例如,像 Python 或 Haskell 的语法)。

成功的解析结果应该是[Tree]类型(一片玫瑰树林),其中

data Tree = Tree String [Tree]
deriving Show

例如字符串

A
B
C
D
E
F

应该导致

[Tree "A" [Tree "B" [], Tree "C" []], Tree "D" [Tree "E" [Tree "F" []]]]

Haskell indents package以及 article about how to parse indented trees 的帮助,我可以解析这样的例子。

问题是我当前的实现成功解析了字符串

A
B
C
D

作为

[Tree "A" [Tree "B" [Tree "C" []]], Tree "D" []]

节点D被解析为另一个根。但是,我想让解析失败,因为 D 相对于 C 是无缩进的,但它与 A 的缩进级别不匹配或B

我的实现如下(简化:树标签非空且仅包含字母数字字符;并非支持每种 Unicode 换行符)。

import qualified Control.Applicative as A
import qualified Control.Monad as M
import qualified Text.Parsec as P
import qualified Text.Parsec.Indent as I

parse :: String -> Either P.ParseError [Tree]
parse = I.runIndent "" . P.runParserT forest () ""

forest = P.many tree A.<* P.eof

tree = spacing A.*> I.withBlock Tree node tree

spacing = P.many P.newline A.*> indentation

indentation = P.many $ P.char ' '

node = label A.<* spacing

label = P.many1 P.alphaNum A.<* lineEnd

lineEnd = M.void P.newline P.<|> P.eof

如何更改此解析器以仅接受与某些外部缩进级别匹配的取消缩进?提前致谢。

最佳答案

简单地替换 forest 的定义通过

forest = I.block tree A.<* P.eof

似乎可以解决问题。 I.block这里确保源字符串的根部缩进到同一级别。

示例

A
B
C
D

现在失败了

(line 4, column 7):
unexpected 'D'
expecting " " or end of input
not indented or indentation doesn't match

P.many tree 的问题那是tree可以任意缩进。一旦取消缩进 tree不匹配任何外部缩进级别(示例中的 D ),解析器会愉快地生成另一个顶级 treeforest 的(根)而不是失败。

关于haskell - 如果取消缩进与任何外部缩进级别不匹配,则使 Text.Parsec.Indent 解析失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24983203/

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