我正在使用示例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))
答案 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))