9

私は48時間のチュートリアルで自分でスキームを書くを行っています。

 symbol :: Parser Char
 symbol = oneOf "!#$%&|*+-/:<=>?@^_~"

これはシンボルには最適ですが、キーワードのリストがある場合はどうなりますか?(つまり、struct、int)

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

4

1 に答える 1

11

これの一般的な形式は、次のタイプchoiceコンビネータです。

choice :: Stream s m t => [ParsecT s u m a] -> ParsecT s u m a

基本的に、パーサーのリストを指定し、成功するまで順番に試行します。choiceを使用して実装される(<|>)ため、そのアプローチと同じです。

あなたの場合、キーワードのリストに一致するが他のパーサーには一致しないようにするには、sのstringリストにマップして、Stringそれを使用choiceするだけです。

一方、mapM stringまったく異なることを行うと、すべてのパーサーが順番に成功することが期待されます。

于 2013-02-22T14:23:07.750 に答える