-- !!! Wentworth's version of a program to generate -- !!! all the expansions of a generalised regular expression -- !!! -- module Main (main) where import Char main = interact (("Enter a generator: " ++).show.expand.head.lines) expand [] = [""] expand ('<':x) = numericRule x expand ('[':x) = alphabeticRule x expand x = constantRule x constantRule (c:rest) = [ c:z | z <- expand rest ] alphabeticRule (a:'-':b:']':rest) | a <= b = [c:z | c <- [a..b], z <- expand rest] | otherwise = [c:z | c <- reverse [b..a], z <- expand rest] numericRule x = [ pad (show i) ++ z | i <- if u < v then [u..v] else [u,u-1..v] , z <- expand s ] where (p,_:q) = span (/= '-') x (r,_:s) = span (/= '>') q (u,v) = (mknum p, mknum r) mknum s = foldl (\ u c -> u * 10 + (ord c - ord '0')) 0 s pad s = [ '0' | i <- [1 .. (width-(length s))]] ++ s width = max (length (show u)) (length (show v))