gpt4 book ai didi

haskell - 使用 Parsec 将文本删除到一个特殊字符

转载 作者:行者123 更新时间:2023-12-02 05:28:31 24 4
gpt4 key购买 nike

我是 Haskell 和 Parsec 的新手——如果这个问题很微不足道,我深表歉意。

我想解析结构如下的文本行:

<Text to be dropped> <special character (say "#")> <field 1> <comma> <field 2>
<comma> <field 3> <special character 2 (say "%")> <Text to be dropped>

我希望我的解析器丢弃开头和结尾的“要删除的文本”,并保留字段的内容。我的主要问题是理解如何编写一个解析器,将所有内容都丢弃到某个特殊字符。

库中似乎有用的解析器是 anyChar、manyTill 和 oneOf,但我不明白如何组合它们。我将不胜感激任何简单的例子。

最佳答案

编写 Parsec 代码时,先在 BNF 中写出要解析的语法很有用首先是形式,因为用 Parsec 编写的解析器最终看起来非常像语法。

让我们试试看:

line ::= garbage '#' field ',' field ',' field '%' garbage

在上面的产生式中,我们假设一个名为garbage 的产生式,其实际定义将取决于您实际想要删除的文本。同样,我们假设一个名为 field 的产生式。现在让我们将这个产生式写成秒差距代码:

line = do
garbage
char '#'
field1 <- field
char ','
field2 <- field
char ','
field3 <- field
char '%'
garbage
return (field1, field2, field3)

此代码读起来与 BNF 完全一样。本质区别在于一些子产品的结果被命名,因此我们可以返回从这些结果构建的值(在本例中为元组)。

现在我不知道您对垃圾的概念是什么,但是为了举例起见,我们假设您指的是任何空白。然后你可以定义 garbage 如下:

garbage = many space

(或者,碰巧 parsec 已经有一个组合子来解析零个或多个称为 spaces 的空格)。如果垃圾可以是除 # 分隔符之外的任何内容,那么您可以说

garbage = many (noneOf "#")

此行将处理所有输入,不包括第一个“#”。无论哪种方式,无论 garbage 结果产生什么值,因为您没有将名称绑定(bind)到值,它将被丢弃。

关于haskell - 使用 Parsec 将文本删除到一个特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12731168/

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