6

パーセクを使用makeTokenParserしてパーサーを構築したいのですが、独自の定義を使用したいと思いますwhiteSpace。次の手順を実行すると、私の定義が置き換えwhiteSpaceられますが、すべてのlexemeパーサーは引き続き古い定義を使用します(たとえばP.identifier lexer、古いwhiteSpaceを使用します)。

...
lexer :: P.TokenParser ()
lexer      = l { P.whiteSpace = myWhiteSpace }
   where l = P.makeTokenParser myLanguageDef
...

のコードを見ると、makeTokenParserなぜこのように機能するのか理解できたと思います。コードを完全に複製しないようにするための回避策があるかどうかを知りたいですmakeTokenParserか?

4

1 に答える 1

7

悲しいことに、私は方法がないと思います。で使用されるローカル定義makeTokenParserは再帰的にそれ自体を参照するため、前述のように、オブジェクトで置き換えるレコードメンバーではなく、そこで定義されているとおりにlexeme使用されます。whiteSpacewhiteSpacelexer

makeTokenParserこのコードは、コンストラクター内のローカル関数とコンストラクターのレコードメンバーの両方と同じ名前を使用しているため、罵倒されていますTokenParser。それらは実際には完全に別個の実体です。

于 2010-04-15T00:33:39.913 に答える