diff --git "a/samples/\343\200\214\343\200\215\347\244\272\344\276\213.\345\205\245" "b/samples/\343\200\214\343\200\215\347\244\272\344\276\213.\345\205\245" new file mode 100644 index 0000000..5d4d638 --- /dev/null +++ "b/samples/\343\200\214\343\200\215\347\244\272\344\276\213.\345\205\245" @@ -0,0 +1,4 @@ +引「./libru/列.入」 + +以串为“你好,入语言!” +则串之「串印」 diff --git a/src/Interp.hs b/src/Interp.hs index 69dd821..668efb1 100644 --- a/src/Interp.hs +++ b/src/Interp.hs @@ -31,7 +31,10 @@ data InterpError deriving (Show) removeHeadTail :: String -> String -removeHeadTail str = Prelude.filter (/='】') (Prelude.filter (/='【') str) +removeHeadTail = Prelude.filter (/='】') . + Prelude.filter (/='」') . + Prelude.filter (/='【') . + Prelude.filter (/='「') interp :: InterpEnv -> Expr -> ExceptT InterpError IO Atom interp env (ExprValue val) = @@ -71,4 +74,4 @@ interp env (ExprInclude var expr) = do Right exp -> interp env $ injectHostFunctions hostFuncs exp runInterp :: Expr -> IO (Either InterpError Atom) -runInterp expr = runExceptT $ interp M.empty expr \ No newline at end of file +runInterp expr = runExceptT $ interp M.empty expr diff --git a/src/MonadicParse.hs b/src/MonadicParse.hs index ab19bd4..affffc3 100644 --- a/src/MonadicParse.hs +++ b/src/MonadicParse.hs @@ -9,7 +9,7 @@ import Text.Parsec.Language (haskellDef) import Text.Parsec.String (parseFromFile) ruChar :: Parsec String st Char -ruChar = noneOf "令时入之取者也以为并否则即元引【】" +ruChar = noneOf "令时入之取者也以为并否则即元引【】「」" ruWhiteSpace :: Parsec String st Char ruWhiteSpace = oneOf " \t\n、,:!?得。" @@ -23,7 +23,9 @@ concatParser [s] = s concatParser (s:xs) = fmap (++) s <*> concatParser xs variable :: Parsec String st AST.Variable -variable = try ( concatParser [ruString "【", many (noneOf "】"), ruString "】"] ) +variable = try ( concatParser [(try (ruString "「") >> pure "【") <|> try (ruString "【"), + many (noneOf "】」"), + (try (ruString "」") >> pure "】") <|> try (ruString "】")] ) <|> count 1 (ruChar) lexer = P.makeTokenParser haskellDef