问题标签 [trifecta]

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 回答
1044 浏览

parsing - 使用 Trifecta 的布局解析器

我正在尝试使用 Trifecta 来解析具有类似 Haskell 布局语法的非常简单的函数式语言。我正在研究 Haddock 文档和我在 Parsec 方面的经验,因为我找不到关于 Trifecta 本身的任何介绍性材料。

我遇到的问题是使用布局的东西,因为即使是 Haddock 文档也没有多大帮助。

给定以下代码:

我正在尝试解析以下文本test

但它因解析错误而失败:

但如果我注释掉第 2 行和第 3 行,它会起作用。

那么,即使包含第 2 行和第 3 行,我如何让它解析呢?

0 投票
1 回答
409 浏览

parsing - Trifecta 中的自定义状态

我正在使用Trifecta解析器组合器库,我的解析器输出 AST 数据类型的实例。我希望每个实例都有唯一的 ID(简单的 Int)。

在 Parsec 中,我将创建自定义状态并在需要时增加 ID。我们如何在 Trifecta 中做到这一点?

0 投票
1 回答
966 浏览

parsing - Haskell/Trifecta:解析完全可选的分号而不污染 AST

我已经重写了这个问题,因为它最初是用一个更简洁的代码示例发布的:

考虑一种具有完全可选分号的语言,几乎完全是糖,即:

  • ;; foo; bar;;;;已验证
  • foo bar foobar已验证
  • if (+1); fooif (+1) foo语义不同,因此;不能视为空格

这是一个示例解析器:

我在使用这种解析器时遇到的问题是我需要能够跳过分号而不承诺解析pStmt. 目前出现以下错误:

这是因为它需要一个语句 (in semi *> pStmt),但是因为堆叠的分号可以在表达式的开头和结尾都加糖,所以我不能确定我真的想要在我已经期望一个之前期望/解析一个。

我开发的一个 hack 是Nop在我的 AST 中作为构造函数,但我真的不想这样做 - 感觉就像是一个 hack,并且某些文档中的分号数量会大大增加内存使用量。

我正在寻找解决方案/建议。


尝试所需语法的 EBNF 形式:

0 投票
1 回答
332 浏览

haskell - 一次更新两个记录字段时的类型变量不明确(但更新一个时不会!)

以下代码因“不明确的类型变量”错误而失败(底部)。但是,更新记录两次的替代定义可以正常工作:这是为什么呢?此外,下面的“损坏”定义与Trifecta 源中的定义非常相似。我正在使用 GHC 7.10.3 针对 trifecta 1.5.2 和解析器 0.12.3 进行编译。

这是工作(替代)定义

第一个定义产生的错误是:

0 投票
2 回答
314 浏览

haskell - 如何在 trifecta 解析器中发出失败信号

作为 trifecta 的实验,我编写了以下简单函数:

这个想法是能够向解析器添加条件。例如(假设谓词prime已经存在),您可以编写: filterParser prime integer创建一个只接受素数的解析器。


使用单次解析似乎没问题:


但是对于“很多”它不起作用 - 比较:

我希望最后一个例子也能返回Success "zzz"。调用unexpected似乎使整个解析脱轨,这不是我想要的。

0 投票
1 回答
104 浏览

parsing - 返回在 Parser integer >> eof 中使用 bind 解析的整数

使用 trifecta 库,我应该解析一个不包含尾随字母的整数字符串返回解析后的整数:

我已经能够使用 do 符号来做到这一点,如下所示:

但我未能成功将其转换为绑定/lambdas。

这不会保留解析的数字,但在其他方面是正确的:

我想我应该这样开始

但在此之后,我尝试过的每一个排列都不起作用。如何返回解析的数字并使用绑定语法检查 eof 而不是 do?

0 投票
1 回答
241 浏览

parsing - 在 Haskell (Trifecta) 中解析三位数字的最简洁方法

将三个连续数字解析为字符串的惯用方式是什么?

以下工作,但不能扩展:

更一般地说,这如何扩展到 N 个数字?

0 投票
1 回答
844 浏览

parsing - 如何在 Haskell 中将解析器最多组合 n 次?

我试图在 Haskell 中组合解析器,以便我最多可以解析某些模式 n 次。为了说明,假设我想从输入中解析多达八位数字。我知道我可以使用countfromText.Parser.Combinators来准确解析 n 次出现,例如:

但是,如果它没有找到正好 8 位数字,这将失败。我也可以some用来解析一个或多个数字:

上面的问题是它可能消耗比我想要的更多的数字。最后,我可以使用try,它结合了可能消耗输入的解析器,并且在失败时返回到它开始的位置:

虽然这可以扩展到最多 8 次重复,但它既不可扩展也不优雅,所以问题是我如何结合解析器来解析 1 到最多 n 次之间的模式?

0 投票
1 回答
128 浏览

parsing - 哈斯克尔。为什么我的解析器失败

作为 bitmyapp 编写的 Haskell Book 的练习,我需要制作一个可以解析给定日志的解析器。所以我做了这个:https ://gist.github.com/RoelofWobben/79058b1a6a5c24f08a495045c7a685f9

但是当我使用 parseString parseMultipleDays myLog 对其进行测试时,我看到了以下错误消息:

任何可以给我提示错误所在的人。需要时,我可以通过一些测试对我拥有的代码进行回购。

我使用 trifecta 是因为在本章中对此进行了解释

0 投票
1 回答
93 浏览

parsing - Parser 函数中的故障处理

我正在使用Trifecta库学习 Parser Combinators。我被介绍给Alternative typeclass 和它的 <|> 函数。

我的代码中有一个解析器函数,其定义是

它试图将输入解析为小数或分数,如果没有任何效果则失败。这种方法是否正确,或者我应该以不同的方式对失败(失败)进行编码,而不是作为 <|> 操作的一部分。