Skip to content

Commit 647a937

Browse files
author
linerlock
committed
update Parser module
1 parent d877f6b commit 647a937

File tree

3 files changed

+44
-32
lines changed

3 files changed

+44
-32
lines changed

hs-src/Language/Egison.hs

+10-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ module Language.Egison
77
, counter --danger
88
, loadLibraries
99
, loadPrimitives
10+
, loadEgisonFile
11+
, loadEgisonLibrary
1012
, evalEgisonExpr
1113
, evalEgisonTopExpr
1214
, evalEgisonTopExprs
@@ -68,6 +70,12 @@ loadLibraries env = do
6870
loadPrimitives :: Env -> IO Env
6971
loadPrimitives env = (++) <$> return env <*> primitiveEnv
7072

73+
loadEgisonFile :: Env -> FilePath -> IO (Either EgisonError Env)
74+
loadEgisonFile env path = modifyCounter $ runEgisonM $ loadFile path >>= evalTopExprs env
75+
76+
loadEgisonLibrary :: Env -> FilePath -> IO (Either EgisonError Env)
77+
loadEgisonLibrary env path = modifyCounter $ runEgisonM $ loadLibraryFile path >>= evalTopExprs env
78+
7179
evalEgisonExpr :: Env -> EgisonExpr -> IO (Either EgisonError EgisonValue)
7280
evalEgisonExpr env expr = modifyCounter $ runEgisonM $ evalExpr' env expr
7381

@@ -78,10 +86,7 @@ evalEgisonTopExprs :: Env -> [EgisonTopExpr] -> IO (Either EgisonError Env)
7886
evalEgisonTopExprs env exprs = modifyCounter $ runEgisonM $ evalTopExprs env exprs
7987

8088
runEgisonTopExpr :: Env -> String -> IO (Either EgisonError Env)
81-
runEgisonTopExpr env input = modifyCounter $ runEgisonM $ liftEgisonM (readTopExpr input) >>= evalTopExpr env
89+
runEgisonTopExpr env input = modifyCounter $ runEgisonM $ readTopExpr input >>= evalTopExpr env
8290

8391
runEgisonTopExprs :: Env -> String -> IO (Either EgisonError Env)
84-
runEgisonTopExprs env input = modifyCounter $ runEgisonM $ liftEgisonM (readTopExprs input) >>= evalTopExprs env
85-
86-
87-
92+
runEgisonTopExprs env input = modifyCounter $ runEgisonM $ readTopExprs input >>= evalTopExprs env

hs-src/Language/Egison/Core.hs

-15
Original file line numberDiff line numberDiff line change
@@ -67,21 +67,6 @@ evalTopExpr env (Execute argv) = do
6767
evalTopExpr env (Load file) = loadLibraryFile file >>= evalTopExprs env
6868
evalTopExpr env (LoadFile file) = loadFile file >>= evalTopExprs env
6969

70-
loadFile :: FilePath -> EgisonM [EgisonTopExpr]
71-
loadFile file = do
72-
doesExist <- liftIO $ doesFileExist file
73-
unless doesExist $ throwError $ strMsg ("file does not exist: " ++ file)
74-
input <- liftIO $ readFile file
75-
exprs <- liftEgisonM $ readTopExprs input
76-
concat <$> mapM recursiveLoad exprs
77-
where
78-
recursiveLoad (Load file) = loadLibraryFile file
79-
recursiveLoad (LoadFile file) = loadFile file
80-
recursiveLoad expr = return [expr]
81-
82-
loadLibraryFile :: FilePath -> EgisonM [EgisonTopExpr]
83-
loadLibraryFile file = liftIO (getDataFileName file) >>= loadFile
84-
8570
evalExpr :: Env -> EgisonExpr -> EgisonM WHNFData
8671
evalExpr _ (CharExpr c) = return . Value $ Char c
8772
evalExpr _ (StringExpr s) = return . Value $ String s

hs-src/Language/Egison/Parser.hs

+34-12
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,28 @@ module Language.Egison.Parser
22
( readTopExprs
33
, readTopExpr
44
, readExprs
5-
, readExpr
5+
, readExpr
6+
, loadFile
7+
, loadLibraryFile
68
, parseTopExprs
79
, parseTopExpr
810
, parseExprs
911
, parseExpr ) where
1012

11-
import Control.Monad.Identity
12-
import Control.Monad.Error
13-
import Control.Monad.State
13+
import Prelude hiding (mapM)
14+
import Control.Monad.Identity hiding (mapM)
15+
import Control.Monad.Error hiding (mapM)
16+
import Control.Monad.State hiding (mapM)
1417
import Control.Applicative ((<$>), (<*>), (*>), (<*), pure)
1518

19+
import System.Directory (doesFileExist)
20+
1621
import qualified Data.Sequence as Sq
1722
import Data.Either
1823
import Data.Set (Set)
1924
import Data.Char (isLower, isUpper)
2025
import qualified Data.Set as Set
26+
import Data.Traversable (mapM)
2127

2228
import Data.ByteString.Lazy (ByteString)
2329
import Data.ByteString.Lazy.Char8 ()
@@ -29,24 +35,40 @@ import qualified Text.Parsec.Token as P
2935

3036
import Language.Egison.Types
3137
import Language.Egison.Desugar
38+
import Paths_egison (getDataFileName)
3239

3340
doParse :: Parser a -> String -> Either EgisonError a
3441
doParse p input = either (throwError . fromParsecError) return $ parse p "egison" $ B.pack input
3542
where
3643
fromParsecError :: ParseError -> EgisonError
3744
fromParsecError = Parser . show
3845

39-
readTopExprs :: String -> Fresh (Either EgisonError [EgisonTopExpr])
40-
readTopExprs = runDesugarM . either throwError (mapM desugarTopExpr) . parseTopExprs
46+
readTopExprs :: String -> EgisonM [EgisonTopExpr]
47+
readTopExprs = liftEgisonM . runDesugarM . either throwError (mapM desugarTopExpr) . parseTopExprs
48+
49+
readTopExpr :: String -> EgisonM EgisonTopExpr
50+
readTopExpr = liftEgisonM . runDesugarM . either throwError desugarTopExpr . parseTopExpr
4151

42-
readTopExpr :: String -> Fresh (Either EgisonError EgisonTopExpr)
43-
readTopExpr = runDesugarM . either throwError desugarTopExpr . parseTopExpr
52+
readExprs :: String -> EgisonM [EgisonExpr]
53+
readExprs = liftEgisonM . runDesugarM . either throwError (mapM desugar) . parseExprs
4454

45-
readExprs :: String -> Fresh (Either EgisonError [EgisonExpr])
46-
readExprs = runDesugarM . either throwError (mapM desugar) . parseExprs
55+
readExpr :: String -> EgisonM EgisonExpr
56+
readExpr = liftEgisonM . runDesugarM . either throwError desugar . parseExpr
57+
58+
loadFile :: FilePath -> EgisonM [EgisonTopExpr]
59+
loadFile file = do
60+
doesExist <- liftIO $ doesFileExist file
61+
unless doesExist $ throwError $ strMsg ("file does not exist: " ++ file)
62+
input <- liftIO $ readFile file
63+
exprs <- readTopExprs input
64+
concat <$> mapM recursiveLoad exprs
65+
where
66+
recursiveLoad (Load file) = loadLibraryFile file
67+
recursiveLoad (LoadFile file) = loadFile file
68+
recursiveLoad expr = return [expr]
4769

48-
readExpr :: String -> Fresh (Either EgisonError EgisonExpr)
49-
readExpr = runDesugarM . either throwError desugar . parseExpr
70+
loadLibraryFile :: FilePath -> EgisonM [EgisonTopExpr]
71+
loadLibraryFile file = liftIO (getDataFileName file) >>= loadFile
5072

5173
parseTopExprs :: String -> Either EgisonError [EgisonTopExpr]
5274
parseTopExprs = doParse $ whiteSpace >> endBy topExpr whiteSpace

0 commit comments

Comments
 (0)