module RExp where infixl 4 :| -- Auswahl infixr 5 :% -- Sequenz data RExp = Lam -- Lambda (Epsilon ist dann (Star Lam) | Ch Set -- Buchstabe(n) | RExp :% RExp -- Sequenz | RExp :| RExp -- Auswahl | Star RExp -- Stern type Set = Char -> Bool instance Show RExp where show (Lam) = "(/\\)" show (a :% b) = show a ++ ":%" ++ show b show (a :| b) = show a ++ ":|" ++ show b show (Star r) = show r ++ "*" show (Ch set) = "[" ++ (show (filter set ['\33'..'\127'])) ++ "]" -- Beispiele bsp1 = Ch a :% (Star (Ch b)) -- ab* bsp2 = Ch a :| Ch b -- [ab] bsp3 = Star (Ch a) -- a* -- ganze Zahlen + Vorzeichenoption decimal = ((Ch vor) :| (Star Lam)) :% ((Ch nul) :| (Ch num') :% (Star (Ch num))) -- Zeichenmengen num c = elem c ['0'..'9'] num' c = elem c ['1'..'9'] vor c = elem c ['+','-'] a c = c == 'a' b c = c == 'b' nul c = c == '0'