Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 如何让Parsec解析多个表达式_Parsing_Haskell - Fatal编程技术网

Parsing 如何让Parsec解析多个表达式

Parsing 如何让Parsec解析多个表达式,parsing,haskell,Parsing,Haskell,我将遵循此scheme解释器教程: 但是我似乎不知道如何设置REPL或Parsec,这样我就可以拥有解释整个源文件的功能。我想做的是能够从REPL中输入类似的内容: :l ~/myscheme.scm 文件将被解释。现在,它所做的只是解析一个表达式,而忽略其余的表达式。我可以理解为什么会这样——readExpr只读取1个表达式 解析器摘录,完整代码可在此处找到: parsexpr::Parser LispVal parsexpr=parseAtom 解析字符串 密码 被引用的 做字符'(' x

我将遵循此scheme解释器教程:

但是我似乎不知道如何设置REPL或Parsec,这样我就可以拥有解释整个源文件的功能。我想做的是能够从REPL中输入类似的内容:

:l ~/myscheme.scm
文件将被解释。现在,它所做的只是解析一个表达式,而忽略其余的表达式。我可以理解为什么会这样——readExpr只读取1个表达式

解析器摘录,完整代码可在此处找到:

parsexpr::Parser LispVal
parsexpr=parseAtom
解析字符串
密码
被引用的
做字符'('
x字符串
readExpr input=case parse parsexpr“lisp”输入
左错误->“不匹配:”++显示错误
右键-->“找到的值”
答复:

import System.IO
flushStr::String->IO()
flushStr str=putStr str>>hFlush stdout
readPrompt::String->IO字符串
readPrompt prompt=flushtr prompt>>getLine
evalString::String->IO String
evalString expr=返回$extractValue$traperor(liftM显示$readExpr expr>>=eval)
evalAndPrint::字符串->IO()
evalAndPrint expr=evalString expr>>=putStrLn
直到m=>(a->Bool)->ma->(a->m())->m()
直到_upredprompt action=do
结果>直到upred提示操作
runRepl::IO()
runRepl=直到(=“退出”)(readPrompt“Lisp>>>”)evalAndPrint
main::IO()
main=do args runRepl
1->evalAndPrint$args!!0
否则->putStrLn“程序只接受0或1个参数”
非常感谢您的帮助!

parse(多个parsexpr)
代替
parsexpr
怎么样


然后,您必须修改解释器,以便它能够解释表达式列表。

如果您希望使用
[Orther ParseError a]
而不是
Orther ParseError[a]
,该怎么办?
 parseExpr :: Parser LispVal
 parseExpr = parseAtom
         <|> parseString
         <|> parseNumber
         <|> parseQuoted
         <|> do char '('
                x <- try parseList <|> parseDottedList
                char ')'
                return x

 readExpr :: String -> String
 readExpr input = case parse parseExpr "lisp" input of
     Left err -> "No match: " ++ show err
     Right _ -> "Found value"
import System.IO

flushStr :: String -> IO ()
flushStr str = putStr str >> hFlush stdout

readPrompt :: String -> IO String
readPrompt prompt = flushStr prompt >> getLine

evalString :: String -> IO String
evalString expr = return $ extractValue $ trapError (liftM show $ readExpr expr >>= eval) 

evalAndPrint :: String -> IO ()
evalAndPrint expr =  evalString expr >>= putStrLn

until_ :: Monad m => (a -> Bool) -> m a -> (a -> m ()) -> m ()
until_ pred prompt action = do 
  result <- prompt
  if pred result 
     then return ()
     else action result >> until_ pred prompt action

runRepl :: IO ()
runRepl = until_ (== "quit") (readPrompt "Lisp>>> ") evalAndPrint

main :: IO ()
main = do args <- getArgs
          case length args of
              0 -> runRepl
              1 -> evalAndPrint $ args !! 0
              otherwise -> putStrLn "Program takes only 0 or 1 argument"