问题描述
我正在关注 Megaparsec documentation 来解析多维数组。
opSubscript = Postfix $ foldr1 (.) <$> some singleIndex
singleIndex = do
index < brackets expr
return $ \l -> ArrayIndex l index
array[1][2]
预计将被解析为
ArrayIndex (ArrayIndex (Var "array") 1)) 2
然而,它是
ArrayIndex (ArrayIndex (Var "array") 2)) 1
这里出了什么问题?
解决方法
some singleIndex
解析了一个包含两个函数的列表,[f,g]
,其中
f = \l -> ArrayIndex l 1
g = \l -> ArrayIndex l 2
然后用 foldr1
组合它们。并且因为
foldr1 f [x,y] = x `f` y
您的结果函数是 f . g
。当然,这首先应用 g
,产生 ArrayIndex (Var "array") 2
,然后应用 f
,产生 ArrayIndex (ArrayIndex (Var "array") 2) 1
。
所以你的解析很好,但你编写的结果是错误的。您想要不同的关联性、顺序或其他东西。