Haskell Parsec,将oneOf调整为[String]

时间:2013-02-22 14:11:55

标签: parsing haskell parsec

我将在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

1 个答案:

答案 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会做一些完全不同的事情 - 它会期望所有解析器按顺序成功。