add definitions to parser

This commit is contained in:
rhiannon morris 2023-03-06 11:35:57 +01:00
parent ab2508e0ce
commit 757ea89b0f
9 changed files with 199 additions and 29 deletions

View file

@ -2,6 +2,7 @@ module Quox.Parser.Syntax
import public Quox.Syntax
import public Quox.Syntax.Qty.Three
import public Quox.Definition
import public Control.Monad.Either
@ -65,6 +66,17 @@ namespace PTerm
%runElab deriveMutual ["PTerm", "PCaseBody"] [Eq, Ord, Show]
public export
record PDefinition where
constructor MkPDef
qty : PQty
name : Name
type : PTerm
term : PTerm
%name PDefinition def
%runElab derive "PDefinition" [Eq, Ord, Show]
export
toPDimWith : Context' BaseName d -> Dim d -> PDim
toPDimWith ds (K e) = K e
@ -163,6 +175,7 @@ data FromPTermError =
AnnotationNeeded PTerm
| DuplicatesInEnum (List TagVal)
| DimNotInScope Name
| QtyNotGlobal PQty
public export
FromPTerm : (Type -> Type) -> Type
@ -189,8 +202,8 @@ export
fromPDimWith : FromPTerm m =>
Context' BName d -> PDim -> m (Dim d)
fromPDimWith ds (K e) = pure $ K e
fromPDimWith ds (V i) =
fromBaseName (pure . B) (throwError . DimNotInScope) ds i
fromPDimWith ds (V i) = fromBaseName (pure . B) (throwError . DimNotInScope) ds i
mutual
export
@ -298,3 +311,22 @@ mutual
export %inline
fromPTerm : FromPTerm m => PTerm -> m (Term Three 0 0)
fromPTerm = fromPTermWith [<] [<]
export
globalPQty : FromPTerm m => (q : PQty) -> m (IsGlobal q)
globalPQty Zero = pure GZero
globalPQty One = throwError $ QtyNotGlobal One
globalPQty Any = pure GAny
-- [todo] extend substitutions so they can do this injection. that's the sort of
-- thing they are for.
export
fromPDefinition : FromPTerm m => PDefinition -> m (Name, Definition Three)
fromPDefinition (MkPDef {name, qty, type, term}) =
pure (name, MkDef' {
qty, qtyGlobal = !(globalPQty qty),
type = T $ inject !(fromPTerm type),
term = Just $ T $ inject !(fromPTerm term)
})