使用 Parsec,如何解析零个或多个以 foo2 结尾且全部由点分隔的 foo1?
我想做的事情看起来很简单,但由于我是一个秒差距 Haskell 新手,所以解决方案让我困惑。
我有两个解析器,比如说 foo1
和 foo2
,其中 foo1
可以解析中间项,foo2
解析结尾学期。术语由符号 "."
分隔。
我需要解析的句子有
foo2
-
foo1.foo2
-
foo1.foo1.foo2
等等。
我最初的想法是这样做
do k <- sepBy foo1 (char'.')
j <- foo2
,但这并不能捕获仅 foo2 的情况。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您需要
endBy
,而不是sepBy
。这将强制在每次出现 foo1 后出现分隔符。
当然,
endBy
可以简单地替换为many
,这可能会更清楚。或者,没有
Control.Applicative
:You want
endBy
, notsepBy
.That will force the separator to be present after each occurrence of
foo1
.Of course,
endBy
is trivially replaceable bymany
, which may be clearer.or, without
Control.Applicative
:首先,您需要
endBy
而不是sepBy
:其次,它会
从 文档:
First, you want
endBy
instead ofsepBy
:Second, it would
From the documentation:
尝试类似的东西
(当然,只是一个草图。)
一般来说,
many
组合器相当于 Parsec 的 克林星;如果您要向现有解析器添加一些简单的内容(例如尾随点),那么使用>>
/>>=
实际上可能更干净、更简单而不是使用do
表示法。Try something like
(Just a sketch, of course.)
In general, the
many
combinator is Parsec's equivalent of Kleene star; and if you're going to add something simple like a trailing dot to an existing parser, using>>
/>>=
may actually be cleaner and simpler than usingdo
notation.当然,它会捕获 foo2 的情况。用于你的 foo1,莱顿的话:
sure, it would catch the foo2 case. Using for your foo1, Leiden's word: