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