问题标签 [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.
haskell - 用于类似 Haskell 的表达式语法的解析器库
我想扩展一种玩具函数式编程语言来接受类似 Haskell 的中缀运算符。以下是我感兴趣的特征:
- Parser 会动态更新自身以接受新定义的运算符。
- 中缀运算符可以转换为括号中的函数。
- 函数可以转换为在坟墓中围绕它们的中缀运算符。
- 使用 Haskell 语法的函数调用(带有空格分隔参数的可选括号)。
有没有实现它的现有库?
我当前的解析器是用Megaparsec编写的,所以我会欣赏一个与之兼容的解决方案。
haskell - “尝试”回溯多远?
所以......我搞砸了 CSV 格式的录音:
由于语言设置,浮点数用逗号作为分隔符写入......在逗号分隔值文件中......
问题是该文件对每个浮点数都没有很好的格式。有些根本没有意义,点后面的数字数量也各不相同。
我的想法是构建一个MegaParsec
解析器,它会尝试读取所有可能的浮点格式,继续前进,如果发现错误则回溯。
例如上面的例子:
- 阅读 23,95489 -> 好
- 阅读 0,20 -> 好(到目前为止)
- 读取 9888 -> 错误(因为列的值太高(检查
guard
)) - (回溯到 2。)读取 0 -> 再次良好
- 阅读 20,9888 -> 好
- 完毕
我已将其实现为(此处为伪代码):
我的问题是,显然try
只有在“当前”浮动中有效。没有回溯到以前的位置。这个对吗?
如果是这样……我将如何实施进一步的回溯?
haskell - 混合 Parser Char (lexer?) 与 Parser String
我编写了几个编译器,并且熟悉 flex/bison、JavaCC、JavaCup、antlr4 等中的词法分析器、正则表达式/NFA/DFA、解析器和语义规则。
是否有某种神奇的单子运算符可以无缝地增长/组合令牌与Parser Char
(ie Text.Megaparsec.Char
) 与的混合Parser String
?
有没有一种方法/最佳实践来表示词法标记和非终端期望的清晰分离?
haskell - megaparsec 中的运算符优先级
我在使用 Megaparsec 6 的makeExprParser
助手时遇到问题。我似乎无法弄清楚如何以我期望的优先级绑定二进制^
和一元。-
使用这个makeExprParser
表达式解析器:
我希望这些测试能够通过:
也就是说,-1^-2
应该解析为与-(1^(-2))
. 这就是例如 Python 解析它的方式:
和红宝石:
但是这个 Megaparsec 解析器根本无法解析1^-2
,而是给了我有用的错误:
我读到它说“我本可以在这里拍摄任何这些角色,但这让-
我感到困惑”。
如果我像这样调整运算符表的某些优先级(在一元后移动指数 - ):
然后我不再遇到解析失败,而是-1^2
错误地解析为(-1)^2
(而不是正确的-(1^2)
)。
这是一个完整的自包含解析器来显示问题(它需要 HUnit,当然还有 megaparsec):
是否有可能让 Megaparsec 以其他语言的优先级解析这些运算符?
parsing - Haskell 中的记录解析
我正在使用 Megaparsec 构建解析器,但我不知道哪种是解析结构的最佳方法
其中names
和surnames
是关键字,后跟字符串列表,这两行中的每一行都是可选的。这也意味着
和
是有效的。
我可以用类似的东西解析每一行
whereidentifier
解析一个有效的非保留字符串。
现在,我不确定如何表示每一行都是可选的,但如果它存在,仍然会检索它的值
parsing - 递归解析器
我需要解析,使用 Megaparsec 像这样的数据结构
我可以用点分隔字母数字字符串。
例如abc
应该解析为Simple "abc"
和。abc.def
Dotted (Simple "abc") "def"
我现在的解析器就像
这适用于Simple
,但它不解析任何Dotted
,因为第一个选项总是成功解析字符串的第一段。
哪个是修复我的解析器的最佳选择?
parsing - 左右递归解析器
这是这个问题的演变。
我需要用 megaparsec 解析一个数据结构,比如
我想解析它的字符串
例如 a 字符串"a(b.c).d"
应该被解析为Dotted (Paren "a" (Dotted (Simple "b") "c")) "d"
.
我遇到的问题是这同时是左右递归的。
我为第一种和第三种情况编写解析器没有问题:
但我无法将第二种情况的解析器放在一起。我试图用sepBy1
或用来接近它,makeExprParser
但我做错了
parsing - 使用 Haskell 在引号之间解析
要求取自DOT 语言规范,更准确地说,我正在尝试解析[ID]
属性,例如,
任何可能包含转义引号 (\")1 的双引号字符串 ("...");
以下应该是一个最小的示例。
上面的代码在第二次失败并返回"foo "
,即使我想要foo "bar
我不明白为什么。我认为这megaparsec
会重复应用inner
,直到它解析最终的"
. 但它只是重复应用nonEscape
解析器,第一次失败,它使用escape
,然后似乎跳过了内部字符串的其余部分,然后继续到最后的引号。
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
haskell - 在 megaparsec 7.0.4 中使用 parseTest
代码的出现意味着我有一段时间第一次使用 megaparsec。自上次以来,情况发生了很大变化。假设
我试过
在 GHCI 中,它给出了以下相当无用的错误消息:
我正确使用它吗?我需要做什么来解决这个问题?