- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Haskell 和 Parsec 的新手。看完Chapter 16 Using Parsec of Real World Haskell ,一个问题出现在我的脑海中:为什么以及什么时候 Parsec 比 Yacc/Bison/Antlr 等其他解析器生成器更好?
我的理解是 Parsec 创建了一个很好的 DSL 来编写解析器,而 Haskell 让它变得非常简单和富有表现力。但解析是这样一种标准/流行的技术,值得拥有自己的语言,输出到多种目标语言。那么我们什么时候应该使用 Parsec 而不是从 Bison/Antlr 生成 Haskell 代码?
这个问题可能超出了技术范围,进入了行业实践领域。当从头开始编写解析器时,与 Bison/Antlr 或类似的东西相比,选择 Haskell/Parsec 有什么好处?
顺便说一句:我的问题与 this one 非常相似但那里没有得到令人满意的答复。
最佳答案
您列出的工具之间的主要区别之一是 ANTLR、Bison 及其 friend 是解析器生成器,而 Parsec 是解析器组合器库。
解析器生成器读取语法描述并输出解析器。通常不可能将现有语法组合成新语法,当然也不可能将两个现有生成的解析器组合成新解析器。
解析器组合器 OTOH 不执行任何操作,只是将现有解析器组合成新的解析器。通常,解析器组合器库附带几个简单的内置解析器,可以解析空字符串或单个字符,并且它附带一组组合器,它们采用 1 个或多个解析器并返回一个新的解析器,例如,解析原始解析器的序列(例如,您可以组合 d
解析器和 o
解析器形成 do
解析器),交替原始解析器(例如 0
解析器和 1
解析器到 0|1
解析器)或多次解析原始解析器(重复)。
这意味着,例如,您可以采用现有的 Java 解析器和现有的 HTML 解析器,并将它们组合成 JSP 解析器。
大多数解析器生成器不支持这一点,或者仅以有限的方式支持它。解析器组合器 OTOH 仅支持这一点,不支持其他任何东西。
关于haskell - 秒差距 vs Yacc/Bison/Antlr : Why and when to use Parsec?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5055370/
Parsec 的解析模式“(some_input)”输入返回解析后的数据(如我在pattern中指定的那样。 如何知道它消耗了多少输入(该模式未使用 eof 锚定)?我不想通过所有模式的内部添加长度跟
我正在尝试解析 F# 类型语法。我开始编写 [F]Parsec 语法并遇到问题,所以我简化了 the grammar归结为: type ::= identifier | type -> type id
我将 Parsec 与自定义 Stream 类型结合使用。该流本质上是String,但有时它将在字符串中找到的输入扩展为其他字符串(想想别名扩展)。例如,给定“§4.1 ¶3”,它可能会将“Secti
我这里有一些代码可用于将 URI 路径解析为字符串列表。例如,/user/home 将变为 ["user", "home"]。 pathPiece :: Parser String pathPie
我有以下代码在页面加载时将主题更改为深色。问题是有 1 秒的间隔,每次我切换到其他页面时,屏幕都会闪烁 1 秒然后变黑。我如何替换 document.body.setAttribute('data-t
我是 Haskell 和 Parsec 的新手。看完Chapter 16 Using Parsec of Real World Haskell ,一个问题出现在我的脑海中:为什么以及什么时候 Pars
我是一名优秀的程序员,十分优秀!