gpt4 book ai didi

parsing - 使用 Parsec 搜索模式

转载 作者:行者123 更新时间:2023-12-04 15:44:58 25 4
gpt4 key购买 nike

不确定这是否可能(或推荐),但我实际上是在尝试使用 Parsec 在文件中搜索一系列字符。示例文件:

START (name)

junk
morejunk=junk;
dontcare
foo ()
bar

care_about this (stuff in here i dont care about);

don't care about this
or this
foo = bar;

also_care
about_this
(dont care whats in here);
and_this too(only the names
at the front
do i care about
);

foobar
may hit something = perhaps maybe (like this);
foobar

END

这是我让它工作的尝试:
careAbout :: Parser (String, String)
careAbout = do
name1 <- many1 (noneOf " \n\r")
skipMany space
name2 <- many1 (noneOf " (\r\n")
skipMany space
skipMany1 parens
skipMany space
char ';'
return (name1, name2)

parens :: Parser ()
parens = do
char '('
many (parens <|> skipMany1 (noneOf "()"))
char ')'
return ()

parseFile = do
manyTill (do
try careAbout <|>
anyChar >> return ("", "")) (try $ string "END")

我试图通过寻找 careAbout 来强制搜索。 ,如果这不起作用,请吃掉一个字符,然后再试一次。我可以解析中间的所有垃圾(我知道它可能是什么),但我不在乎它是什么(所以为什么要解析它),而且它可能很复杂。

问题是,我的解决方案不太奏效。 anyChar最终消耗一切,搜索 END永远没有机会。此外,在 careAbout 的某处我们点击 eof还有一些 Exception因为它而被抛出。

这可能是完全错误的方法,我想知道一种方法,甚至更好,正确的方法™,这样做。

最佳答案

如果不是 parens解析器,这将非常适合常规语言解析器,例如 regex-applicative .这是因为常规语言解析器在“回溯”方面更加“聪明”(实际上根本没有回溯,但是每个可能的分支都被探索了)。

但是,您可能知道,匹配括号不是常规语言。如果您可以放松您的语法以变得有规律,请尝试使用 regex-applicative。

关于parsing - 使用 Parsec 搜索模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18951235/

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