我正在学习“48 小时内为自己编写一个方案”教程。
symbol :: Parser Char
symbol = oneOf "!#$%&|*+-/:<=>?@^_~"
这对于符号来说非常有用,但是如果我有一个关键字列表怎么办? (即结构体、整数)
oneOf 可以适应列表吗?这就是我想要的理想情况,如下所示。
keywords :: Parser String
keywords = oneOf ["struct","int",..etc]
或者我应该导入 Text.Parsec.Char 并尝试在关键字列表上映射 M 字符串?
我正在尝试标记化,只是想知道走这条路的其他人的最佳实践是什么。
文档说使用这样的东西:
divOrMod = string "div"
<|> string "mod"
http://hackage.haskell.org/packages/archive/parsec/3.0.0/doc/html/Text-Parsec-Char.html http://hackage.haskell.org/packages/archive/parsec/3.0.0/doc/html/Text-Parsec-Char.html
其一般形式是the choice组合器 http://hackage.haskell.org/packages/archive/parsec/3.1.3/doc/html/Text-Parsec-Combinator.html#v:choice,其具有以下类型:
choice :: Stream s m t => [ParsecT s u m a] -> ParsecT s u m a
基本上,你给它一个解析器列表,它会按顺序尝试它们,直到一个成功。choice
是使用实现的(<|>)
,所以它与该方法相同。
在您的情况下,要匹配关键字列表但不匹配其他解析器,您可以只映射string
超过一个列表String
s,然后使用choice
关于这一点。
另一方面,mapM string
会做一些完全不同的事情——它会期望all解析器按顺序成功。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)