Complete the removal of the name database.
This commit is contained in:
@@ -9,7 +9,7 @@ module Bang.Monad(
|
|||||||
, BangWarning(..)
|
, BangWarning(..)
|
||||||
, runCompiler
|
, runCompiler
|
||||||
, runPass
|
, runPass
|
||||||
, getPassState, setPassState, overPassState, viewPassState
|
, getPassState, setPassState, mapPassState, overPassState, viewPassState
|
||||||
, registerName, registerNewName, genName, genTypeRef, genVarRef
|
, registerName, registerNewName, genName, genTypeRef, genVarRef
|
||||||
, warn, err, err'
|
, warn, err, err'
|
||||||
)
|
)
|
||||||
@@ -96,11 +96,16 @@ runPass s2 action =
|
|||||||
getPassState :: Compiler s s
|
getPassState :: Compiler s s
|
||||||
getPassState = Compiler (\ st -> return (st, view csPassState st))
|
getPassState = Compiler (\ st -> return (st, view csPassState st))
|
||||||
|
|
||||||
setPassState :: s -> Compiler s ()
|
setPassState :: Lens' s b -> b -> Compiler s ()
|
||||||
setPassState ps' = Compiler (\ st -> return (set csPassState ps' st, ()))
|
setPassState passLens v =
|
||||||
|
Compiler (\ st -> return (set (csPassState . passLens) v st, ()))
|
||||||
|
|
||||||
overPassState :: (s -> s) -> Compiler s ()
|
mapPassState :: (s -> s) -> Compiler s ()
|
||||||
overPassState f = Compiler (\ st -> return (over csPassState f st, ()))
|
mapPassState f = Compiler (\ st -> return (over csPassState f st, ()))
|
||||||
|
|
||||||
|
overPassState :: Lens' s b -> (b -> b) -> Compiler s ()
|
||||||
|
overPassState passLens f =
|
||||||
|
Compiler (\ st -> return (over (csPassState . passLens) f st, ()))
|
||||||
|
|
||||||
viewPassState :: Lens' s b -> Compiler s b
|
viewPassState :: Lens' s b -> Compiler s b
|
||||||
viewPassState l = Compiler (\ st -> return (st, view (csPassState . l) st))
|
viewPassState l = Compiler (\ st -> return (st, view (csPassState . l) st))
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
{-# LANGUAGE TemplateHaskell #-}
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
module Bang.Syntax.ParserMonad(
|
module Bang.Syntax.ParserMonad(
|
||||||
Parser
|
Parser
|
||||||
, NameDatabase
|
|
||||||
, runParser
|
, runParser
|
||||||
, addFixities
|
, addFixities
|
||||||
, parseError
|
, parseError
|
||||||
@@ -10,16 +9,14 @@ module Bang.Syntax.ParserMonad(
|
|||||||
)
|
)
|
||||||
where
|
where
|
||||||
|
|
||||||
import Bang.AST.Name(Name, NameEnvironment(..))
|
|
||||||
import Bang.Monad(Compiler, err, runPass,
|
import Bang.Monad(Compiler, err, runPass,
|
||||||
getPassState, overPassState, viewPassState)
|
setPassState, overPassState, viewPassState)
|
||||||
import Bang.Syntax.Lexer(AlexReturn(..), AlexInput(..), alexScan)
|
import Bang.Syntax.Lexer(AlexReturn(..), AlexInput(..), alexScan)
|
||||||
import Bang.Syntax.Location(Location(..), Located(..),
|
import Bang.Syntax.Location(Location(..), Located(..),
|
||||||
Origin(..), initialPosition,
|
Origin(..), initialPosition,
|
||||||
advanceWith', locatedAt)
|
advanceWith', locatedAt)
|
||||||
import Bang.Syntax.ParserError(ParserError(..))
|
import Bang.Syntax.ParserError(ParserError(..))
|
||||||
import Bang.Syntax.Token(Token(..), Fixity)
|
import Bang.Syntax.Token(Token(..), Fixity)
|
||||||
import Control.Lens(view, set, over, _1)
|
|
||||||
import Control.Lens.TH(makeLenses)
|
import Control.Lens.TH(makeLenses)
|
||||||
import Control.Monad(forM_)
|
import Control.Monad(forM_)
|
||||||
import Data.Char(digitToInt, isSpace)
|
import Data.Char(digitToInt, isSpace)
|
||||||
@@ -28,11 +25,8 @@ import qualified Data.Map.Strict as Map
|
|||||||
import Data.Text.Lazy(Text)
|
import Data.Text.Lazy(Text)
|
||||||
import qualified Data.Text.Lazy as T
|
import qualified Data.Text.Lazy as T
|
||||||
|
|
||||||
type NameDatabase = Map (NameEnvironment, Text) Name
|
|
||||||
|
|
||||||
data ParserState = ParserState {
|
data ParserState = ParserState {
|
||||||
_psPrecTable :: Map Text Fixity
|
_psPrecTable :: Map Text Fixity
|
||||||
, _psNameDatabase :: Map (NameEnvironment, Text) Name
|
|
||||||
, _psOrigin :: Origin
|
, _psOrigin :: Origin
|
||||||
, _psLexerState :: AlexInput
|
, _psLexerState :: AlexInput
|
||||||
}
|
}
|
||||||
@@ -41,12 +35,11 @@ makeLenses ''ParserState
|
|||||||
|
|
||||||
type Parser a = Compiler ParserState a
|
type Parser a = Compiler ParserState a
|
||||||
|
|
||||||
runParser :: Origin -> Text -> Parser a -> Compiler ps (NameDatabase, a)
|
runParser :: Origin -> Text -> Parser a -> Compiler ps a
|
||||||
runParser origin stream action =
|
runParser origin stream action = snd `fmap` runPass pstate action
|
||||||
over _1 (view psNameDatabase) `fmap` runPass pstate action
|
|
||||||
where
|
where
|
||||||
initInput = AlexInput initialPosition stream
|
initInput = AlexInput initialPosition stream
|
||||||
pstate = ParserState Map.empty Map.empty origin initInput
|
pstate = ParserState Map.empty origin initInput
|
||||||
|
|
||||||
-- -----------------------------------------------------------------------------
|
-- -----------------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -57,9 +50,7 @@ addFixities src fixityBuilder lval names =
|
|||||||
do value <- processInteger lval
|
do value <- processInteger lval
|
||||||
let fixity = fixityBuilder value
|
let fixity = fixityBuilder value
|
||||||
forM_ names $ \ tok ->
|
forM_ names $ \ tok ->
|
||||||
do state <- getPassState
|
overPassState psPrecTable (Map.insert (tokenName tok) fixity)
|
||||||
name <- forceNameDefined VarEnv src tok state
|
|
||||||
overPassState (over psPrecTable (Map.insert name fixity))
|
|
||||||
where
|
where
|
||||||
processInteger x =
|
processInteger x =
|
||||||
case x of
|
case x of
|
||||||
@@ -85,12 +76,6 @@ addFixities src fixityBuilder lval names =
|
|||||||
Located _ (OpIdent _ x) -> x
|
Located _ (OpIdent _ x) -> x
|
||||||
_ ->
|
_ ->
|
||||||
error "Internal error (tokenName in Parser.y)"
|
error "Internal error (tokenName in Parser.y)"
|
||||||
--
|
|
||||||
forceNameDefined env loc token state =
|
|
||||||
do let name = tokenName token
|
|
||||||
case Map.lookup (env, name) (view psNameDatabase state) of
|
|
||||||
Just _ -> return name
|
|
||||||
Nothing -> err (UnboundVariable loc name)
|
|
||||||
|
|
||||||
getFixities :: Parser (Map Text Fixity)
|
getFixities :: Parser (Map Text Fixity)
|
||||||
getFixities = viewPassState psPrecTable
|
getFixities = viewPassState psPrecTable
|
||||||
@@ -130,7 +115,7 @@ getLexerState :: Parser AlexInput
|
|||||||
getLexerState = viewPassState psLexerState
|
getLexerState = viewPassState psLexerState
|
||||||
|
|
||||||
setLexerState :: AlexInput -> Parser ()
|
setLexerState :: AlexInput -> Parser ()
|
||||||
setLexerState lst = overPassState (set psLexerState lst)
|
setLexerState = setPassState psLexerState
|
||||||
|
|
||||||
-- -----------------------------------------------------------------------------
|
-- -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
@@ -5,10 +5,9 @@ module Bang.TypeInfer(runTypeInference)
|
|||||||
|
|
||||||
import Bang.AST(Module)
|
import Bang.AST(Module)
|
||||||
import Bang.Monad(Compiler)
|
import Bang.Monad(Compiler)
|
||||||
import Bang.Syntax.ParserMonad(NameDatabase)
|
|
||||||
|
|
||||||
runTypeInference :: NameDatabase -> Module -> Compiler ps Module
|
runTypeInference :: Module -> Compiler ps Module
|
||||||
runTypeInference _ x = return x
|
runTypeInference x = return x
|
||||||
|
|
||||||
{- Better version
|
{- Better version
|
||||||
import Bang.Monad(Compiler, BangError(..), err,
|
import Bang.Monad(Compiler, BangError(..), err,
|
||||||
|
|||||||
@@ -11,12 +11,12 @@ import Text.PrettyPrint.Annotated(render)
|
|||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = getCommand >>= \ cmd ->
|
main = getCommand >>= \ cmd ->
|
||||||
case cmd of
|
case cmd of
|
||||||
Parse o -> do (_, mdl) <- runCompiler cmd o (\ r t -> runParser r t parseModule)
|
Parse o -> do mdl <- runCompiler cmd o (\ r t -> runParser r t parseModule)
|
||||||
putStrLn (render (ppModule mdl))
|
putStrLn (render (ppModule mdl))
|
||||||
TypeCheck o -> do mdl <- runCompiler cmd o (\ r t ->
|
TypeCheck o -> do mdl <- runCompiler cmd o (\ r t ->
|
||||||
do (ndb, mdl) <- runParser r t parseModule
|
do mdl <- runParser r t parseModule
|
||||||
mdl' <- runPostProcessor mdl
|
mdl' <- runPostProcessor mdl
|
||||||
runTypeInference ndb mdl')
|
runTypeInference mdl')
|
||||||
putStrLn (render (ppModule mdl))
|
putStrLn (render (ppModule mdl))
|
||||||
Help -> putStrLn helpString
|
Help -> putStrLn helpString
|
||||||
Version -> putStrLn ("Bang tool, version " ++ showVersion version)
|
Version -> putStrLn ("Bang tool, version " ++ showVersion version)
|
||||||
|
|||||||
Reference in New Issue
Block a user