Hack Parsec
Parsecを少し改造*1した。
whiteSpaceなどの定義を(矛盾無く)変更できるようにした。
module Test where import Text.ParserCombinators.Parsec as P import Text.ParserCombinators.Parsec.Language as P import Text.ParserCombinators.Parsec.Char as P import qualified Text.ParserCombinators.Parsec.Token as P test1 = parse (symbol "A" >> symbol "BB") "" "AccBBaa" where symbol = P.symbol lexer lexer = (P.makeTokenParser P.emptyDef) { P.whiteSpace = many1 (oneOf "ac") >> return () } test2 = parse (symbol "A" >> symbol "BB") "" "AccBBaa" where symbol = P.symbol lexer lexer = P.makeModifiedTokenParser P.emptyDef (\p -> p { P.whiteSpace = many1 (oneOf "ac") >> return () })
*Test> test1 Left (line 1, column 2): unexpected "c" expecting "BB" *Test> test2 Right "BB"
追記(2005-02-15)
- これに使ったテクニックとOOの関係について
- http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20050214#p02 レコード型+不動点演算子で late binding を表現