Disabled shadowing in pattern match with nice error message, added aux functions

This commit is contained in:
sebastian 2023-04-01 18:45:08 +02:00
parent 4b14cbdebf
commit ec8d554af1
2 changed files with 25 additions and 5 deletions

View file

@ -46,3 +46,10 @@ char = TLit "Char"
tupSequence :: Monad m => (m a, b) -> m (a, b) tupSequence :: Monad m => (m a, b) -> m (a, b)
tupSequence (ma, b) = (,b) <$> ma tupSequence (ma, b) = (,b) <$> ma
fst_ :: (a, b, c) -> a
snd_ :: (a, b, c) -> b
trd_ :: (a, b, c) -> c
snd_ (_, a, _) = a
fst_ (a, _, _) = a
trd_ (_, _, a) = a

View file

@ -5,23 +5,31 @@ module Renamer.Renamer (rename) where
import Auxiliary (mapAccumM) import Auxiliary (mapAccumM)
import Control.Applicative (Applicative (liftA2)) import Control.Applicative (Applicative (liftA2))
import Control.Monad (when)
import Control.Monad.Except ( import Control.Monad.Except (
ExceptT, ExceptT,
MonadError (throwError), MonadError (catchError, throwError),
runExceptT, runExceptT,
) )
import Control.Monad.State ( import Control.Monad.State (
MonadState, MonadState,
State, State,
StateT,
evalState, evalState,
evalStateT,
get,
gets, gets,
lift,
mapAndUnzipM, mapAndUnzipM,
modify, modify,
put,
) )
import Data.Function (on) import Data.Function (on)
import Data.Map (Map) import Data.Map (Map)
import Data.Map qualified as Map import Data.Map qualified as Map
import Data.Maybe (fromMaybe) import Data.Maybe (fromMaybe)
import Data.Set (Set)
import Data.Set qualified as Set
import Data.Tuple.Extra (dupe, second) import Data.Tuple.Extra (dupe, second)
import Grammar.Abs import Grammar.Abs
import Grammar.ErrM (Err) import Grammar.ErrM (Err)
@ -134,17 +142,22 @@ renameBranches ns xs = do
if null new_names then return (mempty, xs') else return (head new_names, xs') if null new_names then return (mempty, xs') else return (head new_names, xs')
renameBranch :: Names -> Branch -> Rn (Names, Branch) renameBranch :: Names -> Branch -> Rn (Names, Branch)
renameBranch ns (Branch patt e) = do renameBranch ns b@(Branch patt e) = do
(new_names, patt') <- renamePattern ns patt (new_names, patt') <- catchError (evalStateT (renamePattern ns patt) mempty) (\x -> throwError $ x ++ " in pattern '" ++ printTree b ++ "'")
(new_names', e') <- renameExp new_names e (new_names', e') <- renameExp new_names e
return (new_names', Branch patt' e') return (new_names', Branch patt' e')
renamePattern :: Names -> Pattern -> Rn (Names, Pattern) renamePattern :: Names -> Pattern -> StateT (Set LIdent) Rn (Names, Pattern)
renamePattern ns p = case p of renamePattern ns p = case p of
PInj cs ps -> do PInj cs ps -> do
(ns_new, ps') <- mapAccumM renamePattern ns ps (ns_new, ps') <- mapAccumM renamePattern ns ps
return (ns_new, PInj cs ps') return (ns_new, PInj cs ps')
PVar name -> second PVar <$> newNameL ns name PVar name -> do
vs <- get
when (name `Set.member` vs) (throwError $ "Conflicting definitions of '" ++ printTree name ++ "'")
put (Set.insert name vs)
nn <- lift $ newNameL ns name
return $ second PVar nn
_ -> return (ns, p) _ -> return (ns, p)
renameTVars :: Type -> Rn Type renameTVars :: Type -> Rn Type