a type theory with equality based on setoids
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
5.2 KiB

  1. {-# LANGUAGE TupleSections #-}
  2. {-# LANGUAGE BlockArguments #-}
  3. {-# LANGUAGE LambdaCase #-}
  4. {-# LANGUAGE DerivingVia #-}
  5. module Presyntax.Parser where
  6. import Control.Applicative
  7. import Control.Monad.State
  8. import qualified Data.Text as T
  9. import Data.Text (Text)
  10. import Presyntax.Lexer
  11. import Presyntax
  12. import Syntax
  13. data ParseError
  14. = UnexpectedEof Int Int
  15. | Unexpected Token
  16. | Empty
  17. | AltError ParseError ParseError
  18. deriving (Show)
  19. data ParseState
  20. = ParseState { ptTs :: [Token]
  21. , ptLine :: !Int
  22. , ptCol :: !Int
  23. }
  24. newtype Parser a =
  25. Parser { runParser :: ParseState -> Either ParseError (a, ParseState) }
  26. deriving
  27. ( Functor
  28. , Applicative
  29. , Monad
  30. , MonadState ParseState
  31. )
  32. via (StateT ParseState (Either ParseError))
  33. parseString :: Parser a -> String -> Either (Either LexError ParseError) a
  34. parseString (Parser k) s =
  35. case lexString s of
  36. Left e -> Left (Left e)
  37. Right xs ->
  38. case k (ParseState xs 0 0) of
  39. Left e -> Left (pure e)
  40. Right (x, _) -> Right x
  41. selectToken :: (Token -> Maybe a) -> Parser a
  42. selectToken k = Parser \case
  43. ParseState [] l c -> Left (UnexpectedEof l c)
  44. ParseState (x:xs) _ _ ->
  45. case k x of
  46. Just p -> pure (p, ParseState xs (tokLine x) (tokCol x))
  47. Nothing -> Left (Unexpected x)
  48. expect :: TokenClass -> Parser ()
  49. expect t = selectToken (\x -> if tokClass x == t then Just () else Nothing)
  50. var :: Parser Text
  51. var = selectToken \case
  52. Token _ _ _ _ (Tok_var v) -> pure v
  53. _ -> Nothing
  54. optionally :: Parser a -> Parser (Maybe a)
  55. optionally p = fmap Just p <|> pure Nothing
  56. braces :: Parser a -> Parser a
  57. braces k = do
  58. expect Tok_obrace
  59. x <- k
  60. expect Tok_cbrace
  61. pure x
  62. parens :: Parser a -> Parser a
  63. parens k = do
  64. expect Tok_oparen
  65. x <- k
  66. expect Tok_cparen
  67. pure x
  68. instance Alternative Parser where
  69. empty = Parser \_ -> Left Empty
  70. Parser kx <|> Parser ky = Parser \x ->
  71. case kx x of
  72. Right x -> Right x
  73. Left e ->
  74. case ky x of
  75. Left _ -> Left e
  76. Right y -> Right y
  77. attachPos :: Parser RawExpr -> Parser RawExpr
  78. attachPos k = do
  79. start <- gets (\(ParseState ~(x:_) _ _) -> (tokLine x, tokCol x - (tokOff x - tokSOff x)))
  80. x <- k
  81. end <- gets (\(ParseState _ l c) -> (l, c))
  82. pure (RSrcPos start end x)
  83. body :: Parser RawExpr
  84. body = attachPos letExpr <|> attachPos lamExpr <|> attachPos exprPi where
  85. letExpr = do
  86. expect Tok_let
  87. n <- var
  88. expect Tok_colon
  89. t <- body
  90. letSmol n t <|> letBig n t
  91. letSmol n t = do
  92. expect Tok_equal
  93. d <- body
  94. expect Tok_semi
  95. Rlet n t d <$> body
  96. letBig n t = do
  97. expect Tok_semi
  98. selectToken \case
  99. Token _ _ _ _ (Tok_var n') | n' == n -> Just ()
  100. _ -> Nothing
  101. args <- many arg
  102. expect Tok_equal
  103. d <- body
  104. expect Tok_semi
  105. Rlet n t (foldr lam d args) <$> body
  106. lamExpr = do
  107. expect Tok_lambda
  108. vs <- some arg
  109. expect Tok_arrow
  110. e <- body
  111. pure (foldr lam e vs)
  112. arg = fmap (Ex,) var <|> fmap (Im,) (braces var)
  113. lam (p, v) b = Rlam p v b
  114. exprPi :: Parser RawExpr
  115. exprPi = attachPos $
  116. do
  117. bs <- optionally binder
  118. case bs of
  119. Just k -> foldl (.) id k <$> attachPos exprPi
  120. Nothing -> attachPos exprArr
  121. where
  122. binder = (some (parens (bind Ex) <|> braces (bind Im)) <* expect Tok_arrow)
  123. <|> (fmap pure (parens sigma) <* expect Tok_times)
  124. bind p = do
  125. names <- some var
  126. expect Tok_colon
  127. t <- exprPi
  128. pure (foldr (\n k -> Rpi p n t . k) id names)
  129. sigma = do
  130. n <- var
  131. expect Tok_colon
  132. Rsigma n <$> exprPi
  133. exprArr :: Parser RawExpr
  134. exprArr = attachPos $ do
  135. t <- attachPos exprApp
  136. c <- optionally (fmap (const True) (expect Tok_arrow) <|> fmap (const False) (expect Tok_times))
  137. case c of
  138. Just True -> Rpi Ex (T.singleton '_') t <$> exprPi
  139. Just False -> Rsigma (T.singleton '_') t <$> exprPi
  140. Nothing -> pure t
  141. exprEq0 :: Parser RawExpr
  142. exprEq0 = attachPos $
  143. do
  144. head <- atom
  145. spine <- many spineEntry
  146. pure (foldl app head spine)
  147. where
  148. spineEntry = fmap (Ex,) atom <|> fmap (Im,) (braces exprPi)
  149. app f (x, s) = Rapp x f s
  150. exprApp :: Parser RawExpr
  151. exprApp = attachPos $ do
  152. t <- exprEq0
  153. c <- optionally (expect Tok_equiv)
  154. case c of
  155. Just () -> Req t <$> exprEq0
  156. Nothing -> pure t
  157. atom0 :: Parser RawExpr
  158. atom0 = attachPos $
  159. fmap Rvar var
  160. <|> fmap (const Rtype) (expect Tok_type)
  161. <|> fmap (const Rhole) (expect Tok_under)
  162. <|> fmap (const Rtop) (expect Tok_top)
  163. <|> fmap (const Rrefl) (expect Tok_refl)
  164. <|> fmap (const Rcoe) (expect Tok_coe)
  165. <|> fmap (const Rcong) (expect Tok_cong)
  166. <|> fmap (const Rsym) (expect Tok_sym)
  167. <|> fmap (const Runit) (parens (pure ()))
  168. <|> parens pair
  169. pair :: Parser RawExpr
  170. pair = attachPos $ do
  171. t <- body
  172. c <- optionally (expect Tok_comma)
  173. case c of
  174. Just () -> Rpair t <$> pair
  175. Nothing -> pure t
  176. atom :: Parser RawExpr
  177. atom = attachPos $
  178. do
  179. e <- atom0
  180. c <- many (selectToken (projection . tokClass))
  181. pure $ case c of
  182. [] -> e
  183. sls -> foldl (flip ($)) e sls
  184. where
  185. projection Tok_proj1 = pure Rproj1
  186. projection Tok_proj2 = pure Rproj2
  187. projection _ = Nothing