Blame examples/pp.x

Packit 2cbdf3
%{
Packit 2cbdf3
import System
Packit 2cbdf3
import Char
Packit 2cbdf3
import Alex
Packit 2cbdf3
%}
Packit 2cbdf3
Packit 2cbdf3
Packit 2cbdf3
"pp_lx"/"pp_acts":-
Packit 2cbdf3
Packit 2cbdf3
{ ^s = ^w#^n                }		-- spaces and tabs, etc.
Packit 2cbdf3
{ ^f = [A-Za-z0-9`~%-_.,/'] }		-- file name character
Packit 2cbdf3
Packit 2cbdf3
  <inc> ::= ^#include^s+^"^f+^"^s*^n
Packit 2cbdf3
  <txt> ::= .*^n
Packit 2cbdf3
Packit 2cbdf3
Packit 2cbdf3
%{
Packit 2cbdf3
inc p c inp len cont st = pp fn >> cont st
Packit 2cbdf3
	where
Packit 2cbdf3
	fn = (takeWhile ('"'/=) . tail . dropWhile isSpace . drop 8) inp
Packit 2cbdf3
Packit 2cbdf3
txt p c inp len cont st = putStr (take len inp) >> cont st
Packit 2cbdf3
Packit 2cbdf3
Packit 2cbdf3
main:: IO ()
Packit 2cbdf3
main =	getArgs						>>= \args ->
Packit 2cbdf3
	case args of
Packit 2cbdf3
	  [fn] -> pp fn
Packit 2cbdf3
	  _ -> error "usage: pp file\n"
Packit 2cbdf3
	
Packit 2cbdf3
pp:: String -> IO ()
Packit 2cbdf3
pp fn = readFile fn >>= \cts -> gscan pp_scan () cts
Packit 2cbdf3
Packit 2cbdf3
pp_scan:: GScan () (IO ())
Packit 2cbdf3
pp_scan = load_gscan (pp_acts,stop_act) pp_lx
Packit 2cbdf3
	where
Packit 2cbdf3
	stop_act _ _ _ _ = return ()
Packit 2cbdf3
%}