2014-06-05 67 views
0

這是我的代碼:parens解析問題。秒差距 - 哈斯克爾

expr :: Parser Integer 
expr = buildExpressionParser table factor <?> "expression" 

table :: [[ Operator Char st Integer ]] 
table = [ 
    [ op "*" (*) AssocLeft], 
    [ op "+" (+) AssocLeft] 
    ] 
    where 
    op s f assoc = Infix (do { string s ; return f }) assoc 

factor = do { char '(' ; x <- expr ; char ')' ; return x } 
    <|> number 
    <?> "simple expression" 


number :: Parser Integer 
number = do { ds <- many1 digit; return read(ds))) } <?> "number" 

這有這樣的表情完美的作品:(10 + 10)* 10 但是我有如下一個問題:10 +10) 這有返回一個解析錯誤(最後只有1個括號),但是它返回20.

如何解決這個問題?

謝謝!

回答

3

你需要使用eof分析器,以確保您已經閱讀了整個輸入:

myParser = do 
    parsed <- expr 
    eof 
    return parsed 

如果您在使用本Control.Applicative可以簡化爲:

myParser = expr <* eof 
+0

謝謝你真是太棒了! – Fabricio