首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell Parsec的“电池”

Haskell Parsec的“电池”
EN

Stack Overflow用户
提问于 2017-03-04 17:12:49
回答 1查看 161关注 0票数 4

我是Haskell的新手,我一直在尝试使用Parsec编写一个JSON解析器。这一直进展顺利,我能够用相对较少的代码解析列表和对象,这些代码也是可读的(很好!)。但是,对于JSON,我还需要解析原语,如

  • 整数(可能有签名)
  • 浮标(可能使用科学符号,如"3.4e-8")
  • 带有例如转义引号的字符串

我希望在Parsec的一部分中找到可以将解析器用于类似这些内容的工具。我得到的最接近的是Parsec.Tokens模块(定义了integer和朋友),但是这些解析器需要一个“语言定义”,这似乎超出了我解析像JSON这样简单的东西所需要的范围--它似乎是为编程语言设计的。

所以我的问题是:

  1. 在这里,Parsec.Token中的函数是正确的吗?如果是的话,如何作出适当的语言定义?
  2. 其他地方是否定义了整数等的“原始”解析器?也许在另一个包裹里?
  3. 我应该自己写这类低级解析器吗?我可以看到自己经常重复使用它们..。(模糊的科学数据格式等)

我注意到在这个网站上有一个问题说Megaparsec包含了这些原语1,但我认为这些元素不能与parsec一起使用。

相关问题:

* Int?

如何用parsec解析整数

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-04 18:33:10

在这里,Parsec.Token中的函数是正确的吗?

是的,他们是。如果您不关心语言定义指定的细节 (即您不打算使用依赖于它们的解析器,例如reserved),只需使用emptyDef作为默认值:

代码语言:javascript
复制
import Text.Parsec
import qualified Text.Parsec.Token as P
import Text.Parsec.Language (emptyDef)

lexer = P.makeTokenParser emptyDef

integer = P.integer lexer

正如您所注意到的,对于您的用例来说,这是不必要的。值得一提的是超级私人股本公司(参见。( 亚历克的建议)提供相应的integer解析器,而不需要仪式。(另一方面,兆位秒并不试图烘焙支持例如保留的单词,而是在你实际需要的情况下使用不难实现。)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42598845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档