gpt4 book ai didi

parsing - Haskell Parsec Parser for Encountering [...]

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

我正在尝试使用 Parsec 在 Haskell 中编写解析器。目前我有一个可以解析的程序

test x [1,2,3] end

执行此操作的代码如下
testParser = do { 
reserved "test";
v <- identifier;
symbol "[";
l <- sepBy natural commaSep;
symbol "]";
p <- pParser;
return $ Test v (List l) p
} <?> "end"

其中 commaSep 定义为
commaSep        = skipMany1 (space <|> char ',')

现在有什么方法可以让我解析类似的语句,特别是:
test x [1...3] end

作为 Haskell 和 Parsec 的新手,我确信有一些我不知道的简洁的好方法。任何帮助,将不胜感激。

再次感谢。

最佳答案

我将使用 Control.Applicative 中的一些函数喜欢 (*>) .如果您想避免 Parsec 的单子(monad)接口(interface)并更喜欢应用接口(interface),这些函数很有用,因为在我看来,解析器变得更容易阅读。

如果您不熟悉基本的应用程序功能,请发表评论,我会解释它们。您可以在 Hoogle 上查找它们如果你不确定。

正如我理解您的问题一样,您需要一个解析器来处理这样的一些数据结构:

data Test = Test String Numbers
data Numbers = List [Int] | Range Int Int

可以解析这种数据结构的解析器看起来像这样(我没有编译代码,但它应该可以工作):
-- parses "test <identifier> [<numbers>] end"
testParser :: Parser Test
testParser =
Test <$> reserved "test" *> identifier
<*> symbol "[" *> numbersParser <* symbol "]"
<* reserved "end"
<?> "test"

numbersParser :: Parser Numbers
numbersParser = try listParser <|> rangeParser

-- parses "<natural>, <natural>, <natural>" etc
listParser :: Parser Numbers
listParser =
List <$> sepBy natural (symbol ",")
<?> "list"

-- parses "<natural> ... <natural>"
rangeParser :: Parser Numbers
rangeParser =
Range <$> natural <* symbol "..."
<*> natural
<?> "range"

关于parsing - Haskell Parsec Parser for Encountering [...],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11525788/

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