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.

106 lines
2.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. %name parseStmt Statement
  11. %name parseProg Program
  12. %tokentype { Token }
  13. %monad { Alex }
  14. %lexer { lexer } { Token TokEof _ _ }
  15. %errorhandlertype explist
  16. %error { parseError }
  17. %token
  18. var { Token (TokVar $$) _ _ }
  19. '(' { Token TokOParen _ _ }
  20. ')' { Token TokCParen _ _ }
  21. '{' { Token TokOBrace _ _ }
  22. '}' { Token TokCBrace _ _ }
  23. '\\' { Token TokLambda _ _ }
  24. '->' { Token TokArrow _ _ }
  25. ':' { Token TokColon _ _ }
  26. ';' { Token TokSemi _ _ }
  27. '=' { Token TokEqual _ _ }
  28. ',' { Token TokComma _ _ }
  29. '*' { Token TokStar _ _ }
  30. '.1' { Token TokPi1 _ _ }
  31. '.2' { Token TokPi2 _ _ }
  32. %%
  33. Exp :: { Expr }
  34. Exp
  35. : Exp ExpProj { App Ex $1 $2 }
  36. | Exp '{' Exp '}' { App Im $1 $3 }
  37. | '\\' LambdaList '->' Exp { makeLams $2 $4 }
  38. | '(' VarList ':' Exp ')' ProdTail { makePis Ex $2 $4 $6 }
  39. | '{' VarList ':' Exp '}' ProdTail { makePis Im $2 $4 $6 }
  40. | ExpProj '->' Exp { Pi Ex (T.singleton '_') $1 $3 }
  41. | '(' VarList ':' Exp ')' '*' Exp { makeSigmas $2 $4 $7 }
  42. | ExpProj '*' Exp { Sigma (T.singleton '_') $1 $3 }
  43. | ExpProj { $1 }
  44. ProdTail :: { Expr }
  45. : '(' VarList ':' Exp ')' ProdTail { makePis Ex $2 $4 $6 }
  46. | '{' VarList ':' Exp '}' ProdTail { makePis Im $2 $4 $6 }
  47. | '->' Exp { $2 }
  48. LambdaList :: { [(Plicity, Text)] }
  49. : var { [(Ex, $1)] }
  50. | var LambdaList { (Ex, $1):$2 }
  51. | '{'var'}' { [(Im, $2)] }
  52. | '{'var'}' LambdaList { (Im, $2):$4 }
  53. VarList :: { [Text] }
  54. : var { [$1] }
  55. | var VarList { $1:$2 }
  56. ExpProj :: { Expr }
  57. : ExpProj '.1' { Proj1 $1 }
  58. | ExpProj '.2' { Proj2 $1 }
  59. | Atom { $1 }
  60. Atom :: { Expr }
  61. : var { Var $1 }
  62. | '(' Tuple ')' { $2 }
  63. Tuple :: { Expr }
  64. : Exp { $1 }
  65. | Exp ',' Tuple { Pair $1 $3 }
  66. Statement :: { Statement }
  67. : var ':' Exp { Decl $1 $3 }
  68. | var '=' Exp { Defn $1 $3 }
  69. Program :: { [Statement] }
  70. : Statement { [$1] }
  71. | Statement ';' Program { $1:$3 }
  72. {
  73. lexer cont = alexMonadScan >>= cont
  74. parseError x = alexError (show x)
  75. makeLams xs b = foldr (uncurry Lam) b xs
  76. makePis p xs t b = foldr (flip (Pi p) t) b xs
  77. makeSigmas xs t b = foldr (flip Sigma t) b xs
  78. }