git.iko.soy/rowtype-yoga/purescript-native
on 1997015 help sign in
76 lines 2.7 kB history raw
1-----------------------------------------------------------------------------
2--
3-- Module : PureScript.Parser.Declarations
4-- Copyright : (c) Phil Freeman 2013
5-- License : MIT
6--
7-- Maintainer : Phil Freeman <paf31@cantab.net>
8-- Stability : experimental
9-- Portability :
10--
11-- |
12--
13-----------------------------------------------------------------------------
15module PureScript.Parser.Declarations (
16 parseDeclaration,
17 parseDeclarations
18) where
20import Data.Char
21import Data.List
22import Data.Maybe
23import Data.Function
24import Control.Applicative
25import Control.Arrow (Arrow(..))
26import Control.Monad.State
27import qualified Text.Parsec as P
28import qualified Text.Parsec.Pos as P
30import PureScript.Values
31import PureScript.Types
32import PureScript.Parser.Common
33import PureScript.Declarations
34import PureScript.Parser.Values
35import PureScript.Parser.Types
37parseDataDeclaration :: P.Parsec String P.Column Declaration
38parseDataDeclaration = do
39 reserved "data"
40 name <- indented *> properName
41 tyArgs <- many (indented *> identifier)
42 lexeme $ indented *> P.char '='
43 ctors <- P.sepBy1 ((,) <$> (indented *> properName) <*> P.optionMaybe parseType) (lexeme $ indented *> P.char '|')
44 return $ DataDeclaration name tyArgs ctors
46parseTypeDeclaration :: P.Parsec String P.Column Declaration
47parseTypeDeclaration =
48 TypeDeclaration <$> parseIdent
49 <*> (lexeme (indented *> P.string "::") *> parsePolyType)
51parseTypeSynonymDeclaration :: P.Parsec String P.Column Declaration
52parseTypeSynonymDeclaration =
53 TypeSynonymDeclaration <$> (reserved "type" *> indented *> properName)
54 <*> many (indented *> identifier)
55 <*> (lexeme (indented *> P.char '=') *> parseType)
57parseValueDeclaration :: P.Parsec String P.Column Declaration
58parseValueDeclaration =
59 ValueDeclaration <$> parseIdent
60 <*> (lexeme (indented *> P.char '=') *> parseValue)
62parseExternDeclaration :: P.Parsec String P.Column Declaration
63parseExternDeclaration =
64 ExternDeclaration <$> (reserved "extern" *> indented *> parseIdent)
65 <*> (lexeme (indented *> P.string "::") *> parsePolyType)
67parseDeclaration :: P.Parsec String P.Column Declaration
68parseDeclaration = P.choice $ map P.try
69 [ parseDataDeclaration
70 , parseTypeDeclaration
71 , parseTypeSynonymDeclaration
72 , parseValueDeclaration
73 , parseExternDeclaration ]
75parseDeclarations :: P.Parsec String P.Column [Declaration]
76parseDeclarations = whiteSpace *> mark (same *> P.many parseDeclaration) <* P.eof