1 {-# LANGUAGE AllowAmbiguousTypes #-}
2 {-# LANGUAGE ConstraintKinds #-}
3 {-# LANGUAGE DataKinds #-}
4 {-# LANGUAGE EmptyDataDeriving #-}
5 {-# LANGUAGE PolyKinds #-}
6 {-# LANGUAGE QuantifiedConstraints #-}
7 {-# LANGUAGE RankNTypes #-}
8 {-# LANGUAGE UndecidableInstances #-}
9 {-# LANGUAGE UndecidableSuperClasses #-}
10 {-# LANGUAGE ViewPatterns #-}
11 {-# LANGUAGE NoMonomorphismRestriction #-}
12 {-# OPTIONS_GHC -Wno-missing-signatures #-}
13 {-# OPTIONS_GHC -Wno-orphans #-}
15 -- {-# OPTIONS_GHC -Wno-monomorphism-restriction #-}
17 module Symantic.Syntaxes where
19 import Control.Arrow (left)
20 import Data.Either (Either (..))
21 import Data.Eq (Eq (..))
22 import Data.Function (fix, ($), (.))
24 import Data.Kind (Type)
25 import Data.Maybe (Maybe (..))
26 import Data.Monoid (Monoid (..))
27 import Data.Void (Void)
28 import Symantic.Semantics.Forall (Forall (..), PerSyntax, PerSyntaxable (..))
29 import Symantic.Syntaxes.Classes (Syntaxes, Unabstractable (..))
30 import Text.Show (Show (..))
31 import Type.Reflection (eqTypeRep, typeRep, (:~~:) (..))
32 import Prelude (error)
35 import Symantic.Typer ()
38 forall syns prov finalSyns.
39 finalSyns ~ (Unabstractable ': Constable ': syns) =>
40 (forall k. ProvenanceKindOf (Ty @k) prov) =>
41 (forall k. ProvenanceKindOf (Var @k) prov) =>
44 Syntaxes finalSyns (Forall finalSyns) =>
45 Parsers finalSyns finalSyns prov =>
47 Either (PerSyntax finalSyns (ErrorParser prov)) (TermVT finalSyns prov '[])
48 parse ast = unParser (fix openParser ast) CtxTyZ
50 -- Unabstractable and Constable are always required.
51 openParser final (BinTree2 fT xT) = Parser $ \ctx -> do
52 TermVT fTy (f :: OpenTerm finalSyns fVS a2b) <- unParser (final fT) ctx
53 TermVT xTy (a :: OpenTerm finalSyns aVS a) <- unParser (final xT) ctx
58 { tyAppFun = TyConst{tyConst = eqTypeRep (typeRep @(->)) -> Just HRefl}
63 let (fxTy', xTy') = appendVars fxTy xTy
64 mgu <- (perSyntax . ErrorParserUnabstractableUnify) `left` unifyType mempty fxTy' xTy'
65 let fxTy'' = subst @Ty mgu fxTy'
66 let xTy'' = subst @Ty mgu xTy'
67 case eqTy fxTy'' xTy'' of
68 Nothing -> Left $ perSyntax $ ErrorParserUnabstractableArgumentMismatch (TyVT fxTy'') (TyVT xTy'')
69 Just HRefl -> Right $ TermVT rTy $ f .@ a
70 _ -> Left $ perSyntax $ ErrorParserUnabstractableNotAFunction (TyVT fTy)
71 openParser final (BinTree0 e) = parsers @finalSyns @finalSyns @prov final e
72 data instance ErrorParser prov Unabstractable
73 = ErrorParserUnabstractableArgumentMismatch (TyVT prov) (TyVT prov)
74 | ErrorParserUnabstractableNotAFunction (TyVT prov)
75 | ErrorParserUnabstractableUnify (ErrorUnify prov)
79 class Parsers syns finalSyns prov where
80 parsers :: OpenParser finalSyns prov
81 instance PerSyntaxable finalSyns Constable => Parsers '[] finalSyns prov where
82 parsers _final tok = Parser $ \_ctx ->
83 Left $ perSyntax $ ErrorParserConstableInvalid tok
84 data instance ErrorParser prov Constable
85 = ErrorParserConstableInvalid (TokenTerm prov)
88 ( TokenParser syn finalSyns prov
89 , Parsers syns finalSyns prov
91 Parsers (syn ': syns) finalSyns prov
93 parsers final = tokenParser @syn @finalSyns (parsers @syns @finalSyns final) final
95 -- ** Type 'OpenParser'
96 type OpenParser syns prov =
99 {-final-} (TermAST prov -> Parser syns prov) ->
103 -- ** Class 'TokenParser'
104 class TokenParser syn finalSyns prov where
106 {-next-} (TokenTerm prov -> Parser finalSyns prov) ->
107 OpenParser finalSyns prov
109 ( Syntaxes finalSyns (Forall finalSyns)
111 TokenParser Unabstractable finalSyns prov
113 tokenParser next _final = next
114 data instance ErrorParser prov (AbstractableTy (Ty prov '[]))
115 = ErrorParserAbstractableUnknown Name
116 | ErrorParserAbstractableNotAType (TyVT prov)
119 ( Syntaxes finalSyns (Forall finalSyns)
120 , forall sem. Syntaxes finalSyns sem => Constable sem
121 , forall sem. Syntaxes finalSyns sem => Unabstractable sem
122 , PerSyntaxable finalSyns (AbstractableTy (Ty prov '[]))
123 , forall k. ProvenanceKindOf (Ty @k) prov
125 TokenParser (AbstractableTy (Ty prov '[])) finalSyns prov
127 tokenParser _next _final (TokenTermVar vN) = Parser go
129 go :: forall vs. CtxTy prov vs Void -> Either (PerSyntax finalSyns (ErrorParser prov)) (TermVT finalSyns prov vs)
130 go CtxTyZ = Left $ perSyntax $ ErrorParserAbstractableUnknown vN
131 go (CtxTyS n ty _) | n == vN = Right $ TermVT ty $ V
132 go (CtxTyS _n _typ tys) = do
133 TermVT ty ot <- go tys
134 Right $ TermVT ty $ W ot
135 tokenParser _next final (TokenTermAbst argName (TyT (argTy :: Ty prov '[] a)) bT) =
137 case eqTy (monoTy @Type @prov) (kindOf argTy) of
138 Nothing -> Left $ perSyntax $ ErrorParserAbstractableNotAType (TyVT argTy)
140 TermVT resTy (b :: OpenTerm syn bVS b) <- (unParser (final bT)) (CtxTyS argName argTy ctx)
141 let argTy' = allocVarsR (lenVar resTy) argTy
143 TermVT (argTy' ~> resTy) $
145 E d -> E (constK .@ d)
147 W e -> E constK `appOpenTerm` e
149 tokenParser next _final e = next e
151 ( Syntaxes finalSyns (Forall finalSyns)
152 , forall sem. Syntaxes finalSyns sem => Addable sem
154 TokenParser Addable finalSyns prov
156 tokenParser next _final = \case
158 | Right (i :: Int) <- safeRead s ->
162 (tyOfTypeRep (lenVar ctx) (typeRep @Int))
166 TokenTermAtom "neg" -> Parser $ \_ctx ->
167 Right $ TermVT (monoTy @Int ~> monoTy @Int) $ E neg
168 TokenTermAtom "add" -> Parser $ \_ctx ->
169 Right $ TermVT (monoTy @Int ~> monoTy @Int ~> monoTy @Int) $ E add
172 ( Syntaxes syns (Forall syns)
173 , forall sem. Syntaxes syns sem => Constable sem
175 TokenParser Constable syns prov
177 tokenParser next _final = \case
178 TokenTermAtom "id" -> Parser $ \_ctx ->
179 Right $ TermVT (aTy ~> aTy @'[]) $ E constI
180 TokenTermAtom "(<*>)" -> Parser $ \_ctx ->
182 TermVT ((aTy ~> bTy ~> cTy) ~> (aTy ~> bTy) ~> aTy ~> cTy @'[]) $
187 class Addable sem where
188 lit :: Int -> sem Int
189 neg :: sem (Int -> Int)
190 add :: sem (Int -> Int -> Int)
191 data instance ErrorParser prov Addable
195 class Mulable sem where
196 mul :: sem Int -> sem Int -> sem Int
197 instance (forall sem. Syntaxes syn sem => Addable sem) => Addable (Forall syn) where
198 lit n = Forall (lit n)
201 instance (forall sem. Syntaxes syn sem => Mulable sem) => Mulable (Forall syn) where
202 mul (Forall a) (Forall b) = Forall (mul a b)
208 -- tree0Parser :: (forall sem. syn sem => Addable sem, syn (Forall syn)) => Either ErrMsg (Forall syn Int)
209 -- tree0Parser = unParser $ parse tree0Print
213 -- ( forall sem. syn sem => Mulable sem
214 -- , forall sem. syn sem => Addable sem
215 -- , syn (Forall syn)
219 -- (TermAST prov -> Parser syn prov) ->
220 -- TermAST prov -> Parser syn prov
221 -- parseMulable final (BinTree2 (BinTree2 (BinTree0 (TokenTermAtom "mul")) aT) bT) =
222 -- Parser $ \ctx -> do
223 -- case (final aT, final bT) of
224 -- (Parser aE, Parser bE) -> do
225 -- TermVT aTy (Forall a :: Forall syn a) <- aE ctx
226 -- case eqTy aTy TyConst{tyConst = Const{constType = typeRep @Int, constMeta = mempty::prov}, tyConstLen = lenVar aTy} of
227 -- Nothing -> Left "TypeError: Mulable 1"
229 -- TermVT bTy (Forall b :: Forall syn b) <- bE ctx
230 -- case eqTy bTy TyConst{tyConst = Const{constType = typeRep @Int, constMeta = mempty::prov}, tyConstLen = lenVar bTy} of
231 -- Nothing -> Left "TypeError: Mulable 2"
233 -- Right $ TermVT aTy (Forall @_ @a $ mul a b)
234 -- parseMulable final t = parseAddable final t
240 printConst n = Printer (BinTree0 (TokenTermAtom n))
242 instance Constable (Printer prov) where
243 constI = printConst "id"
244 constK = printConst "const"
245 constS = printConst "(<*>)"
246 constB = printConst "(.)"
247 constC = printConst "flip"
248 instance Addable (Printer prov) where
249 lit n = Printer $ BinTree0 (TokenTermAtom (show n))
250 neg = printConst "neg"
251 add = printConst "add"
252 instance Mulable (Printer prov) where
254 instance Unabstractable (Printer prov) where
255 Printer f .@ Printer a = Printer $ BinTree2 f a
256 instance (Monoid prov) => AbstractableTy (Ty prov '[]) (Printer prov) where
257 lamTy xTy (f :: Printer prov a -> Printer prov b) =
263 (unPrinter (f (Printer (BinTree0 (TokenTermVar "x")))))
266 -- * Type 'FinalSyntaxes'
267 type FinalSyntaxes prov = '[AbstractableTy (Ty prov '[]), Addable]
270 tree0 = add .@ lit 8 .@ (neg .@ (add .@ lit 1 .@ lit 2))
272 -- tree1 = mul (add (lit 8) (neg (add (lit 1) (lit 2)))) (lit 2)
273 tree2 = fun @() (\x -> add .@ x .@ lit 0)
274 tree3 = fun @() (\x -> add .@ x .@ x)
275 tree4 = constS .@ add .@ constI
276 tree0Print = print tree0
278 -- tree1Print = print tree1
279 tree2Print = print tree2
280 tree3Print = print tree3
281 tree4Print = print tree4
283 tree0ParsePrint :: TermAST ()
284 tree0ParsePrint = case parse @(FinalSyntaxes ()) @() tree0Print of
285 Left e -> error $ show e
286 Right (TermVT _ty (unE -> Forall sem)) -> print sem
288 -- tree1ParsePrint :: TermAST ()
289 -- tree1ParsePrint = case parse @(FinalSyntaxes ()) @() tree1Print of
291 -- Right (TermVT _ty (unE -> Forall sem)) -> print sem
293 tree2ParsePrint :: TermAST ()
294 tree2ParsePrint = case parse @(FinalSyntaxes ()) @() tree2Print of
295 Left e -> error $ show e
296 Right (TermVT _ty (unE -> Forall sem)) -> print sem
298 tree3ParsePrint :: TermAST ()
299 tree3ParsePrint = case parse @(FinalSyntaxes ()) @() tree3Print of
300 Left e -> error $ show e
301 Right (TermVT _ty (unE -> Forall sem)) -> print sem
303 tree3ParsePrint' :: TermAST ()
304 tree3ParsePrint' = case parse @(FinalSyntaxes ()) @() tree3ParsePrint of
305 Left e -> error $ show e
306 Right (TermVT _ty (unE -> Forall sem)) -> print sem
308 tree4ParsePrint :: TermAST ()
309 tree4ParsePrint = case parse @(FinalSyntaxes ()) @() tree4Print of
310 Left e -> error $ show e
311 Right (TermVT _ty (unE -> Forall sem)) -> print sem