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

haskell - 用于类似 Haskell 的表达式语法的解析器库

我想扩展一种玩具函数式编程语言来接受类似 Haskell 的中缀运算符。以下是我感兴趣的特征:

  • Parser 会动态更新自身以接受新定义的运算符。
  • 中缀运算符可以转换为括号中的函数。
  • 函数可以转换为在坟墓中围绕它们的中缀运算符。
  • 使用 Haskell 语法的函数调用(带有空格分隔参数的可选括号)。

有没有实现它的现有库?

我当前的解析器是用Megaparsec编写的,所以我会欣赏一个与之兼容的解决方案。

0 投票
2 回答
234 浏览

haskell - “尝试”回溯多远?

所以......我搞砸了 CSV 格式的录音:

由于语言设置,浮点数用逗号作为分隔符写入......在逗号分隔值文件中......

问题是该文件对每个浮点数都没有很好的格式。有些根本没有意义,点后面的数字数量也各不相同。

我的想法是构建一个MegaParsec解析器,它会尝试读取所有可能的浮点格式,继续前进,如果发现错误则回溯。

例如上面的例子:

  1. 阅读 23,95489 -> 好
  2. 阅读 0,20 -> 好(到目前为止)
  3. 读取 9888 -> 错误(因为列的值太高(检查guard))
  4. (回溯到 2。)读取 0 -> 再次良好
  5. 阅读 20,9888 -> 好
  6. 完毕

我已将其实现为(此处为伪代码):

我的问题是,显然try只有在“当前”浮动中有效。没有回溯到以前的位置。这个对吗?

如果是这样……我将如何实施进一步的回溯?

0 投票
2 回答
255 浏览

haskell - 混合 Parser Char (lexer?) 与 Parser String

我编写了几个编译器,并且熟悉 flex/bison、JavaCC、JavaCup、antlr4 等中的词法分析器、正则表达式/NFA/DFA、解析器和语义规则。

是否有某种神奇的单子运算符可以无缝地增长/组合令牌与Parser Char(ie Text.Megaparsec.Char) 与的混合Parser String

有没有一种方法/最佳实践来表示词法标记和非终端期望的清晰分离?

0 投票
1 回答
549 浏览

haskell - megaparsec 中的运算符优先级

我在使用 Megaparsec 6 的makeExprParser助手时遇到问题。我似乎无法弄清楚如何以我期望的优先级绑定二进制^和一元。-

使用这个makeExprParser表达式解析器:

我希望这些测试能够通过:

也就是说,-1^-2应该解析为与-(1^(-2)). 这就是例如 Python 解析它的方式:

和红宝石:

但是这个 Megaparsec 解析器根本无法解析1^-2,而是给了我有用的错误:

我读到它说“我本可以在这里拍摄任何这些角色,但这让-我感到困惑”。

如果我像这样调整运算符表的某些优先级(在一元后移动指数 - ):

然后我不再遇到解析失败,而是-1^2错误地解析为(-1)^2(而不是正确的-(1^2))。

这是一个完整的自包含解析器来显示问题(它需要 HUnit,当然还有 megaparsec):

是否有可能让 Megaparsec 以其他语言的优先级解析这些运算符?

0 投票
2 回答
192 浏览

parsing - Haskell 中的记录解析

我正在使用 Megaparsec 构建解析器,但我不知道哪种是解析结构的最佳方法

其中namessurnames是关键字,后跟字符串列表,这两行中的每一行都是可选的。这也意味着

是有效的。

我可以用类似的东西解析每一行

whereidentifier解析一个有效的非保留字符串。

现在,我不确定如何表示每一行都是可选的,但如果它存在,仍然会检索它的值

0 投票
1 回答
204 浏览

parsing - 递归解析器

我需要解析,使用 Megaparsec 像这样的数据结构

我可以用点分隔字母数字字符串。

例如abc应该解析为Simple "abc"和。abc.defDotted (Simple "abc") "def"

我现在的解析器就像

这适用于Simple,但它不解析任何Dotted,因为第一个选项总是成功解析字符串的第一段。

哪个是修复我的解析器的最佳选择?

0 投票
1 回答
264 浏览

parsing - 左右递归解析器

这是这个问题的演变。

我需要用 megaparsec 解析一个数据结构,比如

我想解析它的字符串

例如 a 字符串"a(b.c).d"应该被解析为Dotted (Paren "a" (Dotted (Simple "b") "c")) "d".

我遇到的问题是这同时是左右递归的。

我为第一种和第三种情况编写解析器没有问题:

但我无法将第二种情况的解析器放在一起。我试图用sepBy1或用来接近它,makeExprParser但我做错了

0 投票
1 回答
641 浏览

parsing - 使用 Haskell 在引号之间解析

要求取自DOT 语言规范,更准确地说,我正在尝试解析[ID]属性,例如,

任何可能包含转义引号 (\")1 的双引号字符串 ("...");

以下应该是一个最小的示例。

上面的代码在第二次失败并返回"foo ",即使我想要foo "bar

我不明白为什么。我认为这megaparsec会重复应用inner,直到它解析最终的". 但它只是重复应用nonEscape解析器,第一次失败,它使用escape,然后似乎跳过了内部字符串的其余部分,然后继续到最后的引号。

0 投票
1 回答
492 浏览

haskell - Haskell Megaparsec - 保留字被解析为标识符

我正在尝试用 lamdba 表达式解析一种简单的语言。但runParser expr "lamdbda(x) (return x)返回Right (Var "lamdba")而不是Right (Lambda ["x"] (Return (Var "x")))

我的猜测是,我必须在try某个地方添加一个,但我不知道在哪里。lambdaExpr正确解析 lamdbas。

Ast.hs

解析器.hs

0 投票
1 回答
167 浏览

haskell - 在 megaparsec 7.0.4 中使用 parseTest

代码的出现意味着我有一段时间第一次使用 megaparsec。自上次以来,情况发生了很大变化。假设

我试过

在 GHCI 中,它给出了以下相当无用的错误消息:

我正确使用它吗?我需要做什么来解决这个问题?