Haskell语言学习笔记(43)Parsec(2)
组合子 1
Prelude Text.Parsec Text.Parsec.String> parseTest (count 3 (char 'a')) "aaa"
"aaa"
Prelude Text.Parsec Text.Parsec.String> parseTest (between (char '(') (char ')') anyChar) "(3)"
'3'
Prelude Text.Parsec Text.Parsec.String> parseTest (option ' ' (char 'a')) "b"
' '
Prelude Text.Parsec Text.Parsec.String> parseTest (optionMaybe (char 'a')) "b"
Nothing
Prelude Text.Parsec Text.Parsec.String> parseTest (optionMaybe (char 'b')) "b"
(Just 'b')
Prelude Text.Parsec Text.Parsec.String> parseTest ((,) <$> optional (char 'a') <*> getInput) "b"
((),"b")
Prelude Text.Parsec Text.Parsec.String> parseTest ((,) <$> optional (char 'a') <*> getInput) "a"
((),"")
Prelude Text.Parsec Text.Parsec.String> parseTest (optional (string "ab")) "a"
parse error at (line 1, column 1):
unexpected end of input
expecting "ab"
- count n p 匹配 p 指定(n)次数
- between open close p依次匹配 open p close,但是只返回 p。
- option x p 尝试匹配 p,失败时返回 x。
- optionMaybe p 尝试匹配 p,失败时返回 Nothing,成功时返回 Just p。
- optional p 尝试匹配 p,失败时不消耗输入。输入不够时出错。不出错时返回空。
- (,) <$> p <*> getInput 匹配 p,然后用 (,) 运算符连接匹配的结果和剩余的输入。
这里 getInput 函数返回之前匹配完成之后剩余的输入。
组合子 2
Prelude Text.Parsec Text.Parsec.String> parseTest ((,) <$> skipMany1 (char 'a') <*> getInput) "aab"
((),"b")
Prelude Text.Parsec Text.Parsec.String> parseTest (sepBy (char 'a') (char ',')) "a"
"a"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepBy (char 'a') (char ',')) "a,a,a"
"aaa"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepBy (char 'a') (char ',')) ""
""
Prelude Text.Parsec Text.Parsec.String> parseTest (sepBy (char 'a') (char ',')) "a,"
parse error at (line 1, column 3):
unexpected end of input
expecting "a"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepBy1 (char 'a') (char ',')) ""
parse error at (line 1, column 1):
unexpected end of input
expecting "a"
Prelude Text.Parsec Text.Parsec.String> parseTest (endBy (char 'a') (char ',')) "a,"
"a"
Prelude Text.Parsec Text.Parsec.String> parseTest (endBy (char 'a') (char ',')) "a,a,"
"aa"
Prelude Text.Parsec Text.Parsec.String> parseTest (endBy (char 'a') (char ',')) ""
""
Prelude Text.Parsec Text.Parsec.String> parseTest (endBy (char 'a') (char ',')) "a,a"
parse error at (line 1, column 4):
unexpected end of input
expecting ","
Prelude Text.Parsec Text.Parsec.String> parseTest (endBy1 (char 'a') (char ',')) ""
parse error at (line 1, column 1):
unexpected end of input
expecting "a"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepEndBy (char 'a') (char ',')) "a"
"a"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepEndBy (char 'a') (char ',')) "a,"
"a"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepEndBy (char 'a') (char ',')) "a,a"
"aa"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepEndBy (char 'a') (char ',')) "a,a,"
"aa"
Prelude Text.Parsec Text.Parsec.String> parseTest (sepEndBy (char 'a') (char ',')) ""
""
Prelude Text.Parsec Text.Parsec.String> parseTest (sepEndBy1 (char 'a') (char ',')) ""
parse error at (line 1, column 1):
unexpected end of input
expecting "a"
- skipMany1 p 尝试匹配并跳过 p 1次或多次,返回空。
- sepBy p sep 尝试匹配0次或多次以 sep 分隔的 p 的序列(只能以 p 结尾),返回 p 的 list。
sepBy1 p sep 是1次以上的版本。 - endBy p sep 尝试匹配0次或多次以 sep 分隔的 p 的序列(只能以 sep 结尾),返回 p 的 list。
endBy1 p sep 是1次以上的版本。 - sepEndBy p sep 尝试匹配0次或多次以 sep 分隔的 p 的序列(p 或 sep 结尾均可),返回 p 的 list。
sepEndBy1 p sep 是1次以上的版本。
组合子 3
Prelude Text.Parsec Text.Parsec.String> parseTest eof ""
()
Prelude Text.Parsec Text.Parsec.String> parseTest eof "a"
parse error at (line 1, column 1):
unexpected 'a'
expecting end of input
Prelude Text.Parsec Text.Parsec.String> parseTest (notFollowedBy (char 'a')) "ab"
parse error at (line 1, column 2):
unexpected 'a'
Prelude Text.Parsec Text.Parsec.String> parseTest ((,) <$> notFollowedBy (char 'a') <*> getInput) "ba"
((),"ba")
Prelude Text.Parsec Text.Parsec.String> parseTest (manyTill (char 'a') (char 'b')) "aab"
"aa"
Prelude Text.Parsec Text.Parsec.String> parseTest (manyTill (char 'a') (char 'b')) "aac"
parse error at (line 1, column 3):
unexpected "c"
expecting "b" or "a"
Prelude Text.Parsec Text.Parsec.String> parseTest ((,) <$> lookAhead (char 'a') <*> getInput) "ab"
('a',"ab")
Prelude Text.Parsec Text.Parsec.String> parseTest (lookAhead (char 'a')) "ba"
parse error at (line 1, column 1):
unexpected "b"
expecting "a"
Prelude Text.Parsec Text.Parsec.String> parseTest anyToken "ab"
'a'
- eof 匹配结尾
- notFollowedBy p 仅当 p 匹配失败时成功。
- manyTill p end 匹配0次或多次 p,直到匹配 end 成功。返回 p 的 list。
- lookAhead p 尝试匹配 p,但是不消耗输入。
- anyToken 匹配任何一个 token。
参考链接
Intro to Parsing with Parsec in Haskell
Haskell语言学习笔记(43)Parsec(2)的更多相关文章
- Haskell语言学习笔记(88)语言扩展(1)
ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...
- Haskell语言学习笔记(79)lambda演算
lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...
- Haskell语言学习笔记(69)Yesod
Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...
- Haskell语言学习笔记(20)IORef, STRef
IORef 一个在IO monad中使用变量的类型. 函数 参数 功能 newIORef 值 新建带初值的引用 readIORef 引用 读取引用的值 writeIORef 引用和值 设置引用的值 m ...
- Haskell语言学习笔记(39)Category
Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...
- Haskell语言学习笔记(41)Parsec(1)
Parsec Parsec是一个词法及语法分析器. 匹配字符与字符串 Prelude Text.Parsec> parseTest anyChar "a" 'a' Prelu ...
- Haskell语言学习笔记(57)Parsec(4)
Parser 类型 data ParsecT s u m a type Parsec s u = ParsecT s u Identity type Parser = Parsec String () ...
- Haskell语言学习笔记(46)Parsec(3)
Applicative Parsing 使用 Applicative 式的 Parser. 包括使用 (<$>), (<*>), (<$), (<*), (*> ...
- Haskell语言学习笔记(72)Free Monad
安装 free 包 $ cabal install free Installed free-5.0.2 Free Monad data Free f a = Pure a | Free (f (Fre ...
随机推荐
- vue 文件中的注释
在每个代码块内,注释的时候,需要使用各自语言的注释语法去注释(HTML.CSS.JavaScript.Jade 等).在文件最顶部注释的时候用HTML的注释语法:<!- 在这里写注释的内容 -- ...
- RabbitMQ-官方指南-RabbitMQ配置
原文:http://www.rabbitmq.com/configure.html RabbitMQ 提供了三种方式来定制服务器: 环境变量 定义端口,文件位置和名称(接受shell输入,或者在环境配 ...
- POJ2584 T-Shirt Gumbo——网络最大流模板
题目:http://poj.org/problem?id=2584 像模板一样的简单题.继续使用 & 的当前弧优化和神奇的构造函数. #include<iostream> #inc ...
- 【Spring学习笔记-MVC-8.1】SpringMVC之类型转换@initBinder
作者:ssslinppp 1. 摘要 类型转换器常用于转换double.float.date等类型. 上文讲解了Converter类型转换器,这属于Spring 3新支持的类型转换器: 本 ...
- Nginx+tomcat+redis实现session共享
Nginx+tomcat+redis实现session共享 1,安装nginx,使用yum -y install nginx 这是epel源中的,需要安装epel源. 2,配置nginx. 在ngin ...
- 自定义动画animate()
在上一节总结了一下3中类型的动画,其中show()和hide()方法会同时修改元素的多个属性,fadeOut()和fadeIn()方法只会修改元素的不透明度,而slideDown()和slideUp( ...
- Redis:Redis
ylbtech-Redis:Redis 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 9.返回顶部 ...
- Microsoft Enterprise Library
http://entlib.codeplex.com/ 微软企业库 现在已经到到6版本了 2013年更新的. https://www.microsoft.com/en-us/download/conf ...
- php for 循环使用实例介绍
for 循环用于您预先知道脚本需要运行的次数的情况. 语法 for (初始值; 条件; 增量) { 要执行的代码; } 参数: 初始值:主要是初始化一个变量值,用于设置一个计数器(但可以是任何在循环的 ...
- ElasticSearch 索引模块——全文检索
curl -XPOST http://master:9200/djt/user/3/_update -d '{"doc":{"name":"我们是中国 ...