packages feed

language-ocaml-0.1.31: lib/Language/OCaml/Parser/Pattern.hs

module Language.OCaml.Parser.Pattern
  ( patternP
  ) where

import Text.Megaparsec

import Language.OCaml.Definitions.Parsing.ParseTree
import Language.OCaml.Parser.Common
import Language.OCaml.Parser.PatternGen
import Language.OCaml.Parser.Tokens
import Language.OCaml.Parser.ValIdent
import Language.OCaml.Parser.Utils.Combinators
import Language.OCaml.Parser.Utils.Types

patternP :: Parser Pattern
patternP = choice
  [ try $ parser <* notFollowedBy commaT
  , mkpat . PpatTuple <$>
    chainl1' parser (commaT *> (return $ flip (:))) (: [])
  ]
  where
    parser = leftRecursive
      [ patternGenP patternP
      ]
      -- pattern AS valIdent
      [ do
        try $ asT
        i <- valIdentP
        return $ \ x -> mkpat $ PpatAlias x (mkRHS i 3)
      -- pattern COLONCOLON pattern
      , do
        try $ colonColonT
        p2 <- patternP
        return $ \ p1 -> mkpatCons (rhsLoc 2) (ghpat $ PpatTuple [p1, p2]) (symbolRLoc ())
      , do
        try $ barT
        p <- patternP
        return $ \ x -> mkpat $ PpatOr x p
      -- TODO: bunch of other patterns
      ]