
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'
