|
|
- {
- module Presyntax.Parser where
-
- import qualified Data.Text as T
- import Data.Text (Text)
-
- import Presyntax.Presyntax
- import Presyntax.Tokens
- import Presyntax.Lexer
-
- }
-
- %name parseExp Exp
-
- %tokentype { Token }
-
- %monad { Alex }
- %lexer { lexer } { Token TokEof _ _ }
-
- %errorhandlertype explist
- %error { parseError }
-
- %token
- var { Token (TokVar $$) _ _ }
- '(' { Token TokOParen _ _ }
- ')' { Token TokCParen _ _ }
-
- '{' { Token TokOBrace _ _ }
- '}' { Token TokCBrace _ _ }
-
- '\\' { Token TokLambda _ _ }
-
- '->' { Token TokArrow _ _ }
- ':' { Token TokColon _ _ }
- '=' { Token TokEqual _ _ }
-
- %%
-
- Exp :: { Expr }
- Exp
- : ExpFun Exp { App Ex $1 $2 }
- | ExpFun '{' Exp '}' { App Im $1 $3 }
- | '\\' LambdaList '->' Exp { makeLams $2 $4 }
- | '(' VarList ':' Exp ')' '->' Exp { makePis Ex $2 $4 $7 }
- | '{' VarList ':' Exp '}' '->' Exp { makePis Im $2 $4 $7 }
- | ExpFun '->' Exp { Pi Ex (T.singleton '_') $1 $3 }
- | ExpFun { $1 }
-
- LambdaList :: { [(Plicity, Text)] }
- : var { [(Ex, $1)] }
- | var LambdaList { (Ex, $1):$2 }
-
- | '{'var'}' { [(Im, $2)] }
- | '{'var'}' LambdaList { (Im, $2):$4 }
-
- VarList :: { [Text] }
- : var { [$1] }
- | var VarList { $1:$2 }
-
- ExpFun :: { Expr }
- : Atom { $1 }
- | '(' Exp ')' { $2 }
-
- Atom :: { Expr }
- : var { Var $1 }
-
- {
- lexer cont = alexMonadScan >>= cont
-
- parseError x = alexError (show x)
-
- makeLams xs b = foldr (uncurry Lam) b xs
- makePis p xs t b = foldr (flip (Pi p) t) b xs
- }
|