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.

90 lines
2.0 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. ',' { Token TokComma _ _ }
  26. '*' { Token TokStar _ _ }
  27. '.1' { Token TokPi1 _ _ }
  28. '.2' { Token TokPi2 _ _ }
  29. %%
  30. Exp :: { Expr }
  31. Exp
  32. : ExpProj Exp { App Ex $1 $2 }
  33. | ExpProj '{' Exp '}' { App Im $1 $3 }
  34. | '\\' LambdaList '->' Exp { makeLams $2 $4 }
  35. | '(' VarList ':' Exp ')' '->' Exp { makePis Ex $2 $4 $7 }
  36. | '{' VarList ':' Exp '}' '->' Exp { makePis Im $2 $4 $7 }
  37. | ExpProj '->' Exp { Pi Ex (T.singleton '_') $1 $3 }
  38. | '(' VarList ':' Exp ')' '*' Exp { makeSigmas $2 $4 $7 }
  39. | ExpProj '*' Exp { Sigma (T.singleton '_') $1 $3 }
  40. | ExpProj { $1 }
  41. LambdaList :: { [(Plicity, Text)] }
  42. : var { [(Ex, $1)] }
  43. | var LambdaList { (Ex, $1):$2 }
  44. | '{'var'}' { [(Im, $2)] }
  45. | '{'var'}' LambdaList { (Im, $2):$4 }
  46. VarList :: { [Text] }
  47. : var { [$1] }
  48. | var VarList { $1:$2 }
  49. ExpProj :: { Expr }
  50. : ExpProj '.1' { Proj1 $1 }
  51. | ExpProj '.2' { Proj2 $1 }
  52. | Atom { $1 }
  53. Atom :: { Expr }
  54. : var { Var $1 }
  55. | '(' Tuple ')' { $2 }
  56. Tuple :: { Expr }
  57. : Exp { $1 }
  58. | Exp ',' Tuple { Pair $1 $3 }
  59. {
  60. lexer cont = alexMonadScan >>= cont
  61. parseError x = alexError (show x)
  62. makeLams xs b = foldr (uncurry Lam) b xs
  63. makePis p xs t b = foldr (flip (Pi p) t) b xs
  64. makeSigmas xs t b = foldr (flip Sigma t) b xs
  65. }