{ -- alex scanner for use with uulib -- compile with alex -o Scanner.hs -g Scanner.x module Graphics.LambdaCube.Loader.Generated.CompositorScriptScanner(tokenize) where import UU.Scanner } $litChar = [^[\" \\]] $identChar = [a-zA-Z0-9_\.\-\/\~\&] tokens :- $white+ ; -- whitespace "//".* ; -- comment \" ($litChar | \\ \\ | \\ \" )* \" { valueToken TkString } -- string [0-9]+ { valueToken TkInteger10 } -- int [0-9]+\.[0-9]+ { valueToken TkFraction } -- float ( on | off | compositor | technique | texture | target_width | target_height | target_width_scaled | target_height_scaled | shared | PF_A8R8G8B8 | PF_R8G8B8A8 | PF_R8G8B8 | PF_FLOAT16_RGBA | PF_FLOAT16_RGB | PF_FLOAT16_R | PF_FLOAT32_RGBA | PF_FLOAT32_RGB | PF_FLOAT32_R | target | target_output | input | none | previous | only_initial | visibility_mask | lod_bias | shadows | material_scheme | pass | render_quad | clear | stencil | render_scene | material | identifier | first_render_queue | last_render_queue | buffers | colour | depth | colour_value | depth_value | stencil_value | check | comp_func | always_fail | always_pass | less | less_equal | not_equal | greater_equal | greater | ref_value | mask | fail_op | keep | zero | replace | increment | decrement | increment_wrap | decrement_wrap | invert | depth_fail_op | pass_op | two_sided ) { reserved } -- reserved keywords [\{\}] { reserved } -- reserved symbols $identChar+ { valueToken TkVarid } -- identifier { -- boilerplate code needed for Alex type AlexInput = (Pos, String) alexInputPrevChar :: AlexInput -> Char alexInputPrevChar = error "alexInputPrevChar: there is no need to go back in the input." alexGetChar :: AlexInput -> Maybe (Char, AlexInput) alexGetChar (_, []) = Nothing alexGetChar (p, (c:cs)) = let p' = adv p c in Just (c, (p', cs)) -- use the Alex scanner to generate a list of tokens for the uulib token parsers tokenize :: String -> String -> [Token] tokenize filename str = go (initpos, str) where initpos = Pos 1 1 filename go inp@(pos, cs) = case alexScan inp 0 of AlexEOF -> [] AlexError inp' -> valueToken TkError [head cs] pos : go inp' AlexSkip inp' _ -> go inp' AlexToken inp' len act -> act (take len cs) pos : go inp' }