我将在48小时的教程中编写自己的方案。
symbol :: Parser Char
symbol = oneOf "!#$%&|*+-/:<=>?@^_~"
这对于符号非常有用,但如果我有一个关键字列表怎么办? (即struct,int)
可以将其中一个改编成列表吗?理想情况下,这就是我想要的,如下所示。
keywords :: Parser String
keywords = oneOf ["struct","int",..etc]
或者我应该导入Text.Parsec.Char并尝试将mapM字符串映射到关键字列表上?
我正试图进行标记化,只是想知道其他人走上这条道路的最佳做法。
文档说使用这样的东西:
divOrMod = string "div"
<|> string "mod"
http://hackage.haskell.org/packages/archive/parsec/3.0.0/doc/html/Text-Parsec-Char.html
答案 0 :(得分:11)
这个的一般形式是the choice
combinator,它具有以下类型:
choice :: Stream s m t => [ParsecT s u m a] -> ParsecT s u m a
基本上,你给它一个解析器列表,然后按顺序尝试它们直到成功。 choice
是使用(<|>)
实现的,因此它与该方法相同。
在您的情况下,要匹配关键字列表但不匹配其他解析器,您只需将string
映射到String
列表上,然后使用choice
。
另一方面,mapM string
会做一些完全不同的事情 - 它会期望所有解析器按顺序成功。