gpt4 book ai didi

使用 Parsec 解析函数式应用程序

转载 作者:行者123 更新时间:2023-12-03 23:25:30 25 4
gpt4 key购买 nike

我正在尝试使用 parsec 解析如下表达式:

f a b c
=> (Appl (Appl (Appl f a) b) c)

我尝试使用以下内容:
appl :: Parser Expr
appl = do
f <- expr
gs <- many expr
return $ foldr (\x y -> Appl x y) f gs

但我陷入了无限循环。 expr 是一个解析所有可能的函数
包含通过创建词法分析器获得的空格的表达式(特别是使用 Parsec.Token.makeTokenParser)。

我想知道是否有一些简单的方法可以做到这一点,或者其他关于如何解决这个问题的建议是什么。我曾考虑尝试使用 Parsec.Expr,但我不确定如何将空格用作运算符。

谢谢你的帮助!

最佳答案

正如您所建议的,一种解决方案是将空格视为二元运算符。首先,为函数应用定义一个解析器。

spacef :: Parser ()
spacef = whiteSpace
*> notFollowedBy (choice . map reservedOp $ opNames)
>> return Appl

这里 reservedOp 是保留运算符的解析器, opNames 是这些名称的列表。现在将其作为语法中的运算符
functionOp :: Operator String () Identity Expr
functionOp = Infix spacef AssocLeft

并将 functionOp 添加到您与 buildExpressionParser 一起使用的运算符表中,给予它高优先级。

关于使用 Parsec 解析函数式应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22904287/

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