less prototype, less bad code implementation of CCHM type theory
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.

73 lines
1.5 KiB

  1. {
  2. module Presyntax.Parser where
  3. import qualified Data.Text as T
  4. import Data.Text (Text)
  5. import Presyntax.Presyntax
  6. import Presyntax.Tokens
  7. import Presyntax.Lexer
  8. }
  9. %name parseExp Exp
  10. %tokentype { Token }
  11. %monad { Alex }
  12. %lexer { lexer } { Token TokEof _ _ }
  13. %errorhandlertype explist
  14. %error { parseError }
  15. %token
  16. var { Token (TokVar $$) _ _ }
  17. '(' { Token TokOParen _ _ }
  18. ')' { Token TokCParen _ _ }
  19. '{' { Token TokOBrace _ _ }
  20. '}' { Token TokCBrace _ _ }
  21. '\\' { Token TokLambda _ _ }
  22. '->' { Token TokArrow _ _ }
  23. ':' { Token TokColon _ _ }
  24. '=' { Token TokEqual _ _ }
  25. %%
  26. Exp :: { Expr }
  27. Exp
  28. : ExpFun Exp { App Ex $1 $2 }
  29. | ExpFun '{' Exp '}' { App Im $1 $3 }
  30. | '\\' LambdaList '->' Exp { makeLams $2 $4 }
  31. | '(' VarList ':' Exp ')' '->' Exp { makePis Ex $2 $4 $7 }
  32. | '{' VarList ':' Exp '}' '->' Exp { makePis Im $2 $4 $7 }
  33. | ExpFun '->' Exp { Pi Ex (T.singleton '_') $1 $3 }
  34. | ExpFun { $1 }
  35. LambdaList :: { [(Plicity, Text)] }
  36. : var { [(Ex, $1)] }
  37. | var LambdaList { (Ex, $1):$2 }
  38. | '{'var'}' { [(Im, $2)] }
  39. | '{'var'}' LambdaList { (Im, $2):$4 }
  40. VarList :: { [Text] }
  41. : var { [$1] }
  42. | var VarList { $1:$2 }
  43. ExpFun :: { Expr }
  44. : Atom { $1 }
  45. | '(' Exp ')' { $2 }
  46. Atom :: { Expr }
  47. : var { Var $1 }
  48. {
  49. lexer cont = alexMonadScan >>= cont
  50. parseError x = alexError (show x)
  51. makeLams xs b = foldr (uncurry Lam) b xs
  52. makePis p xs t b = foldr (flip (Pi p) t) b xs
  53. }