【发布时间】:2015-10-19 12:16:07
【问题描述】:
Parsec.Expr.buildExpressionParser 的文档说:
具有相同优先级的前缀和后缀运算符只能出现一次(即,如果 - 是前缀否定,则不允许出现 --2)。
但是,我想解析这样的字符串。
具体来说,考虑以下语法:
sentence:
| identifier
| "~" sentence
| sentence & sentence
| "!" sentence
其中运算符优先级为:"~" 绑定强于 "&" 绑定强于 "!"
例如,我想要句子
! ~a & b
被解析为
! ( (~a) & b )
还有句子
~ ! a & b
作为
~( ! ( a & b) )
Parsec 允许我这样做(并指定运算符优先级),但是,我希望能够链接前缀,例如~ ~ ! ~ a。
Parsec 不允许这样做。
我找到了解决方案for chaining prefixes,但是这个解决方案不允许我为不同的前缀运算符指定不同的运算符优先级(“~”和“!”绑定比“&”强,或者它们都没有)
有人对此有解决方案吗?
编辑:
使操作符绑定正确但不允许链接的部分解决方案: http://lpaste.net/143362
使用链接但对“~”运算符有错误绑定的部分解决方案: http://lpaste.net/143364
编辑:与latest answer 相关的更多说明。
我实际上希望& 具有关联性。左或右无所谓。左与右关联仅在具有相同优先级的运算符之间起作用。
对于您的示例,通过注意 & 绑定比 ! 更强(& 具有更高的运算符优先级)来解决所有问题
因此,你担心的表情:
a & ! b & c 应该变成:
(尽可能先绑定&)
a & ! (b & c)
同样,! a & ! b & c 应该被解析
(先绑定&)
! a & ! (b & c),因此! a & (! (b & c)),因此! (a & (! (b & c)))
【问题讨论】:
-
你能展示你的部分解决方案吗?我在lpaste.net/143362 编码了一些东西,它不做链接或重复前缀 - 它只是试图让优先级正确。
-
我有两个部分解决方案。其中一个看起来很像您的编码,并忽略了重复的前缀。另一个进行链接,但优先级错误。 (他们正在路上)
-
我添加了部分解决方案。准确地说,我养了你的一个,然后从那个开始,得到另一个……