问题标签 [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 投票
1 回答
156 浏览

haskell - 如何匹配 megaparsec 结果?

我用 megaparsec 写了一个小解析器:

wheresc和 symbol andsemiParser来自教程。现在我想处理我的结果,但出现类型错误:

所以,我的问题是:如果解析失败,我如何匹配String -> Either (ParseError (Token String) Dec) String并获取错误消息或结果?

我猜这个问题的一般形式是:模式匹配是如何工作的?而且我通常很困惑如何绑定 monad 的结果(例如Either在另一个 monad 中,例如IO(我想我必须进行模式匹配,然后将值提升到 monad 的上下文中)。

0 投票
2 回答
1232 浏览

haskell - Megaparsec:无法解析递归算术字符串

我正在使用 Megaparsec 开发一个小型解析器并尝试解析算术。

如果我运行Parse arithParser "5*5" "5*5"它只是返回的命令Right (N 5),它应该返回的位置Mult(N 5) (N 5)。因为 arithParser 中的优先级。但是,如果我更改顺序,那么它似乎会进入无限循环并崩溃。

不知道我在这里做错了什么,任何帮助将不胜感激。

0 投票
1 回答
57 浏览

parsing - 使用 Parsec 编写一个新函数“parse :: String -> Stm”

我有一个课程要求我编写一个新函数 parse:: String -> Stm。Parsec 已经有一个 parse 函数,所以我应该导入合格的 parsec 以便 parse 返回我的包装函数。wrapper 函数需要将输入字符串解析为 Parsec 的 parse 函数,并从返回的 monad 中解包结果。这是我的包装函数的代码。如何确保在调用 parse 时,它​​返回我的包装函数。

0 投票
1 回答
195 浏览

parsing - 使用 Megaparsec 嵌套 sepBy 解析 EBNF

作为练习,我尝试使用 Megaparsec 解析 EBNF/ABNF 语法。我得到了一些琐碎的东西,比如终端和可选的工作,但我正在努力寻找替代品。使用此语法:

而这段代码:

我收到此错误:

我猜 AlternativeTerm 解析器在遇到无法解析的序列时不会返回到生产解析器,而是抛出错误。

我能做些什么呢?更改我的 EBNF 的 ADT,或者我应该以某种方式使解析变平。但话又说回来,我该怎么做呢?

0 投票
2 回答
190 浏览

haskell - 如何在 StateT 上使用 megaparsec 的组合器

我正在为大学项目构建一个 java 编译器,在我的项目中,我的解析器主要位于我们现在StateT (Scope,SymbolTable) String m a所处的范围(方法、类等)并保存到目前为止定义的符号。 ScopeSymbolTable

我想在这些解析器上使用 megaparsec 的组合器,因为parensbraces这不是问题,我只是使用mapStateT,但是对于sepBy其他人,我开发了这个函数:

现在f例如:

无论如何,我最近意识到上面的函数是错误的,该函数将运行解析器(封装在 中StateT)向它提供我们现在拥有的状态,s然后它将再次运行它,而不是向它提供第一次运行产生的新状态它会s一次又一次地喂它,然后......

如何使用 megaparsec 的组合器,例如sepBysepEndBy等等,以便我多次运行解析器,但将结果状态从第一个到第二个到第三个等链接起来?

0 投票
1 回答
351 浏览

haskell - megaparsec:如何声明 `eol` 的类型来解析文本而不是 [Char]

0 投票
1 回答
130 浏览

haskell - 如何编写一个不占用空间的解析器?

我正在编写一个程序来修改源代码文件。我需要解析文件(例如使用 megaparsec),修改其抽象语法树 AST(例如使用 Uniplate),并尽可能少地重新生成文件(例如保留空格、注释等)。

因此,AST 应该包含空格,例如:

其中第一个字符串是标识符的名称,第二个是它后面的空格。这同样适用于语言中的任何符号。

如何为 Identifier 编写解析器?

0 投票
0 回答
176 浏览

parsing - 解析错误的自动完成建议

我正在使用 megaparsec 为自定义 jupter 内核编写解析器。我也能够重新使用解析器来提供补全:从 megaparsec 库生成的自定义错误消息被转换为预期符号列表。这样,每当我更改解析器时,完成都会自动调整。这是伟大的。

我唯一苦苦挣扎的是如何从可选解析器中获取信息。说明我想要实现的目标的最小示例如下:

在第一种情况下,解析器失败,我从所有备选方案中获得了所有错误的列表。理想情况下,在第二种情况下,我也希望看到失败的可选解析器的错误。

这个例子可以通过删除option和创建两个分支来简单地解决<|>:一个有选项,另一个没有。然而在实际情况下,可选部分是一个由几个可选部分组成的排列解析器,所以这种技巧是不可行的。

0 投票
0 回答
381 浏览

haskell - 在 megaparsec 中解析“线拼接”(反斜杠后跟换行符)的优雅方式

对于一个小型编译器项目,我们目前正在为 C 的一个子集实现一个编译器,我们决定使用 Haskell 和 megaparsec。总的来说,我们取得了不错的进展,但仍有一些我们无法正确处理的极端情况。其中之一是处理反斜杠后跟换行符。引用规范:

每个反斜杠字符 () 的实例紧跟一个换行符被删除,拼接物理源代码行以形成逻辑源代码行。只有任何物理源行上的最后一个反斜杠才有资格成为此类接头的一部分。(§5.1.1.,ISO/IEC9899:201x)

到目前为止,我们提出了两种可能的方法来解决这个问题:

1.) 实施一个预词法分析阶段,在该阶段中,初始输入被复制并且每次出现的\\\n都被删除。我们在这种方法中看到的最大缺点是我们丢失了我们需要的准确错误位置。

2.) 实现一个特殊的char'组合器,它的行为类似于char但看起来前面有一个额外的字符,并且会默默地消耗任何\\\n. 这会给我们正确的位置。这里的缺点是我们需要在任何解析器中替换每个出现的charwith char',即使是在 megaparsec 提供的像string,integerwhitespace...

很可能我们不是第一个尝试使用 parsec/megaparsec 来解析具有这种“怪癖”的语言的人,所以我可以想象有一些更好的方法可以做到这一点。有人有想法吗?

0 投票
4 回答
335 浏览

parsing - 解析可选递归解析器以无限递归运行

我目前正在为 ECMAScript 5 编写解析器(作为玩具)。该标准规定了如何解析逻辑或表达式:

基本上这相当于

<logicalOrExpression> = [<logicalOrExpression> ||] <LogicalAndExpression>

但是我应该如何在不陷入无限循环的情况下解析它?我当前的解析器显然可以:

谢谢