问题标签 [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.

0 投票
2 回答
791 浏览

haskell - Haskell Parsec and Unordered Properties

I am trying to use Parsec to parse something like this:

I am implementing the iCalendar spec and on every like there is a name:parameters:value triplet, very much like the way that XML has a name:attributes:content triplet. Infact you could very easily convert an iCalendar into XML format (thought I can't really see the advantages).

My point is that the parameters do not have to come in any order at all and each paramater may have a different type. One parameter may be a string while the other is the numeric id of another element. They may share no similarity yet, in the end, I want to place them correctly in the right record fields for whatever 'SomeObjectInstance' that I wanted the parser to return. How do I go about doing this sort of thing (or can you point me to an example of where somebody had to parse data like this)?

Thankyou, I know that my question is probably a little confused but that reflects my level of understanding of what I need to do.

Edit: I was trying to avoid giving the expected output (because it is large, not because it is hidden) but here is an example of an input file (from wikipedia):

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
BEGIN:VEVENT
UID:uid1@example.com
DTSTAMP:19970714T170000Z
ORGANIZER;CN=John Doe:MAILTO:john.doe@example.com
DTSTART:19970714T170000Z
DTEND:19970715T035959Z
SUMMARY:Bastille Day Party
END:VEVENT
END:VCALENDAR

As you can see it contains one VEvent inside a VCalendar, I have made data structures that represent them here.

I am trying to write a parser that parses that type of file into my data structures and I am stuck on the bit where I need to handle properties coming in any order with any type; date, time, int, string, uid, ect. I hope that makes more sense without repeating the entire iCalendar spec.

0 投票
3 回答
403 浏览

haskell - 如何使用 Haskell 的类型系统来强制正确性,同时仍然能够进行模式匹配?

假设我有一个代表某种树结构的广告:

据我所知,没有办法对类型构造函数进行模式匹配(或者匹配函数本身没有类型?)但我仍然想使用编译时类型系统来消除返回或解析的可能性树节点的错误“类型”。例如,可能 CNode 只能是 ANode 的父节点。我可能有

作为一个 Parsec 解析函数,它被用作我的 CNode 解析器的一部分:

根据类型系统,parseANode 最终可能返回一个 Maybe CNode、一个 Maybe BNode 或一个 Maybe ANode,但我真的想确保它只返回一个 Maybe ANode。请注意,这不是我想要执行的数据模式值或运行时检查 - 我实际上只是试图检查我为特定树模式编写的解析器的有效性。IOW,我不是要检查解析数据的模式正确性,我真正想做的是检查我的解析器的模式正确性——我只是想确保有一天我不会搞砸 parseANode返回 ANode 值以外的值。

我希望也许如果我匹配绑定变量中的值构造函数,类型推断会弄清楚我的意思:

但这有很多问题,其中最重要的是 parseANode 不再可以自由地返回 Nothing。无论如何它都不起作用 - 看起来绑定变量被视为模式匹配,并且运行时在 parseANode 返回 Nothing 或 Maybe BNode 或其他东西时抱怨非详尽的模式匹配。

我可以按照以下方式做一些事情:

但这种情况很糟糕,因为它假设约束适用于所有节点——我可能对此不感兴趣——实际上它可能只是 CNodes 只能作为 ANodes 的父节点。所以我想我可以这样做:

但这使得与 *Node 的模式匹配变得更加困难 - 事实上这是不可能的,因为它们只是完全不同的类型。我想我可以在任何我想进行模式匹配的地方创建一个类型类

无论如何,这似乎有点混乱。谁能想到一个更简洁的方法来做到这一点?

0 投票
2 回答
1890 浏览

parsing - How to retrieve value from optional parser in Parsec?

Sorry if it's a novice question - I want to parse something defined by

I thought I could do this:

I want to get str0/str1 if optional parts are present, otherwise, str0/str1 would be "". But (1) and (2) won't work since optional() doesn't allow extracting result from its parameters, in this case, parserOptionalPart0/parserOptionalPart1.

Now What would be the proper way to do it?

Many thanks!

Billy R

0 投票
2 回答
396 浏览

parsing - Parsec 解析许多问题

我需要为编程语言创建一个解析器。到目前为止,它已经完成了 95%,我会说,除了一个小细节。

用这种语言编写的程序具有以下结构:

要求是输出不能与输入混合。例如:

我可以很好地解析单个输出,但是如果我尝试使用 (many1 output) 来允许多个输出,它就不起作用,因为它试图将输入解析为输出。

我的主要解析器如下所示:

我知道这看起来很容易,但我尝试了很多东西,但无法让它发挥作用。请帮忙。

0 投票
3 回答
5075 浏览

haskell - 使用 Parsec 和 Data.Text

使用Parsec 3.1,可以解析几种类型的输入:

  • [Char]Text.Parsec.String
  • Data.ByteStringText.Parsec.ByteString
  • Data.ByteString.LazyText.Parsec.ByteString.Lazy

我没有看到该Data.Text模块的任何内容。我想解析 Unicode 内容而不会受到String低效率的影响。所以我基于该模块创建了以下Text.Parsec.ByteString模块:

  1. 这样做有意义吗?
  2. 它与 Parsec API 的其余部分兼容吗?

补充评论:

我必须在我的解析模块中添加{-# LANGUAGE NoMonomorphismRestriction #-}编译指示才能使其工作。

解析Text是一回事,构建 ASTText是另一回事。pack我还需要String在返回之前:

0 投票
4 回答
1419 浏览

haskell - Parsec - “许多”和错误消息

当我尝试解析 many p时,我没有收到“期待 p”消息:

相比于

报告“。” 正如我所料。many1 p <|> return []也可以。

所有这些函数都接受空输入,那么为什么不many报告它所期望的呢?它是错误还是功能?

0 投票
2 回答
1732 浏览

parsing - Haskell 的 Parsec <|> 运算符的问题

我对 Haskell 和 Parsec 都是新手。为了进一步了解该语言和该库,特别是我正在尝试创建一个可以解析 Lua 保存的变量文件的解析器。在这些文件中,变量可以采用以下形式:

变量名 = 值

varname = {值,值,...}

varname = {{value, value},{value,value,...}}

我已经为这些类型中的每一个创建了解析器,但是当我将它们与选择 <|> 运算符串在一起时,我得到一个类型错误。

我的假设是(尽管我在文档中找不到)传递给选择运算符的每个解析器都必须返回相同的类型。这是有问题的代码:

0 投票
4 回答
8015 浏览

haskell - 解析器组合器能否变得高效?

大约 6 年前,我在 OCaml 中对自己的解析器组合器进行了基准测试,发现它们比当时提供的解析器生成器慢约 5 倍。我最近重新审视了这个主题,并将 Haskell 的 Parsec 与用 F# 编写的简单的手动优先爬升解析器进行了基准测试,并惊讶地发现 F# 比 Haskell 快 25 倍。

这是我用来从文件中读取大型数学表达式、解析和评估它的 Haskell 代码:

这是我在 F# 中的自包含优先级攀爬解析器:

我的印象是,即使是最先进的解析器组合器也会浪费大量时间进行回溯。那是对的吗?如果是这样,是否可以编写生成状态机的解析器组合器以获得具有竞争力的性能,或者是否有必要使用代码生成?

编辑:

这是我用来生成 ~2Mb 表达式以进行基准测试的 OCaml 脚本:

0 投票
5 回答
12597 浏览

xml - 在 Haskell 中解析 XML

我正在尝试从定期为 XML 文件提供股票市场报价(示例数据)的网页获取数据。XML 的结构非常简单,大致如下:

(不仅如此,但这足以作为示例)。

我想将其解析为数据结构:

我或多或少了解 Parsec 的工作原理(在 Real World Haskell 书的水平上),我尝试了一些Text.XML库,但我所能开发的只是一个有效的代码,但对于这样一个简单的任务来说太大了,看起来像一个半生不熟的黑客,而不是最好的。

我不太了解解析器和 XML(我基本上知道我在 RWH 书中读到的内容,我以前从未使用过解析器)(我只是做统计和数值编程,我不是计算机科学家)。是否有一个 XML 解析库,我可以在其中知道什么是模型并立即提取信息,而不必手动解析每个元素,也不必解析纯字符串?

我正在考虑类似的事情:

我不必处理纯字符串并自己创建组合器(我很烂)。

编辑:我可能需要阅读一些关于解析器(不仅仅是 Parsec)和 XML 的最低限度的内容(足以以正确的方式完成这项工作)。大家有什么推荐的吗?

我必须解析的真正字符串是这样的:

编辑2:

我尝试了以下方法(readFloat、readQuoteTime 等......只是从字符串中读取内容的函数)。

当我在 ghci 中调用它时:

有什么问题吗?

0 投票
1 回答
313 浏览

c++ - 修改生成文件

我有来自 PARSEC 开源基准测试的以下文件,我希望能够使用 gcc 对其进行分析。但正如你所知,我需要提高 -pg 标志。但我在这样做时遇到了困难。我尝试使用常规的 g++ -pg -o files.cpp 但它没有用。我还尝试修改-oi前面放置-pg的makefile,但它也给出了巨大的错误。所以现在我被卡住了,要么我做错了什么,要么 -pg 标志需要一些特殊的东西......但是单独执行时的 makefile 给了我一个输出,我通过运行测试它并且它是成功的!所以我确信源代码被我的编译器接受