问题标签 [megaparsec]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
402 浏览

haskell - 如何使用 megaparsec 正确解析缩进块?

我正在尝试制作一种基于缩进的编程语言,并且我正在尝试解析如下内容:

这里,本质上:表示一个新的缩进块的开始,所以expr1是完全不相关的,想法是:可以出现在行中的任何地方,并且必须是行的最后一个标记。

我得到了这个或多或少有效的代码:

但问题是,在示例中,只有块的第一个表达式被解析为适当的缩进,其他的必须更多缩进,像这样

0 投票
1 回答
65 浏览

haskell - 使用 megaparsec 链接一元运算符

我已经为一种非常简单的语言编写了一个使用 megaparsec 的解析器,该语言由整数文字和两个一元运算符“a”和“b”组成:

但是,这似乎不允许我“链接”一元运算符,即在尝试解析“ab1”时,我遇到了“意外的'b'”。这是为什么?

0 投票
0 回答
86 浏览

haskell - 我如何知道(mega)parsec 解析器是否可以在没有实验的情况下消耗输入 - 似乎没有记录

在 Parsec 或 Megaparsec 解析器中使用 <|> 组合器时,可能需要“尝试”来强制回溯,以防第一个解析器因消耗输入而失败。在 Parsec 中,我需要在解析字符串时使用“try”:

λ: parse (try (string "abc") <|> string "abd") "" "abd"

对“abd”

没有“try”,解析失败,因为第一个解析器消耗了“a”,只留下“bd”给第二个解析器,然后自然也会失败。

在 Megaparsec 中,不需要“尝试”:

λ:解析(字符串“abc”<|>字符串“abd”)“”“abd”

对“abd”

所以不知何故,在 Megaparsec 中,字符串解析器在失败时不会消耗输入。

我的问题是:

  1. 除了试验之外,我怎么会发现 Parsec 和 Megaparsec 之间的字符串解析器行为不同 - 我没有看到它记录在案?

  2. 如果解析器失败,我如何轻松(即,无需实验)一般地判断解析器是否使用输入?

谢谢你。

0 投票
1 回答
56 浏览

haskell - 使用 Megaparsec 解析数组 [1] [2] 时出现问题

我正在关注Megaparsec 文档来解析多维数组。

array[1][2]预计会被解析为

然而,它是

这里出了什么问题?

0 投票
1 回答
124 浏览

haskell - 使用 Megaparsec 解析时的运算符优先级问题

我正在用数组和结构解析类似 C 的语言。在 C 运算符优先级之后,. []具有相同的优先级。

解析时

它产生了, Access (Var "s") (ArrayIndex (Var "a") 1) 而不是 ArrayIndex (Access (Var "s") (Var "a")) 1 为什么?是不是因为 [] 没有被解析为 InfixL?

更新:将其更改

我有另一个错误

0 投票
2 回答
153 浏览

haskell - 为什么这个 Megaparsec 解析器可以在 GHCi 中工作,但不能在源文件中编译?

我是 Haskell 和 Megaparsec 库的初学者。在解析一行文本时,我需要解析行中剩余的文本,直到行尾(LF 或 CRLF)。我的想法是使用somenoneOf但即使在 GHCi 中测试后也无法编译代码,如下所示:

所以解析器(some (noneOf "\r\n"))编译成功并返回我所期望的:“一行文本”,不包括行尾字符。但是,我无法在源文件中编译以下代码

编译器给出以下错误:

我究竟做错了什么?源文件中的正确语法是什么?还是有更好的方法来解析剩余的文本,但不包括 LF 或 CRLF 结尾?我会很感激任何帮助,谢谢。

0 投票
0 回答
66 浏览

haskell - 如何使用 Megaparsec 检索评论?

我正在打印 AST 以格式化源文件,使用 Megaparsec 从中生成 AST。AST 中缺少注释,但我打算在重新格式化后保留它们。Megaparsec 中是否有一种方法可以获取所有注释(对于行注释和块注释),无论是在 AST 作为节点内部还是在外部单独作为Language.Haskell.Exts.Annotated完成的源信息注释?

0 投票
3 回答
244 浏览

parsing - 如何使嵌套的 megaparsec 解析器失败?

我陷入以下解析问题:

从有限的字符集中解析一些可能包含零个或多个元素的文本字符串,最多但不包括一组终止字符中的一个。内容/无内容应通过Maybe. 终止字符可能以转义形式出现在字符串中。解析应该在任何不可接受的字符上失败。

这就是我想出的(简化):

比如说,可接受的字符是大写 ASCII,转义是 '\',控制是 ':'。然后,以下内容正确解析:ABC\:D:EF到 yield ABC:DABC&D但是,不可接受的 parsing&确实会产生ABC,而我会期望出现错误消息。

两个问题:

  • 为什么fail结束解析而不是解析器失败?
  • 上述方法对解决问题是否明智,或者是否有“正确”的规范方法来解析我不知道的终止字符串?
0 投票
1 回答
101 浏览

haskell - 递归到 Haskell 中尚不存在的函数

我被困在用 Haskell 编写解析器的问题上,希望有人能提供帮助!

它比我通常的解析器要复杂一些,因为有两层解析。首先将语言定义解析为 AST,然后将该 AST 转换为解析实际语言的另一个解析器。

到目前为止,我已经取得了不错的进展,但我坚持在语言定义中实现递归。由于语言定义从 AST 转换为递归函数中的解析器,因此如果它还不存在,我无法弄清楚它如何调用自身。

我发现解释我的问题有点困难,所以也许举个例子会有所帮助。

语言定义可能定义一种语言由三个按顺序排列的关键字组成,然后是括号中的可选递归。

这将被解析为 AST,如:

这个Many例子并不是真正需要的,但在我的实际项目中,可选块中可以有多个语法元素,因此 anOptional将包含 aManyn 个元素。

然后我希望它被转换为解析字符串的解析器,例如:

我已将我的项目简化为最简单的示例。您可以看到我的 TODO 评论,我在尝试实现递归时遇到了困难。

我尝试过的几件事:

  1. 将原始 AST 传递给transformSyntaxExprToParser函数并createParserRecurse遇到令牌时调用。由于无限循环,这不起作用。
  2. 使用可变引用(如 IORef/STRef)传入一个引用,该引用在转换完成后更新为引用最终解析器。我不知道如何将 IO/ST monad 线程化到解析器转换函数中。
  3. 状态单子。我不知道如何通过 state monad 传递引用。

我希望这是有道理的,如果我需要详细说明,请告诉我。如果有帮助,我也可以推进我的整个项目。

谢谢阅读!

编辑:我对我的原始示例进行了更改,以在https://pastebin.com/DN0JJ9BA上演示无限循环问题(整合下面答案中的优秀建议)

0 投票
0 回答
125 浏览

parsing - 找不到模块“Text.Megaparsec.Char.Lexer”

我尝试了“stack install megaparsec”,在 project.yaml 文件中添加 megaparsec 和 parsec 作为依赖项并运行 stack build,我尝试在项目文件夹的所有级别上进行 stack build。另外奇怪的是,我可以加载包含被 VSCode 标记为问题的导入的模块并显示错误消息,我还可以运行所述模块中的函数,这些函数使我们可以使用导入的东西,但我无法编译文件。

ghci 版本是 9.0.1

堆栈版本是 2.7.3

阴谋集团版本:1.12

来自终端的错误消息

.cabal 文件