问题标签 [parsec]
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.
parsing - 你如何以贪婪的方式使用 parsec?
在我的工作中,我遇到了很多粗糙的 sql,我有一个聪明的想法,那就是编写一个程序来解析 sql 并整齐地打印出来。我很快就完成了大部分工作,但遇到了一个我不知道如何解决的问题。
所以让我们假设 sql 是“select foo from bar where 1”。我的想法是,总是有一个关键字后跟数据,所以我所要做的就是解析一个关键字,然后在下一个关键字之前捕获所有乱码并将其存储起来以供以后清理,如果值得的话。这是代码:
这里的关键是 stuffparser。那是关键字之间的东西,可以是从列列表到条件的任何内容。此函数捕获通向关键字的所有字符。但在完成之前它还需要其他东西。如果有子选择怎么办?“从栏选择 id,(从产品中选择产品)”。好吧,在那种情况下,如果它碰到那个关键字,它就会搞砸一切,解析错误并搞砸我的缩进。where 子句也可以有括号。
因此,我需要将 anyChar 更改为另一个组合器,该组合器一次吞一个字符,但也尝试查找括号,如果找到它们,遍历并捕获所有这些,但如果有更多括号,则这样做直到我们已完全关闭括号,然后将其全部连接并返回。这是我尝试过的,但我无法让它发挥作用。
这将像这样错误:
但是我想不出任何方法来重写它以使其起作用。我尝试在括号部分使用 manyTill,但是当我同时使用字符串生成括号和单个字符作为替代时,我最终无法对其进行类型检查。有人对如何解决这个问题有任何建议吗?
haskell - 以秒为单位获取匹配长度
Parsecparse pattern "(some_input)" input
返回解析后的数据(正如我在pattern
.
如何知道input
它消耗了多少(模式不是用 eof 锚定的)?我不想通过 allpattern
的内部添加长度跟踪(如果丢弃输入的某些部分)。
haskell - 如何将 Control.Monad.State 与 Parsec 一起使用?
我很惊讶我找不到任何关于此的信息。我一定是唯一一个遇到麻烦的人。
所以,假设我有一个仪表板。我希望它计算字符串中破折号的数量,并返回字符串。假装我给出了一个使用 parsec 的状态处理不起作用的例子。所以这应该工作:
事实上,这可以编译。好的,所以我尝试使用它:
好吧,这是有道理的。它应该返回状态和字符串。凉爽的。
哎呀。但是,它怎么可能一开始就希望工作呢?无法输入初始状态。
还有一个功能:
但它给出了类似的错误。
我觉得我应该在它上面运行状态,或者应该有一个已经在内部完成它的函数,但我似乎无法弄清楚从这里去哪里。
编辑:我应该更清楚地指定,我不想使用 parsec 的状态处理。原因是我有一种感觉,我不希望它的回溯影响我准备解决的问题所收集的内容。
然而,McCann 先生已经想出了这应该如何组合在一起,最终的代码看起来像这样:
非常感谢。
haskell - 将 readHex 添加到 Parsec 解析器
我正在编写自己的计划,并对本页上的练习 4 感到震惊。
我该怎么做?我已经走了这么远,但不知道readHex
应该去哪里,liftM
不是吗?你大小写匹配解析器吗?
另外,我不认为你可以申请函数,对吧<|>
?Parser LispVal
parsing - 与使用解析器组合器相比,使用快乐之类的解析器生成器有什么优势?
要学习如何编写和解析上下文无关语法,我想选择一个工具。对于 Haskell,有两个大选项:Happy,它从语法描述生成解析器和 *Parsec,它允许您直接在 Haskell 中编写解析器。
两种方法的(缺点)优点是什么?
haskell - Parsec 错误 - 尝试似乎不起作用
我目前正在使用Text.Parsec.Expr模块来解析脚本语言的子集。
基本上,这种语言有两种命令:形式的赋值和形式$var = expr
的命令$var = $array[$index]
——当然还有其他命令,但这足以解释我的问题。
我创建了一个 typeCommand
来表示它,以及相应的解析器,其中expr
分配由 Parsec 的buildExpressionParser
.
现在,问题。首先是解析代码:
整个代码(50 行)粘贴在这里:链接(如果你安装了解析器,应该编译)
问题是,解析失败,因为assignment
没有成功解析,即使try
之前有。颠倒解析顺序 ( try command <|> assignment
) 可以解决问题,但在我的情况下是不可能的。
当然,我试图进一步定位问题,在我看来,问题在于表达式解析器(由 构建buildExpressionParser
),因为如果我说expr = fail ""
. 但是,我在 Parsec 来源中找不到任何可以解释这种行为的东西。
haskell - 将两个一元值成对并返回
我正在玩 Parsec,我想将两个解析器组合成一个,并将结果放在一对中,然后将另一个函数提供给它以对解析结果进行操作以编写如下内容:
所以我写了这个:
和
有没有类似于 (<&>) 的东西已经在某处实现了?或者这可以写成无意义的吗?我试过fmap (,)
了,但似乎很难匹配类型。
haskell - 在 Haskell 中解析 FB2(XML)
开始学习 Haskell,我决定熟悉 Parsec,但是出现了问题。我正在尝试以 FB2 的格式实现对书籍的解析。对常规标签(文本)很好,但当标签内的标签 - 不起作用。
parsing - 是否可以使用 applicative 来表达chainl1?
是否可以chainl1
不使用 Parsec 定义的 Monad 实例来表达 Parsec 的组合子?
haskell - 是否有用于编写词法分析器的 haskell EDSL?
在一个阶段混合词法分析器和解析阶段有时会使 Parsec 解析器的可读性降低,但也会减慢它们的速度。一种解决方案是使用 Alex 作为标记器,然后使用 Parsec 作为标记流的解析器。
这很好,但如果我能摆脱 Alex 会更好,因为它在编译管道中添加了一个预处理阶段,不能很好地与 haskell“IDE”等集成。我想知道是否有这样的事情用于描述标记器的 haskell EDSL,非常类似于 Alex 的风格,但作为一个库。