Vorlesung: Praxis der Funktionalen Programmierung | Index

Die (einfache) Parser-Monade

ist eine Variante der Zustandsmonade. Jene war s -> (a, s). Als Zustand eines Parsers nehmen wir die noch nicht gelesene Eingaben (also vom Typ String). Wir müssen damit rechnen, daß ein Präfix mehrere Ableitungen (Parse-Bäume) besitzt, wir benötigen nicht ein Ergebnis (a, s), sondern eine Liste davon. Deswegen s -> [(a, s)].
module Parser_Type 

( Parser (..)
, parse
, MonadZero (zero), guard
, MonadPlus (plus)
)

where

import MonadZero
import MonadPlus

data Parser a = Parser ( String -> [ (a, String) ] )

parse :: Parser a -> String -> Either String a
parse (Parser p) input = 
   case p input of
	[(x, ""  )] -> Right x
	[(x, rest)] -> Left "kein vollständiger Parse"
        []	    -> Left "kein Parse"
	_	    -> Left "kein eindeutiger Parse"

instance Functor Parser where
    fmap f (Parser p) = Parser $ \ input ->
	 [ (f x, rest) | (x, rest) <- p input ]

instance Monad Parser where
    return x = Parser $ \ input -> [ (x, input) ]
    Parser p >>= f = Parser $ \ input ->
        [ (y, rest') 
	| (x, rest) <- p input
	, let Parser q = f x
	, (y, rest') <- q rest
	]

instance MonadZero Parser where
    zero = Parser $ \ input -> []

instance MonadPlus Parser where
    Parser p `plus` Parser q = Parser $ \ input ->
        p input ++ q input



best viewed with any browser


http://www.informatik.uni-leipzig.de/~joe/ mailto:joe@informatik.uni-leipzig.de