17

Parsecを使用して式を解析していますが、Parsecのユーザー状態を使用してこれらの式の変数を追跡したいと思います。残念ながら、私はそれを行う方法を本当に理解していません。

次のコードが与えられます:

import Data.Set as Set
inp = "$x = $y + $z"

data Var = V String

var = do char '$'
      n <- many1 letter
      let v = Var n
       -- I want to modify the set of variables here
      return v

parseAssignment = ... -- parses the above assignment

run = case runIdentity $ runParserT parseAssignment Set.empty "" inp of
                   Left err -> ...
                   Right -> ...

したがって、uinParsecT s u m aはになりますSet.Set。しかし、どのように状態更新をに統合しvarますか?

のようなものを試しましたが、州のモナドではないためmodify $ Set.insert v、これは機能しません。Set.Set

4

2 に答える 2

17

残念ながら、Yurasの提案は最適ではありません(Parsecの内部状態updateParserState変更する場合は、この関数を使用します)。代わりに、次の例のように、カスタムユーザー状態(つまり、タイプ)を処理する関数をに渡す必要があります。u -> umodifyState

expr  = do
  x <- identifier
  modifyState (+1)
  -- ^ in this example, our type u is Int
  return (Id x)

getStateまたは、と関数の任意の組み合わせを使用しputStateます。あなたの場合、あなたは次のようなことをするでしょう:

modifyState (Set.insert v)

詳細については、このリンクを参照してください。

Parsecでのユーザー状態の操作に関するチュートリアルのような紹介については、このドキュメントは古いものですが、関連性があるはずです。

于 2011-06-25T13:10:57.027 に答える
1

You can use updateParserState

于 2011-06-25T12:35:00.343 に答える