-- | -- Module : $Header$ -- Copyright : (c) 2013-2015 Galois, Inc. -- License : BSD3 -- Maintainer : cryptol@galois.com -- Stability : provisional -- Portability : portable -- -- Utility functions that are also useful for translating programs -- from previous Cryptol versions. 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