module Cryptol.Parser.Utils
( translateExprToNumT
) where
import Cryptol.Parser.AST
import Cryptol.Prims.Syntax
translateExprToNumT :: Expr -> Maybe Type
translateExprToNumT expr =
case expr of
ELocated e r -> (`TLocated` r) `fmap` translateExprToNumT e
EVar (QName Nothing (Name "width")) -> mkFun TCWidth
EVar x -> return (TUser x [])
ECon x -> cvtCon x
ELit x -> cvtLit x
EApp e1 e2 -> do t1 <- translateExprToNumT e1
t2 <- translateExprToNumT e2
tApp t1 t2
_ -> Nothing
where
tApp ty t =
case ty of
TLocated t1 r -> (`TLocated` r) `fmap` tApp t1 t
TApp f ts -> return (TApp f (ts ++ [t]))
TUser f ts -> return (TUser f (ts ++ [t]))
_ -> Nothing
mkFun f = return (TApp f [])
cvtLit (ECNum n CharLit) = return (TChar $ toEnum $ fromInteger n)
cvtLit (ECNum n _) = return (TNum n)
cvtLit (ECString _) = Nothing
cvtCon c =
case c of
ECPlus -> mkFun TCAdd
ECMinus -> mkFun TCSub
ECMul -> mkFun TCMul
ECDiv -> mkFun TCDiv
ECMod -> mkFun TCMod
ECExp -> mkFun TCExp
ECLg2 -> mkFun TCLg2
ECMin -> mkFun TCMin
ECMax -> mkFun TCMax
_ -> Nothing