如何在 attoparsec 中使用带有结束字符的 sepBy?

克里斯·斯特里琴斯基

我正在尝试解析以下行:

ItemCount count@Int: You have purchased #{showInt count} #{plural count "item" "items"}

基本上我想得到:

  Message {
      key = "ItemCount",
      value = "You have purchased #{showInt count} #{plural count \"item\" \"items\"}.",
      parameters = [Parameter {name = "count", paramType = "Int"}]
      }

第一位ItemCount count@Int:可能是:

ItemCount:

或者

ItemCount count@Int count2@Int:

所以参数s 可能是零次或多次出现。我不确定如何检测:使用sepBy. 如果我使用 Parsec,我会考虑使用sepEndBy https://hackage.haskell.org/package/parsec-3.1.13.0/docs/Text-ParserCombinators-Parsec-Combinator.html#v:sepEndBy

我正在寻找,sepBy直到它看到:. 我想我可以先消耗所有内容:,然后运行parse消耗字符串的“内部” onn,但是处理所有失败情况(部分等)似乎很乏味,我认为必须有更好的方法。

这是我的代码:

import Control.Applicative
import Data.Attoparsec.Text
import Data.Text (Text)

data Parameter = Parameter { name :: Text, paramType :: Text } deriving (Eq, Show)
data Message = Message { key :: Text, value :: Text, parameters :: [Parameter] } deriving (Eq, Show)
data KeyAndParameters = KeyAndParameters Text [Parameter]

parseParameter :: Parser Parameter
parseParameter = do
  n <- takeWhile1 (notInClass "@")
  _ <- char '@'
  t <- takeWhile1 (const True)
  return $ Parameter { name = n, paramType = t }

parseKeyAndParameters :: Parser KeyAndParameters
parseKeyAndParameters = do
  keyV <- takeWhile1 (notInClass " :")
  params <- parseParameter `sepBy` (char ' ')
  return $ KeyAndParameters keyV params
克里斯·斯特里琴斯基

我想我对如何sepBy运作有了更好的理解本质上,您不必考虑“剩余”文本,因为使用 attoparsec,您不必在最后使用所有输出(与 Parsec 不同)。

例如1+2+3=6作为输入和以下内容给出:

parseExample :: Parser ([Text], Text)
parseExample = do
  numbers <- takeWhile1 (notInClass "=+") `sepBy` char '+'
  skip (== '=')
  total <- takeWhile1 (const True)
  return $ (numbers, total)

将返回: ( [ "1" , "2" , "3" ] , "6")

之后,skip (== '=')您可以以您选择的任何方式自由解析剩余的输入。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Attoparsec解析雅虎历史csv

来自分类Dev

Haskell:如何使用attoparsec以便从ByteString读取嵌套列表

来自分类Dev

Haskell:如何使用attoparsec以便从ByteString中读取嵌套列表

来自分类Dev

使用attoparsec解析IP地址

来自分类Dev

如何以不区分大小写的方式制作最新的Attoparsec匹配字符串?

来自分类Dev

如何以不区分大小写的方式制作最新的Attoparsec匹配字符串?

来自分类Dev

如何编写attoparsec的takeWhile1的更通用(但更有效)的版本?

来自分类Dev

带有aeson / attoparsec的导管,一旦源没有更多数据,如何无污染地干净退出

来自分类Dev

使用Attoparsec解析简单的分子名称

来自分类Dev

使用Attoparsec解析简单的分子名称

来自分类Dev

使用attoparsec解析逗号内的逗号分隔字符串

来自分类Dev

Attoparsec:跳过(但不包括)多字符定界符

来自分类Dev

解析不以attoparsec中的某些字符结尾的标识符

来自分类Dev

Data.Attoparsec.ByteString是否使用“零复制”?

来自分类Dev

attoparsec高内存使用率读取大文件

来自分类Dev

避免使用`sepBy`解析最后一个分隔符

来自分类Dev

Android如何在带有数据绑定的TextView中使用字符串变量

来自分类Dev

如何在Java中使用jsoup替换带有字符的html标签

来自分类Dev

如何在R中使用带有字符串的子集?

来自分类Dev

如何在 C# 中使用带有间隔字符串的 Select

来自分类Dev

如何在带有 int 的 if 语句中使用字符串?

来自分类Dev

在Haskell中使用parsec或attoparsec在两个字符串之间进行非贪婪匹配

来自分类Dev

我如何在字符串中使用br来正确显示带有html标签的字符串?

来自分类Dev

如何在带有Requirejs的Typescript中使用模块/类

来自分类Dev

如何在带有XIB的IB中使用UIContainerView?

来自分类Dev

如何在带有React的Rails中使用Jasmine?

来自分类Dev

如何在带有R的拦截的multinom()中使用预测?

来自分类Dev

如何在锈迹中使用带有#fold的Iterator的#map?

来自分类Dev

如何在Django中使用带有脆皮形式的CreateView

Related 相关文章

  1. 1

    如何使用Attoparsec解析雅虎历史csv

  2. 2

    Haskell:如何使用attoparsec以便从ByteString读取嵌套列表

  3. 3

    Haskell:如何使用attoparsec以便从ByteString中读取嵌套列表

  4. 4

    使用attoparsec解析IP地址

  5. 5

    如何以不区分大小写的方式制作最新的Attoparsec匹配字符串?

  6. 6

    如何以不区分大小写的方式制作最新的Attoparsec匹配字符串?

  7. 7

    如何编写attoparsec的takeWhile1的更通用(但更有效)的版本?

  8. 8

    带有aeson / attoparsec的导管,一旦源没有更多数据,如何无污染地干净退出

  9. 9

    使用Attoparsec解析简单的分子名称

  10. 10

    使用Attoparsec解析简单的分子名称

  11. 11

    使用attoparsec解析逗号内的逗号分隔字符串

  12. 12

    Attoparsec:跳过(但不包括)多字符定界符

  13. 13

    解析不以attoparsec中的某些字符结尾的标识符

  14. 14

    Data.Attoparsec.ByteString是否使用“零复制”?

  15. 15

    attoparsec高内存使用率读取大文件

  16. 16

    避免使用`sepBy`解析最后一个分隔符

  17. 17

    Android如何在带有数据绑定的TextView中使用字符串变量

  18. 18

    如何在Java中使用jsoup替换带有字符的html标签

  19. 19

    如何在R中使用带有字符串的子集?

  20. 20

    如何在 C# 中使用带有间隔字符串的 Select

  21. 21

    如何在带有 int 的 if 语句中使用字符串?

  22. 22

    在Haskell中使用parsec或attoparsec在两个字符串之间进行非贪婪匹配

  23. 23

    我如何在字符串中使用br来正确显示带有html标签的字符串?

  24. 24

    如何在带有Requirejs的Typescript中使用模块/类

  25. 25

    如何在带有XIB的IB中使用UIContainerView?

  26. 26

    如何在带有React的Rails中使用Jasmine?

  27. 27

    如何在带有R的拦截的multinom()中使用预测?

  28. 28

    如何在锈迹中使用带有#fold的Iterator的#map?

  29. 29

    如何在Django中使用带有脆皮形式的CreateView

热门标签

归档