@@ -95,14 +95,13 @@ parseValueAtom = C.indented *> P.choice (map P.try
9595 , C.parens parseValue ])
9696
9797parseValue :: P.Parsec String P.Column Value
98−parseValue = buildExpressionParser operators $ C.fold (C.lexeme typedValue) (C.lexeme funArgs) App
98+parseValue = buildExpressionParser operators . C.buildPostfixParser postfixTable $ parseValueAtom
9999 where
100− typedValue = C.augment parseValueAtom parseTypeAnnotation TypedValue
101− funArgs = C.indented *> C.parens (parseValue `P.sepBy` (C.indented *> C.comma))
102− parseTypeAnnotation = P.try $ C.lexeme (C.indented *> P.string "::") *> parsePolyType
103− operators = [ [ Postfix $ Accessor <$> (C.indented *> C.dot *> C.indented *> C.identifier)
104− , Postfix $ Indexer <$> (C.indented *> C.squares parseValue) ]
105− , [ Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "!") >> return (Unary Not)
100+ postfixTable = [ Accessor <$> (C.indented *> C.dot *> C.indented *> C.identifier)
101+ , Indexer <$> (C.indented *> C.squares parseValue)
102+ , flip App <$> (C.indented *> C.parens (parseValue `P.sepBy` (C.indented *> C.comma)))
103+ , flip TypedValue <$> (P.try $ C.lexeme (C.indented *> P.string "::") *> parsePolyType) ]
104+ operators = [ [ Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "!") >> return (Unary Not)
106105 , Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "~") >> return (Unary BitwiseNot)
107106 , Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "-") >> return (Unary Negate) ]
108107 , [ Infix (C.lexeme (P.try (C.indented *> C.parseIdentInfix) >>= \ident -> return $ \t1 t2 -> App (App (Var ident) [t1]) [t2])) AssocRight ]