组合子 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)的更多相关文章

  1. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  2. Haskell语言学习笔记(79)lambda演算

    lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...

  3. Haskell语言学习笔记(69)Yesod

    Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...

  4. Haskell语言学习笔记(20)IORef, STRef

    IORef 一个在IO monad中使用变量的类型. 函数 参数 功能 newIORef 值 新建带初值的引用 readIORef 引用 读取引用的值 writeIORef 引用和值 设置引用的值 m ...

  5. Haskell语言学习笔记(39)Category

    Category class Category cat where id :: cat a a (.) :: cat b c -> cat a b -> cat a c instance ...

  6. Haskell语言学习笔记(41)Parsec(1)

    Parsec Parsec是一个词法及语法分析器. 匹配字符与字符串 Prelude Text.Parsec> parseTest anyChar "a" 'a' Prelu ...

  7. Haskell语言学习笔记(57)Parsec(4)

    Parser 类型 data ParsecT s u m a type Parsec s u = ParsecT s u Identity type Parser = Parsec String () ...

  8. Haskell语言学习笔记(46)Parsec(3)

    Applicative Parsing 使用 Applicative 式的 Parser. 包括使用 (<$>), (<*>), (<$), (<*), (*> ...

  9. Haskell语言学习笔记(72)Free Monad

    安装 free 包 $ cabal install free Installed free-5.0.2 Free Monad data Free f a = Pure a | Free (f (Fre ...

随机推荐

  1. MySQL中drop,truncate 和delete的区别

    注意:这里说的delete是指不带where子句的delete语句 相同点: truncate和不带where子句的delete, 以及drop都会删除表内的数据 不同点: truncate和 del ...

  2. Java数组初始

    首先要清楚数组变量与数组对象的概念.数组变量是一个引用变量,可以指向数组对象. int[] a = new int[]{7, 8, 9};        a是数组变量,指向有new创建的数组对象. 数 ...

  3. Spring Cloud 入门 之 Zuul 篇(五)

    原文地址:Spring Cloud 入门 之 Zuul 篇(五) 博客地址:http://www.extlight.com 一.前言 随着业务的扩展,微服务会不对增加,相应的其对外开放的 API 接口 ...

  4. GitHub10岁之际HanLP自然语言处理包用户量跃居榜首

    在本周,GitHub终于度过了属于它自己的十周岁生日.这个在2008年由3个来自旧金山的年轻人创建的基于Git的代码托管网站,先后超越了元老级的SourceForge和背景强大的Google Code ...

  5. 禁止Grid、TreeGrid列排序和列菜单

    Ext的Grid和Treegrid默认提供列菜单的功能,在列菜单中可以进行排序以及控制列显示状态. 在实际项目中,往往有些列是不需要用户看到的,因此就必须屏蔽列菜单的功能. 1.屏蔽Grid,包括Ed ...

  6. string截断

    public static string GetFirstString(string stringToSub, int length)         {            Regex regex ...

  7. 关于attr("checked")的输出

    同样的一段代码,在不同的文件输出不同的答案,好神奇. console.log($("#never").attr("checked")); 一个输出checked ...

  8. jstack 查看线程状态

    使用jstack pid命令可以查看JVM的线程状态,其中值得关注的线程状态有:死锁,Deadlock(重点关注)执行中,Runnable等待资源,Waiting on condition(重点关注) ...

  9. 编译遇到make mrmroper问题

    ]: Entering directory `/home/share/project/ql-ol-sdk/ql-ol-kernel' ]: Entering directory `/home/shar ...

  10. Unity的JIT和AOT实现

    https://myhloli.com/about-il2cpp.html JIT方式: Unity的跨平台技术是通过一个Mono虚拟机实现的.而这个虚拟机更新太慢,不能很好地适应众多的平台. And ...