mirror of
https://github.com/GaloisInc/cryptol.git
synced 2024-12-16 20:03:27 +03:00
Add Parser AST constructor EInfFrom to represent [x...] and [x,y...]
As a result, parsed terms including [x...] or [x,y...] now pretty-print back out using the same syntax.
This commit is contained in:
parent
ccfbd1f2de
commit
7420b27785
@ -377,6 +377,7 @@ instance Rename Expr where
|
||||
ESel e' s -> ESel <$> rename e' <*> pure s
|
||||
EList es -> EList <$> rename es
|
||||
EFromTo s n e'-> EFromTo <$> rename s <*> rename n <*> rename e'
|
||||
EInfFrom e e' -> EInfFrom<$> rename e <*> rename e'
|
||||
EComp e' bs -> do bs' <- mapM renameMatch bs
|
||||
shadowNames (namingEnv bs')
|
||||
(EComp <$> rename e' <*> pure bs')
|
||||
|
@ -510,8 +510,8 @@ list_expr :: { Expr }
|
||||
| expr ',' expr '..' {% eFromTo $4 $1 (Just $3) Nothing }
|
||||
| expr ',' expr '..' expr {% eFromTo $4 $1 (Just $3) (Just $5) }
|
||||
|
||||
| expr '...' { EApp (ECon ECInfFrom) $1 }
|
||||
| expr ',' expr '...' { EApp (EApp (ECon ECInfFromThen) $1) $3 }
|
||||
| expr '...' { EInfFrom $1 Nothing }
|
||||
| expr ',' expr '...' { EInfFrom $1 (Just $3) }
|
||||
|
||||
|
||||
list_alts :: { [[Match]] }
|
||||
|
@ -253,6 +253,7 @@ data Expr = EVar QName -- ^ @ x @
|
||||
| ESel Expr Selector -- ^ @ e.l @
|
||||
| EList [Expr] -- ^ @ [1,2,3] @
|
||||
| EFromTo Type (Maybe Type) (Maybe Type) -- ^ @[1, 5 .. 117 ] @
|
||||
| EInfFrom Expr (Maybe Expr) -- ^ @ [1, 3 ...] @
|
||||
| EComp Expr [[Match]] -- ^ @ [ 1 | x <- xs ] @
|
||||
| EApp Expr Expr -- ^ @ f x @
|
||||
| EAppT Expr [TypeInst] -- ^ @ f `{x = 8}, f`{8} @
|
||||
@ -665,6 +666,8 @@ instance PP Expr where
|
||||
EFromTo e1 e2 e3 -> brackets (pp e1 <> step <+> text ".." <+> end)
|
||||
where step = maybe empty (\e -> comma <+> pp e) e2
|
||||
end = maybe empty pp e3
|
||||
EInfFrom e1 e2 -> brackets (pp e1 <> step <+> text "...")
|
||||
where step = maybe empty (\e -> comma <+> pp e) e2
|
||||
EComp e mss -> brackets (pp e <+> vcat (map arm mss))
|
||||
where arm ms = text "|" <+> commaSep (map pp ms)
|
||||
ETypeVal t -> text "`" <> ppPrec 5 t -- XXX
|
||||
@ -893,6 +896,7 @@ instance NoPos Expr where
|
||||
ESel x y -> ESel (noPos x) y
|
||||
EList x -> EList (noPos x)
|
||||
EFromTo x y z -> EFromTo (noPos x) (noPos y) (noPos z)
|
||||
EInfFrom x y -> EInfFrom (noPos x) (noPos y)
|
||||
EComp x y -> EComp (noPos x) (noPos y)
|
||||
EApp x y -> EApp (noPos x) (noPos y)
|
||||
EAppT x y -> EAppT (noPos x) (noPos y)
|
||||
|
@ -84,6 +84,7 @@ namesE expr =
|
||||
ESel e _ -> namesE e
|
||||
EList es -> Set.unions (map namesE es)
|
||||
EFromTo _ _ _ -> Set.empty
|
||||
EInfFrom e e' -> Set.union (namesE e) (maybe Set.empty namesE e')
|
||||
EComp e arms -> let (dss,uss) = unzip (map namesArm arms)
|
||||
in Set.union (boundNames (concat dss) (namesE e))
|
||||
(Set.unions uss)
|
||||
@ -194,6 +195,7 @@ tnamesE expr =
|
||||
EList es -> Set.unions (map tnamesE es)
|
||||
EFromTo a b c -> Set.union (tnamesT a)
|
||||
(Set.union (maybe Set.empty tnamesT b) (maybe Set.empty tnamesT c))
|
||||
EInfFrom e e' -> Set.union (tnamesE e) (maybe Set.empty tnamesE e')
|
||||
EComp e mss -> Set.union (tnamesE e) (Set.unions (map tnamesM (concat mss)))
|
||||
EApp e1 e2 -> Set.union (tnamesE e1) (tnamesE e2)
|
||||
EAppT e fs -> Set.union (tnamesE e) (Set.unions (map tnamesTI fs))
|
||||
|
@ -25,6 +25,7 @@ import Control.Applicative(Applicative(..),(<$>))
|
||||
import Data.Maybe(maybeToList)
|
||||
import Data.Either(partitionEithers)
|
||||
import qualified Data.Map as Map
|
||||
import Data.Traversable(traverse)
|
||||
|
||||
|
||||
class RemovePatterns t where
|
||||
@ -147,6 +148,7 @@ noPatE expr =
|
||||
ESel e s -> ESel <$> noPatE e <*> return s
|
||||
EList es -> EList <$> mapM noPatE es
|
||||
EFromTo {} -> return expr
|
||||
EInfFrom e e' -> EInfFrom <$> noPatE e <*> traverse noPatE e'
|
||||
EComp e mss -> EComp <$> noPatE e <*> mapM noPatArm mss
|
||||
EApp e1 e2 -> EApp <$> noPatE e1 <*> noPatE e2
|
||||
EAppT e ts -> EAppT <$> noPatE e <*> return ts
|
||||
|
@ -133,6 +133,7 @@ appTys expr ts =
|
||||
P.ESel {} -> mono
|
||||
P.EList {} -> mono
|
||||
P.EFromTo {} -> mono
|
||||
P.EInfFrom {} -> mono
|
||||
P.EComp {} -> mono
|
||||
P.EApp {} -> mono
|
||||
P.EIf {} -> mono
|
||||
@ -249,6 +250,12 @@ inferE expr =
|
||||
| (x,y) <- ("first",t1) : fs
|
||||
]
|
||||
|
||||
P.EInfFrom e1 Nothing ->
|
||||
inferE $ P.EApp (P.ECon ECInfFrom) e1
|
||||
|
||||
P.EInfFrom e1 (Just e2) ->
|
||||
inferE $ P.EApp (P.EApp (P.ECon ECInfFromThen) e1) e2
|
||||
|
||||
P.EComp e mss ->
|
||||
do (mss', dss, ts) <- unzip3 `fmap` zipWithM inferCArm [ 1 .. ] mss
|
||||
w <- smallest ts
|
||||
|
Loading…
Reference in New Issue
Block a user