10得票2回答
Parsec函数'parse'和类'Stream'的类型签名

在下面的类型声明中,约束条件 (Stream s Identity t) 是什么意思? parse :: (Stream s Identity t) => Parsec s () a -> SourceName -> s -> Either ParseError ...

10得票1回答
如何以贪心方式使用Parsec?

在我的工作中,我遇到了很多复杂的SQL语句,并且我想到写一个程序来解析SQL并将其清晰地打印出来。我完成了其中大部分,但是我遇到了一个问题,不知道该如何解决。 假设SQL查询是"select foo from bar where 1"。 我的想法是关键字总是后跟其数据,因此所有我要做的就是解...

10得票2回答
Haskell解析器组合子

我正在阅读关于Haskell Parser Combinators的内容,发现有很多类似的话题: Parsec vs Yacc/Bison/Antlr:为什么以及何时使用Parsec? 哪种Haskell解析技术最易于使用,为什么? Parsec或happy(带有alex)或uu-pars...

10得票1回答
Parsec和自定义解析错误类型

有没有可能以某种方式获取自定义类型的解析错误?例如,从错误中获取有关解析上下文的更多信息会很酷。仅以文本消息形式获得错误信息似乎不是很方便。

10得票3回答
如何使用parsec解析整数

我原本期望找到一个函数。 integer :: Stream s m Char => ParsecT s u m Integer 或者甚至可能 natural :: Stream s m Char => ParsecT s u m Integer 我在标准库中找不到一个...

10得票1回答
Parsec:如何获取表达式的起始和结束位置?

我正在编写一种使用 Parsec 进行解析的编程语言。为了报告错误信息,我已经标记了语法树中每个元素的源位置,在 Parsec 的 Pos 模块 中使用 getPosition 函数。 然而,该函数仅提供了我解析的每个表达式开头的位置信息,我希望获得其开始和结束位置,以便可以在源代码中突出显...

9得票2回答
为什么看起来Parsec的Choice运算符依赖于解析器的顺序?

我正在尝试解析一种非常简单的语言,它只包含十进制或二进制数字。例如,这里是一些有效的输入: #b1 #d1 #b0101 #d1234 我使用 Parsec 的选择运算符 <|> 遇到了问题。根据这个教程:48小时内写一个Scheme解析器: [选择运算符] 会尝试第一个...

9得票3回答
Parsec - 错误 "组合器'many'被应用于接受空字符串的解析器"

我正在尝试使用Parsec编写解析器,以解析文学化的Haskell文件,例如以下内容: The classic 'Hello, world' program. \begin{code} main = putStrLn "Hello, world" \end{code} More te...

9得票4回答
Parsec如何在字符串中查找“匹配项”

如何使用Parsec解析字符串中所有匹配的输入并丢弃其他部分? 例如:我有一个简单的数字解析器,如果我知道数字之间的分隔符,我就可以找到所有数字。 num :: Parser Int num = read <$> many digit parse (num `sepBy` s...

9得票1回答
Haskell parsec:在`optional`组合子内部使用`many`组合子

我希望使用Haskell的parsec库来实现这个语法规则: ((a | b | c)* (a | b))? 这是一个解析器规则,它接受一个可选的(即可能为空的)字符串。如果它所接受的字符串不为空,则可以通过零个或多个 a、b 或 c 解析器来消耗它,但最外层的 ? 可选解析器所接受的字...