@@ -113,6 +113,7 @@ parseValueAtom = P.choice
113 , parseBlock
113 , parseBlock
114 , parseCase
114 , parseCase
115 , parseIfThenElse
115 , parseIfThenElse
116 , Parens <$> C.parens parseValue ]
117 , Parens <$> C.parens parseValue ]
118parsePropertyUpdate :: P.Parsec String ParseState (String, Value)
119parsePropertyUpdate :: P.Parsec String ParseState (String, Value)
@@ -126,6 +127,12 @@ parseAccessor :: Value -> P.Parsec String ParseState Value
126parseAccessor (Constructor _) = P.unexpected "constructor"
127parseAccessor (Constructor _) = P.unexpected "constructor"
127parseAccessor obj = P.try $ Accessor <$> (C.indented *> C.dot *> P.notFollowedBy C.opLetter *> C.indented *> C.identifier) <*> pure obj
128parseAccessor obj = P.try $ Accessor <$> (C.indented *> C.dot *> P.notFollowedBy C.opLetter *> C.indented *> C.identifier) <*> pure obj
130+parseDo :: P.Parsec String ParseState Value
134+ Do <$> C.mark (P.many (C.same *> C.mark parseDoNotationElement))
129parseDoNotationLet :: P.Parsec String ParseState DoNotationElement
136parseDoNotationLet :: P.Parsec String ParseState DoNotationElement
130parseDoNotationLet = DoNotationLet <$> (C.reserved "let" *> C.indented *> parseBinder)
137parseDoNotationLet = DoNotationLet <$> (C.reserved "let" *> C.indented *> parseBinder)
131 <*> (C.indented *> C.reservedOp "=" *> parseValue)
138 <*> (C.indented *> C.reservedOp "=" *> parseValue)
@@ -133,21 +140,12 @@ parseDoNotationLet = DoNotationLet <$> (C.reserved "let" *> C.indented *> parseB
133parseDoNotationBind :: P.Parsec String ParseState DoNotationElement
140parseDoNotationBind :: P.Parsec String ParseState DoNotationElement
134parseDoNotationBind = DoNotationBind <$> parseBinder <*> (C.indented *> C.reservedOp "<-" *> parseValue)
141parseDoNotationBind = DoNotationBind <$> parseBinder <*> (C.indented *> C.reservedOp "<-" *> parseValue)
136−parseDoNotationReturn :: P.Parsec String ParseState DoNotationElement
137−parseDoNotationReturn = DoNotationReturn <$> (C.reserved "return" *> C.indented *> parseValue)
139parseDoNotationElement :: P.Parsec String ParseState DoNotationElement
143parseDoNotationElement :: P.Parsec String ParseState DoNotationElement
140parseDoNotationElement = P.choice
144parseDoNotationElement = P.choice
141 [ P.try parseDoNotationBind
145 [ P.try parseDoNotationBind
142 , parseDoNotationLet
146 , parseDoNotationLet
143− , parseDoNotationReturn
144 , P.try (DoNotationValue <$> parseValue) ]
147 , P.try (DoNotationValue <$> parseValue) ]
146−parseManyDoNotationElements :: P.Parsec String ParseState [DoNotationElement]
147−parseManyDoNotationElements = do
149− C.mark (P.many (C.same *> C.mark parseDoNotationElement))
151parseValue :: P.Parsec String ParseState Value
149parseValue :: P.Parsec String ParseState Value
152parseValue =
150parseValue =
153 (buildExpressionParser operators
151 (buildExpressionParser operators
@@ -160,7 +158,6 @@ parseValue =
160 postfixTable2 = [ \v -> P.try (C.indented *> indexersAndAccessors >>= \t2 -> return (\t1 -> App t1 [t2])) <*> pure v
158 postfixTable2 = [ \v -> P.try (C.indented *> indexersAndAccessors >>= \t2 -> return (\t1 -> App t1 [t2])) <*> pure v
161 , \v -> P.try $ flip App <$> (C.indented *> C.parens (C.commaSep parseValue)) <*> pure v
159 , \v -> P.try $ flip App <$> (C.indented *> C.parens (C.commaSep parseValue)) <*> pure v
162 , \v -> flip (TypedValue True) <$> (P.try (C.lexeme (C.indented *> P.string "::")) *> parsePolyType) <*> pure v
160 , \v -> flip (TypedValue True) <$> (P.try (C.lexeme (C.indented *> P.string "::")) *> parsePolyType) <*> pure v
163− , \v -> P.try $ Do v <$> (C.indented *> C.reserved "do" *> parseManyDoNotationElements)
165 operators = [ [ Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "!") >> return (Unary Not)
162 operators = [ [ Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "!") >> return (Unary Not)
166 , Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "~") >> return (Unary BitwiseNot)
163 , Prefix $ C.lexeme (P.try $ C.indented *> C.reservedOp "~") >> return (Unary BitwiseNot)