lang-0.2: Lang/Read.hs
-- Copyright (C) 2018 Zaoqi
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU Affero General Public License as published
-- by the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU Affero General Public License for more details.
-- You should have received a copy of the GNU Affero General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
module Lang.Read(讀) where
import Lang.Value
import Lang.Common
import Lang.Cast
import Mapping
type Env = Mapping String W物
讀 :: String -> Maybe (W物, String)
讀 xs = mapM 預 xs >>= r MappingNil
預 '\t'=Just ' '
預 '\r'=Just ' '
預 '\n'=Just ' '
預 '('=Just '('
預 ')'=Just ')'
預 ':'=Just ':'
預 ';'=Just ';'
預 '\''=Nothing
預 '`'=Nothing
預 '"'=Nothing
預 '!'=Just '!'
預 '?'=Just '?'
預 x=Just x
infixl 1 >?=
x >?= f = fmap f x
type RMap = Mapping String W物
type Reader x = RMap -> String -> Maybe (x, String)
r完 :: RMap -> String -> W物
r完 m xs = case r m xs of Just (x, "") -> x
-- 計劃建立一個新的Monad
r :: Reader W物
r m ('名':'(':xs) = r物列 m xs >?= \(xs, rs) -> (名 (建列 xs), rs)
r m ('(':xs) = r首尾 m xs
r m ('字':x:xs) = pure (字 x, xs)
r m ('周':xs) = r周 m xs
r m ('空':xs) = pure (空, xs)
r m ('陰':xs) = pure (陰, xs)
r m ('陽':xs) = pure (陽, xs)
r m ('映':xs) = r映 m xs
r m ('機':rs) = r機 (\x b -> 機 MappingNil x b) m rs
r m ('引':'機':rs) = r機 (\x b -> 引機 (機 MappingNil x b)) m rs
r m ('譯':'機':rs) = r機 (\x b -> 譯機 (機 MappingNil x b)) m rs
r m ('誤':'(':rs) = do
(x, ')':rs) <- r m rs
return (誤 x, rs)
r m ('構':'(':'(':rs) = do
(ns, rs) <- r物列 m rs
let n = 名 (建列 ns)
(_, '(':rs) <- r空 m rs
(x, ')':rs) <- r物列 m rs
return (構 n (建列 x), rs)
r m (' ':rs) = r m rs
r _ _ = Nothing
r映 :: Reader W物
r映 = error "WIP"
r周 :: Reader W物
r周 m xs = let (b, as, bs) = r甲 xs in
if b
then
let
m' = mappingSet m as x'
x = do
(x, ')':rs) <- r m' bs
return (x, rs)
x' = case x of Just (v, _) -> v -- 有Lazy,所以不會有error
in x
else (,) <$> mappingRef m as <*> pure bs
where
r甲 :: String -> (Bool, String, String)
r甲 ('(':xs) = (True, "", xs)
r甲 xs@(')':_) = (False, "", xs)
r甲 xs@(' ':_) = (False, "", xs)
r甲 (x:xs) = let (b, as, bs) = r甲 xs in (b, x:as, bs)
r甲 "" = (False, "", "")
r式 :: Reader String
r式 m ('名':'(':xs) = error "WIP"
r機 :: (X形 -> W物 -> a) -> Reader a
r機 re m rs = do
'(':rs <- return rs
(x, rs) <- r m rs
x <- 物To形 x
(b, ')':rs) <- r m rs
return (re x b, rs)
r空 :: Reader String
r空 m xs = pure $ rs "" xs
where
rs :: String -> String -> (String, String)
rs x "" = ("", x)
rs a (' ':xs) = rs (' ':a) xs
r物列 :: Reader (List W物)
r物列 = error "WIP"
r首尾 :: Reader W物
r首尾 = error "WIP"