- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用Advent of Code part 16作为学习如何使用秒差距的借口,但我在如何处理这个特定情况上遇到了困难。
输入的格式如下:
Before: [3, 2, 3, 0]
2 3 1 1
After: [3, 2, 3, 0]
Before: [1, 0, 2, 1]
7 0 1 1
After: [1, 1, 2, 1]
...
Before: [0, 0, 2, 1]
6 2 3 1
After: [0, 6, 2, 1]
5 0 2 3
5 1 3 1
...
5 3 2 2
换句话说,首先是许多组三行解析成一个结构,由空行分隔,然后是三个空行,然后是许多四位数字的行。
我为每个结构都有工作解析器 - Sample
和 MaskedOperation
,以及解析器 sample
和 maskedOp
分别1 - 但我不知道如何将它们放在一起以将其解析为 ([Sample], [MaskedOperation])
。
我尝试了以下方法:
parseInput :: GenParser Char st ([Sample], [MaskedOperation])
parseInput = do
samples <- sample `sepBy` (count 2 newline) <* count 3 newline
operations <- maskedOp `sepBy` newline
return (samples, operations)
但是当它到达三个换行符时失败,需要另一个样本:
(line 3221, column 1):
unexpected "\n"
expecting "Before:"
我如何告诉parsec我想获取尽可能多的数据,然后使用分隔符(额外的换行符),然后开始读取其他内容?
1 阅读“代码出现”问题了解上下文;名称并不重要。
最佳答案
恐怕您不能在这里使用sepBy
。
让我们将其简化为将“a”解析为样本,将“b”解析为换行符。您将像这样解析字符串
a b b a b b b c b c b c b
那么解析器在遍历这样的字符串时会怎么想呢?让我们看一下:
Parsing
a
or an empty sequence
[a] b b a b b b c b c b c b
Oh, an
a
. The sequence is non empty, so I will parsemany
"bb" >> "a"
from now.
a [b b a] b b b c b c b c b
Success! Let's get some more or finish
a b b a [b b] b c b c b c b
Okay, I have found another
bb
, so the sequence continues. Parsinga
a b b a b b [b] c b c b c b
wat
问题是解析器不会回滚,除非明确要求这样做。要赋予解析器回滚能力,您必须使用 try
组合器对其进行标记,否则它将无法“取消消耗”已消耗的输入。
目前,我没有看到比重写 sepBy 组合器更好的方法,以使其意识到在解析每个分隔符后,如果解析 separator ,可能需要将其返回到缓冲区>> 目标
失败:
sepTry a sep = sepTry1 a sep <|> pure []
sepTry1 a sep = liftA2 (:) a (many (try $ sep *> a))
请注意,解析 a
必须包含在 try
部分 - 这是实际触发失败的地方。
为了可视化差异,让我们看看相同的场景,但使用 sepTry
代替:
...
a [b b a] b b b c b c b c b
Success! Let's try to get one more if possible
a b b a ![b b] b c b c b c b
Okay, I have found another
bb
, so the sequence continues. Parsinga
a b b a !b b [b] c b c b c b
Not what I expected. Return failure and move cursor to back exclamation mark.
a b b a ![]b b b c b c b c b
Failed parsing
bba
, parsing sequence finished. Parsebbb
a b b a [b b b] c b c b c b
Success!
在您的情况下,在每个 Sample
之后,此解析器将尝试读取 2 个换行符,后面带有 Sample
,或者如果失败,则读取 3 个换行符并继续 MaskedOperation
s
关于Haskell Parsec - 解析两个内容列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54335403/
Haskell Parsec 的 indents 包提供了一种解析缩进式语言(如 Haskell 和 Python)的方法。它重新定义了 Parser类型,那么如何使用 Parsec 的 Text.P
我有一个用 Text 编写的解析器作为流类型,而默认为 Text.Parsec.String模块使用 String除此以外。 如何在 Parsec Text b c 的上下文中使用自定义编写的解析器
Text Text.Parsec Text.Parsec.ByteString Text.Parsec.ByteString.Lazy
我在弄清楚如何使用 Text.Parsec.Indent 中的任何功能时遇到问题 indents 提供的模块Haskell 的包,它是 Parsec 的一种附加组件。 所有这些功能有什么作用?它们将如
Text Text.Parsec Text.Parsec.ByteString Text.Parsec.ByteString.Lazy
我目前正在尝试使用现实世界 Haskell 中提供的完整 CSV 解析器。为了我尝试修改代码以使用 ByteString 而不是 String,但是有一个 string 组合器仅适用于 字符串。 是否
我正在尝试解析嵌套的类 C block 注释 import Text.ParserCombinators.Parsec import Control.Monad (liftM) flat :: Mon
如果违反语义规则,使用 Parsec 如何在特定位置指示错误。我知道通常我们不想做这样的事情,但考虑一下示例语法。 ::= | ... ::= a positive integer power
我目前正在尝试使用 Parsec 在 Haskell 中设计一个解析器。声明类型的语法应如下所示: Fruit is a Apple 类型也应该能够有参数: Fruit a b is a Apple
我写了这样的排列解析例子: data Entry = Entry { first_name :: String , last_name :: String , date_of_birt
我正在尝试解析(目前)Dot 语言的一个子集。 语法是here我的代码如下 import System.Environment import System.IO import qualified Te
我有一个列表,我需要解析除最后一个元素之外的所有元素都需要由一个解析器解析,最后一个元素需要由另一个解析器解析。 a = "p1 p1b ... p2" or a = "p2" 原来我试过 parse
我需要为一种编程语言创建一个解析器。到目前为止,它已经完成了 95%,我想说,除了一个小细节。 用这种语言编写的程序具有以下结构: outputs inputs expressions 要求是输出不能
在我的工作中,我遇到了很多粗糙的 sql,我有一个聪明的想法,那就是编写一个程序来解析 sql 并整齐地打印出来。我很快就完成了大部分工作,但遇到了一个我不知道如何解决的问题。 所以让我们假设 sql
我正在编写一种使用 Parsec 进行解析的编程语言。为了报告错误消息,我使用 getPosition 将语法树的每个元素都标记了其源位置。函数来自 the Pos module 秒差距。 但是,它只
我正在尝试使用 parsec 解析如下表达式: f a b c => (Appl (Appl (Appl f a) b) c) 我尝试使用以下内容: appl :: Parser Expr appl
是否有可能以某种方式获得某些自定义类型的解析错误?例如,从错误中获取更多关于解析上下文的信息会很酷。而且仅以短信的形式提供错误信息似乎不太方便。 最佳答案 正如 Rhymoid 所观察到的,不幸的是,
我对 Parsec 的一个常见问题是,如果无效输入出现在“正确”的位置,它往往会忽略它。 作为一个具体的例子,假设我们有 integer :: Parser Int ,我写 expression =
我正在使用 Parsec 解析表达式,并且我想使用 Parsec 中的用户状态来跟踪这些表达式中的变量。不幸的是,我真的不知道该怎么做。 给定以下代码: import Data.Set as Set
我正在尝试编写一个 Haksell Parsec Parser,它将文件中的输入数据解析为 LogLine 数据类型,如下所示: --Final parser that holds the indvi
我是一名优秀的程序员,十分优秀!