|
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 |
%}
|