packages feed

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

module Language.OCaml.Parser.SimpleExpr
  ( simpleExprP
  ) where

import Language.OCaml.Definitions.Parsing.ParseTree
import Language.OCaml.Parser.Common
import Language.OCaml.Parser.Constant
import Language.OCaml.Parser.ConstrLongident
import Language.OCaml.Parser.ExprSemiList
import Language.OCaml.Parser.LabelLongident
import Language.OCaml.Parser.OptSemi
import Language.OCaml.Parser.RecordExpr
import Language.OCaml.Parser.ValLongident
import Language.OCaml.Parser.Tokens
import Language.OCaml.Parser.Utils.Combinators
import Language.OCaml.Parser.Utils.Types

simpleExprP :: Parser Expression -> Parser Expression -> Parser Expression
simpleExprP seqExprP exprP = leftRecursive
  [ do
    i <- valLongidentP
    return . mkexp $ PexpIdent (mkRHS i 1)
  , mkexp . PexpConstant <$> constantP
  , do
    i <- constrLongidentP
    return $ mkexp $ PexpConstruct (mkRHS i 1) Nothing
  , do
    lParenT
    e <- seqExprP
    rParenT
    return $ relocExp e
  , do
    lBracketT
    l <- exprSemiListP exprP
    optSemiP
    rBracketT
    return $ relocExp $ mktailexp (rhsLoc 4) (reverse l)
  , do
    lBraceT
    (exten, fields) <- recordExprP exprP simpleExprP'
    rBraceT
    return $ mkexp $ PexpRecord fields exten
  ]
  [ do
    dotT
    i <- labelLongidentP
    return $ \ x -> mkexp $ PexpField x (mkRHS i 3)
  ]
  where
    simpleExprP' = simpleExprP seqExprP exprP