language-ocaml-0.1.31: lib/Language/OCaml/Parser/LblPatternList.hs
module Language.OCaml.Parser.LblPatternList
( lblPatternListP
) where
import Text.Megaparsec
import Language.OCaml.Definitions.Parsing.ASTTypes
import Language.OCaml.Definitions.Parsing.ParseTree
import Language.OCaml.Parser.LblPattern
import Language.OCaml.Parser.OptSemi
import Language.OCaml.Parser.Tokens
import Language.OCaml.Parser.Utils.Types
-- FIXME: Right now, this is made to look like the OCaml parser, but we could
-- optimize everything by factoring out the left parsers that are the same.
lblPatternListP :: Parser Pattern -> Parser ([(Loc Longident, Pattern)], ClosedFlag)
lblPatternListP patternP = choice
[ try $ do
p <- lblPatternP'
semiT
(fields, closed) <- lblPatternListP'
return (p : fields, closed)
, try $ do
p <- lblPatternP'
semiT
underscoreT
optSemiP
return ([p], Open)
, try $ do
p <- lblPatternP'
semiT
return ([p], Closed)
, do
p <- lblPatternP'
return ([p], Closed)
]
where
lblPatternP' = lblPatternP patternP
lblPatternListP' = lblPatternListP patternP