gpt4 book ai didi

haskell - 不支持 Parsec.Expr 重复前缀/后缀运算符

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

Parsec.Expr.buildExpressionParser 的文档说:

Prefix and postfix operators of the same precedence can only occur once (i.e. --2 is not allowed if - is prefix negate).



事实上,这让我很痛苦,因为我试图解析的语言允许任意重复其前缀和后缀运算符(想想像 **a[1][2] 这样的 C 表达式)。

那么,为什么 Parsec做出这个限制,我该如何解决它?

我想我可以将我的前缀/后缀解析器移到 term解析器,因为它们具有最高优先级。

IE。
**a + 1

被解析为
(*(*(a)))+(1)

但是如果我想让它解析为
*(*((a)+(1)))

如果 buildExpressionParser做了我想要的,我可以简单地重新排列表中运算符的顺序。

备注 here为了更好的解决方案

最佳答案

我自己使用 chainl1 解决了这个问题:

prefix  p = Prefix  . chainl1 p $ return       (.)
postfix p = Postfix . chainl1 p $ return (flip (.))

这些组合器使用 chainl1op总是成功的解析器,并简单地组合 term 返回的函数解析器按从左到右或从右到左的顺序排列。这些可用于 buildExprParser table ;你会在哪里这样做:
exprTable = [ [ Postfix subscr
, Postfix dot
]
, [ Prefix pos
, Prefix neg
]
]

你现在这样做:
exprTable = [ [ postfix $ choice [ subscr
, dot
]
]
, [ prefix $ choice [ pos
, neg
]
]
]

这样, buildExprParser仍可用于设置运算符优先级,但现在只能看到一个 PrefixPostfix每个优先级的运算符。但是,该运算符有能力尽可能多地复制自身,并返回一个函数,使其看起来好像只有一个运算符。

关于haskell - 不支持 Parsec.Expr 重复前缀/后缀运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10475337/

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