module LexerGen(lexerGen,OutputFun(..)) where import RegExp import FSM import FSMOpt import DFA(showDFA,renumberStates) import DetMachine import DetMachineToHaskell2 import PPrint(pprint) import List(sort) import HaskellChars(HaskellChar) {-+ The lexer generator takes the name of the module to generate, the name of the lexer function to export from that module and the regular expression that defines the lexical syntax. It outputs the generated Haskell module on the standard output.

lexerGen also consults the command line arguments. If the word nocc is present, it does not use character classes to reduce the size of the code. -} lexerGen :: (Ord o,Show o,OutputFun o) => String -> String -> Transducer HaskellChar o -> [String] -> String lexerGen moduleName functionName program args = if "nfa" `elem` args then show m else if "nocc" `elem` args then outputDetm Nothing m else outputWithCharClasses m where m@(n,nfa) = rmeqstate (compileRegExp program) outputWithCharClasses (n,nfa) = outputDetm (Just ccs) (n,renumberEdges ccs nfa) where charclasses = sort $ tokenclasses nfa ccs = [(c,n)|(n,(cs,_))<-zip [(1::Int)..] charclasses,c<-cs] outputDetm optccs nfa = if "dfa" `elem` args then showDFA dfa else "\n-- Automatically generated code for a DFA follows:\n" ++ pprint haskellCode where haskellCode = dfaToHaskell optccs moduleName ["Char","HsLexUtils"] functionName dfa dfa = renumberStates (deterministicMachine nfa)