Parsec不转到左边甚至解析失败

时间:2014-10-17 05:51:10

标签: haskell parsec

我正在使用示例https://github.com/JakeWheat/intro_to_parsing

学习parsec

随着代码的爆炸,结果总是“正确”

有人给我一些提示吗?

*Main> regularParse  parser4search "a"  
Loading package array-0.5.0.0 ... linking ... done.  
Loading package deepseq-1.3.0.2 ... linking ... done.  
Loading package bytestring-0.10.4.0 ... linking ... done.  
Loading package text-1.1.0.0 ... linking ... done.  
Loading package transformers-0.3.0.0 ... linking ... done.  
Loading package mtl-2.1.3.1 ... linking ... done.  
Loading package parsec-3.1.7 ... linking ... done.  
Right (Num *** Exception: Prelude.read: no parse  
*Main> regularParse  parser4search "1"  
Right (Num 1)  

=================

import Text.Parsec (parse,anyChar)
import Text.Parsec.String --(Parser)
import Text.Parsec.Char (oneOf, char, digit, satisfy,letter)
import Text.Parsec.Combinator (many1, choice, chainl1)
import Control.Applicative ((<|>), many)
import Control.Monad --(void)
import Data.Char --(isLetter, isDigit)


data SimpleExpr = Num Integer
             | Var String
             | Add SimpleExpr SimpleExpr
             | Parens SimpleExpr
             | Str [Char]
               deriving (Eq,Show)

regularParse p = parse p ""

parser4search:: Parser SimpleExpr
parser4search = do
    searchStr <- many digit
    return (Num (read searchStr))

2 个答案:

答案 0 :(得分:3)

many表示解析零个或多个项目。

many1表示解析一个或多个项目。

因此,many digit成功输入&#34; 1&#34;,&#34; 24&#34;或&#34;&#34;。

many1输入&#34; 1&#34;,&#34; 24&#34;成功,但是&#34;&#34;失败。听起来这就是你想要的。

您也可能希望查看eof,以便不允许使用未经过解析的内容。

答案 1 :(得分:1)

parsec没有给出错误(左值),因为解析“a”时没有错误。 many digit语句返回空字符串,以防它找不到任何整数字符。 要使代码工作,您需要处理空字符串。 例如。

parser4search:: Parser SimpleExpr
parser4search = do
    searchStr <- many digit
    if searchStr == [] 
    then return (Num 0) 
    else return (Num (read searchStr))