簡體   English   中英

如何讓Parsec解析多個表達式

[英]How to Get Parsec to Parse Multiple Expressions

我正在按照這個方案解釋器教程: http//en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours/

但似乎無法弄清楚如何設置REPL或Parsec所以我可以具有解釋整個源文件的功能。 我想做的是能夠從REPL輸入這樣的東西:

:l ~/myscheme.scm

該文件將被解釋。 現在,它所做的就是解析一個表達式而忽略其余的表達式。 我可以看到為什么會這樣 - readExpr只讀取1個表達式。

解析器摘錄,整個代碼可以在這里找到: http//en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours/Parsing

 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"

REPL:

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"

非常感謝任何幫助!

如何parse (many parseExpr)而不是parse parseExpr

然后,您必須修改解釋器,以便它可以解釋表達式列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM