packages feed

cpphs 1.5 → 1.6

raw patch · 40 files changed

+1916/−1656 lines, 40 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Language.Preprocessor.Cpphs: strip :: BoolOptions -> Bool
+ Language.Preprocessor.Cpphs: preInclude :: CpphsOptions -> [FilePath]
+ Language.Preprocessor.Cpphs: stripC89 :: BoolOptions -> Bool
+ Language.Preprocessor.Cpphs: stripEol :: BoolOptions -> Bool
- Language.Preprocessor.Cpphs: BoolOptions :: Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> BoolOptions
+ Language.Preprocessor.Cpphs: BoolOptions :: Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> BoolOptions
- Language.Preprocessor.Cpphs: CpphsOptions :: [FilePath] -> [FilePath] -> [(String, String)] -> [String] -> BoolOptions -> CpphsOptions
+ Language.Preprocessor.Cpphs: CpphsOptions :: [FilePath] -> [FilePath] -> [(String, String)] -> [String] -> [FilePath] -> BoolOptions -> CpphsOptions

Files

Language/Preprocessor/Cpphs/CppIfdef.hs view
@@ -73,22 +73,23 @@         def = defineMacro options (sym++" "++ maybe "1" id (un rest))         un v = if null v then Nothing else Just (unwords v)         keepIf p = if p then Keep else (Drop 1 False)-        skipn syms' ud xs' =+        skipn syms' retain ud xs' =             let n = 1 + length (filter (=='\n') l) in-            (if macros options then ((p,reslash l):)-                               else (replicate n (p,"") ++)) $+            (if macros options && retain then ((p,reslash l):)+                                         else (replicate n (p,"") ++)) $             cpp (newlines n p) syms' path options ud xs'     in case cmd of-	"define" -> skipn (insertST def syms) Keep xs-	"undef"  -> skipn (deleteST sym syms) Keep xs-	"ifndef" -> skipn syms (keepIf (not (definedST sym syms))) xs-	"ifdef"  -> skipn syms (keepIf      (definedST sym syms)) xs-	"if"     -> skipn syms (keepIf (gatherDefined p syms (unwords line))) xs-	"else"   -> skipn syms (Drop 1 False) xs-	"elif"   -> skipn syms (Drop 1 True) xs-	"endif"  -> skipn syms  Keep xs-	"pragma" -> skipn syms  Keep xs-        ('!':_)  -> skipn syms  Keep xs	-- \#!runhs scripts+	"define" -> skipn (insertST def syms) True Keep xs+	"undef"  -> skipn (deleteST sym syms) True Keep xs+	"ifndef" -> skipn syms False (keepIf (not (definedST sym syms))) xs+	"ifdef"  -> skipn syms False (keepIf      (definedST sym syms)) xs+	"if"     -> skipn syms False+                               (keepIf (gatherDefined p syms (unwords line))) xs+	"else"   -> skipn syms False (Drop 1 False) xs+	"elif"   -> skipn syms False (Drop 1 True) xs+	"endif"  -> skipn syms False  Keep xs+	"pragma" -> skipn syms True   Keep xs+        ('!':_)  -> skipn syms False  Keep xs	-- \#!runhs scripts 	"include"-> let (inc,content) = 	                  unsafePerformIO (readFirst (file syms (unwords line))                                                      p path@@ -99,8 +100,8 @@                                                   ++ cppline (newline p): xs) 	"warning"-> if warnings options then unsafePerformIO $ do                        hPutStrLn stderr (l++"\nin "++show p)-                       return $ skipn syms Keep xs-                    else skipn syms Keep xs+                       return $ skipn syms False Keep xs+                    else skipn syms False Keep xs 	"error"  -> error (l++"\nin "++show p) 	"line"   | all isDigit sym 	         -> (if locations options then ((p,l):) else id) $
Language/Preprocessor/Cpphs/MacroPass.hs view
@@ -42,7 +42,8 @@     . concat     . macroProcess (pragma options) (layout options) (lang options)                    (preDefine options syms)-    . tokenise (strip options) (ansi options) (lang options)+    . tokenise (stripEol options) (stripC89 options)+               (ansi options) (lang options)     . ((noPos,""):)	-- ensure recognition of "\n#" at start of file   where     safetail [] = []@@ -58,7 +59,7 @@ -- | Turn a string representing a macro definition into a 'HashDefine'. defineMacro :: BoolOptions -> String -> (String,HashDefine) defineMacro opts s =-    let (Cmd (Just hd):_) = tokenise True (ansi opts) (lang opts)+    let (Cmd (Just hd):_) = tokenise True True (ansi opts) (lang opts)                                      [(noPos,"\n#define "++s++"\n")]     in (name hd, hd) @@ -105,7 +106,7 @@                         -- r' : macroProcess layout st ws                         -- multi-level expansion:                         macroProcess pr layout lang st-                                     (tokenise True False lang [(p,r')]+                                     (tokenise True True False lang [(p,r')]                                       ++ ws)                     MacroExpansion {} ->                         case parseMacroCall p ws of@@ -122,7 +123,7 @@                                      --         macroProcess layout st ws'                                      -- multi-level expansion:                                      macroProcess pr layout lang st-                                         (tokenise True False lang+                                         (tokenise True True False lang                                               [(p,expandMacro hd args' layout)]                                          ++ ws') 
Language/Preprocessor/Cpphs/Options.hs view
@@ -20,6 +20,7 @@   ) where  import Maybe+import List (isPrefixOf)  -- | Cpphs options structure. data CpphsOptions = CpphsOptions @@ -27,6 +28,7 @@     , outfiles	:: [FilePath]     , defines	:: [(String,String)]     , includes	:: [String]+    , preInclude:: [FilePath]	-- ^ Files to #include before anything else     , boolopts	:: BoolOptions     } @@ -34,16 +36,18 @@ defaultCpphsOptions :: CpphsOptions defaultCpphsOptions = CpphsOptions { infiles = [], outfiles = []                                    , defines = [], includes = []+                                   , preInclude = []                                    , boolopts = defaultBoolOptions }  -- | Options representable as Booleans. data BoolOptions = BoolOptions     { macros	:: Bool  -- ^ Leave \#define and \#undef in output of ifdef?-    , locations	:: Bool	 -- ^ Place \#line droppings in output?-    , pragma	:: Bool  -- ^ Keep \#pragma in final output?-    , strip	:: Bool  -- ^ Remove C comments everywhere?+    , locations	:: Bool	 -- ^ Place #line droppings in output?+    , pragma	:: Bool  -- ^ Keep #pragma in final output?+    , stripEol	:: Bool  -- ^ Remove C eol (\/\/) comments everywhere?+    , stripC89	:: Bool  -- ^ Remove C inline (\/**\/) comments everywhere?     , lang	:: Bool  -- ^ Lex input as Haskell code?-    , ansi	:: Bool  -- ^ Permit stringise # and catenate ## operators?+    , ansi	:: Bool  -- ^ Permit stringise \# and catenate \#\# operators?     , layout	:: Bool  -- ^ Retain newlines in macro expansions?     , literate	:: Bool  -- ^ Remove literate markup?     , warnings	:: Bool  -- ^ Issue warnings?@@ -52,7 +56,8 @@ -- | Default settings of boolean options. defaultBoolOptions :: BoolOptions defaultBoolOptions = BoolOptions { macros   = True,   locations = True-                                 , pragma   = False,  strip     = False+                                 , pragma   = False+                                 , stripEol = False,  stripC89  = False                                  , lang     = True,   ansi      = False                                  , layout   = False,  literate  = False                                  , warnings = True }@@ -65,12 +70,14 @@     | Pragma     | Text     | Strip+    | StripEol     | Ansi     | Layout     | Unlit     | SuppressWarnings     | Macro (String,String)     | Path String+    | PreInclude FilePath       deriving (Eq, Show)  flags :: [(String, RawOption)]@@ -79,6 +86,7 @@         , ("--pragma",  Pragma)         , ("--text",    Text)         , ("--strip",   Strip)+        , ("--strip-eol",  StripEol)         , ("--hashes",  Ansi)         , ("--layout",  Layout)         , ("--unlit",   Unlit)@@ -93,6 +101,8 @@ rawOption ('-':'D':xs) = Just $ Macro (s, if null d then "1" else tail d)     where (s,d) = break (=='=') xs rawOption ('-':'I':xs) = Just $ Path $ trailing "/\\" xs+rawOption xs | "--include="`isPrefixOf`xs+            = Just $ PreInclude (drop 10 xs) rawOption _ = Nothing  trailing :: (Eq a) => [a] -> [a] -> [a]@@ -105,7 +115,8 @@     { macros	= not (NoMacro `elem` opts)     , locations	= not (NoLine  `elem` opts)     , pragma	=      Pragma  `elem` opts-    , strip	=      Strip   `elem` opts+    , stripEol	=      StripEol`elem` opts+    , stripC89	=      StripEol`elem` opts || Strip `elem` opts     , lang      = not (Text    `elem` opts)     , ansi	=      Ansi    `elem` opts     , layout	=      Layout  `elem` opts@@ -127,6 +138,7 @@                            , outfiles = reverse outs                            , defines  = [ x | Macro x <- reverse opts ]                            , includes = [ x | Path x  <- reverse opts ]+                           , preInclude=[ x | PreInclude x <- reverse opts ]                            , boolopts = boolOpts opts                            }     normalise ('/':'/':filepath) = normalise ('/':filepath)
Language/Preprocessor/Cpphs/RunCpphs.hs view
@@ -16,8 +16,11 @@ runCpphs :: CpphsOptions -> FilePath -> String -> String runCpphs options filename input =   let bools = boolopts options+      preInc = concatMap (\f->"#include \""++f++"\"\n") (preInclude options)+--             ++ "#line 1\n" -      pass1 = cppIfdef filename (defines options) (includes options) bools input+      pass1 = cppIfdef filename (defines options) (includes options) bools+                       (preInc++input)       pass2 = macroPass (defines options) bools pass1       result= if not (macros bools) then unlines (map snd pass1) else pass2       pass3 = if literate bools then Unlit.unlit filename else id
Language/Preprocessor/Cpphs/Tokenise.hs view
@@ -57,7 +57,7 @@ --   structures. data SubMode = Any | Pred (Char->Bool) (Posn->String->WordStyle)              | String Char | LineComment | NestComment Int-             | CComment+             | CComment | CLineComment  -- | Each token is classified as one of Ident, Other, or Cmd: --   * Ident is a word that could potentially match a macro name.@@ -83,9 +83,9 @@ --    * Any cpp line continuations are respected. --   No errors can be raised. --   The inverse of tokenise is (concatMap deWordStyle).-tokenise :: Bool -> Bool -> Bool -> [(Posn,String)] -> [WordStyle]-tokenise _     _    _     [] = []-tokenise strip ansi lang ((pos,str):pos_strs) =+tokenise :: Bool -> Bool -> Bool -> Bool -> [(Posn,String)] -> [WordStyle]+tokenise _        _             _    _     [] = []+tokenise stripEol stripComments ansi lang ((pos,str):pos_strs) =     (if lang then haskell else plaintext) Any [] pos pos_strs str  where     -- rules to lex Haskell@@ -98,8 +98,12 @@                                             haskell LineComment "--" p ls xs   haskell Any acc p ls ('{':'-':xs)       = emit acc $                                             haskell (NestComment 0) "-{" p ls xs-  haskell Any acc p ls ('/':'*':xs)|strip = emit acc $+  haskell Any acc p ls ('/':'*':xs)+                          | stripComments = emit acc $                                             haskell CComment "  " p ls xs+  haskell Any acc p ls ('/':'/':xs)+                          | stripEol      = emit acc $+                                            haskell CLineComment "  " p ls xs   haskell Any acc p ls ('"':xs)           = emit acc $                                             haskell (String '"') ['"'] p ls xs   haskell Any acc p ls ('\'':xs)          = emit acc $@@ -143,6 +147,9 @@   haskell CComment acc p ls ('*':'/':xs)  = emit ("  "++acc) $                                             haskell Any [] p ls xs   haskell CComment acc p ls (_:xs)        = haskell CComment (' ':acc) p ls xs+  haskell CLineComment acc p ls xs@('\n':_)= emit acc $ haskell Any [] p ls xs+  haskell CLineComment acc p ls (_:xs)    = haskell CLineComment (' ':acc)+                                                                       p ls xs   haskell mode acc _ ((p,l):ls) []        = haskell mode acc p ls ('\n':l)   haskell _    acc _ [] []                = emit acc $ [] @@ -200,24 +207,32 @@             -> String -> [WordStyle]   plaintext Any acc p ls ('\n':'#':xs)  = emit acc $  -- emit "\n" $                                           cpp Any plaintext [] [] p ls xs-  plaintext Any acc p ls ('/':'*':xs)|strip = emit acc $-                                              plaintext CComment "  " p ls xs-  plaintext Any acc p ls (x:xs) | single x  = emit acc $ emit [x] $-                                              plaintext Any [] p ls xs-  plaintext Any acc p ls (x:xs) | space x   = emit acc $-                                              plaintext (Pred space other) [x]+  plaintext Any acc p ls ('/':'*':xs)+                           | stripComments = emit acc $+                                             plaintext CComment "  " p ls xs+  plaintext Any acc p ls ('/':'/':xs)+                                | stripEol = emit acc $+                                             plaintext CLineComment "  " p ls xs+  plaintext Any acc p ls (x:xs) | single x = emit acc $ emit [x] $+                                             plaintext Any [] p ls xs+  plaintext Any acc p ls (x:xs) | space x  = emit acc $+                                             plaintext (Pred space other) [x]                                                                         p ls xs-  plaintext Any acc p ls (x:xs) | ident0 x  = emit acc $-                                              plaintext (Pred ident1 Ident) [x]+  plaintext Any acc p ls (x:xs) | ident0 x = emit acc $+                                             plaintext (Pred ident1 Ident) [x]                                                                         p ls xs-  plaintext Any acc p ls (x:xs)             = plaintext Any (x:acc) p ls xs+  plaintext Any acc p ls (x:xs)            = plaintext Any (x:acc) p ls xs   plaintext pre@(Pred pred ws) acc p ls (x:xs)-                                | pred x    = plaintext pre (x:acc) p ls xs-  plaintext (Pred _ ws) acc p ls xs         = ws p (reverse acc):-                                              plaintext Any [] p ls xs-  plaintext CComment acc p ls ('*':'/':xs)  = emit ("  "++acc) $-                                              plaintext Any [] p ls xs+                                | pred x   = plaintext pre (x:acc) p ls xs+  plaintext (Pred _ ws) acc p ls xs        = ws p (reverse acc):+                                             plaintext Any [] p ls xs+  plaintext CComment acc p ls ('*':'/':xs) = emit ("  "++acc) $+                                             plaintext Any [] p ls xs   plaintext CComment acc p ls (_:xs)    = plaintext CComment (' ':acc) p ls xs+  plaintext CLineComment acc p ls xs@('\n':_)+                                        = emit acc $ plaintext Any [] p ls xs+  plaintext CLineComment acc p ls (_:xs)= plaintext CLineComment (' ':acc)+                                                                       p ls xs   plaintext mode acc _ ((p,l):ls) []    = plaintext mode acc p ls ('\n':l)   plaintext _    acc _ [] []            = emit acc $ [] 
Language/Preprocessor/Unlit.hs view
@@ -16,8 +16,8 @@ 	 allProg (x:xs) = Program x:allProg xs classify (('>':x):xs)      = Program (' ':x) : classify xs classify (('#':x):xs)      = (case words x of-                                (line:file:_) | all isDigit line-                                   -> Include (read line) file+                                (line:rest) | all isDigit line+                                   -> Include (read line) (unwords rest)                                 _  -> Pre x                              ) : classify xs classify (x:xs) | all isSpace x = Blank:classify xs
Makefile view
@@ -1,5 +1,5 @@ LIBRARY	= cpphs-VERSION	= 1.5+VERSION	= 1.6  DIRS	= Language/Preprocessor/Cpphs \ 	  Text/ParserCombinators@@ -35,7 +35,7 @@ 	mkdir -p docs/$(LIBRARY) 	for dir in $(DIRS); do mkdir -p docs/$(LIBRARY)/$$dir; done 	for file in $(SRCS); \-	    do HsColour -anchorHTML $$file \+	    do HsColour -anchor -html $$file \ 	          >docs/$(LIBRARY)/`dirname $$file`/`basename $$file .hs`.html;\ 	    done 	haddock --html --title=$(LIBRARY) \@@ -48,4 +48,4 @@  $(LIBRARY): $(SRCS) 	$(HC) $(HFLAGS) $(HEAP) -o $@  $(SRCS)-	$(STRIP) $@+	$(HOSTSTRIP) $@
README view
@@ -14,8 +14,8 @@ USAGE ----- 	cpphs  [filename | -Dsym | -Dsym=val | -Ipath]+  [-Ofile]-               [ --nomacro | --noline | --nowarn | --strip | --pragma |-                 --text | --hashes | --layout | --unlit ]*+               [ --nomacro | --noline | --nowarn | --strip | --strip-eol |+                 --pragma | --text | --hashes | --layout | --unlit ]*                [ --cpp compatopts ]  For fuller details, see docs/index.html@@ -28,7 +28,7 @@  COPYRIGHT ----------Copyright (c) 2004-2007 Malcolm Wallace (Malcolm.Wallace@cs.york.ac.uk)+Copyright (c) 2004-2008 Malcolm Wallace (Malcolm.Wallace@cs.york.ac.uk) except for Text.ParserCombinators.HuttonMeijer (Copyright (c) 1995 Graham Hutton and Erik Meijer). 
cpphs.cabal view
@@ -1,6 +1,6 @@ Name: cpphs-Version: 1.5-Copyright: 2004-7, Malcolm Wallace+Version: 1.6+Copyright: 2004-8, Malcolm Wallace Build-Depends: base, haskell98 License: LGPL License-File: LICENCE-LGPL@@ -19,6 +19,7 @@ 	an option to unlit literate code files; and an option to turn 	off macro-expansion. Category: Development+Build-type: Simple Exposed-Modules: 	Language.Preprocessor.Cpphs 	Language.Preprocessor.Unlit
cpphs.hs view
@@ -19,7 +19,7 @@ import List   ( isPrefixOf )  version :: String-version = "1.5"+version = "1.6"  main :: IO () main = do@@ -32,10 +32,10 @@            exitWith ExitSuccess)   when ("--help" `elem` args)        (do putStrLn ("Usage: "++prog-                ++" [file ...] [ -Dsym | -Dsym=val | -Ipath ]*  [-Ofile]\n"-                ++"\t\t[--nomacro] [--noline] [--pragma] [--text]\n"-                ++"\t\t[--strip] [--hashes] [--layout] [--unlit]\n"-                ++"\t\t[ --cpp std-cpp-options ]")+              ++" [file ...] [ -Dsym | -Dsym=val | -Ipath ]*  [-Ofile]\n"+              ++"\t\t[--nomacro] [--noline] [--pragma] [--text]\n"+              ++"\t\t[--strip] [--strip-eol] [--hashes] [--layout] [--unlit]\n"+              ++"\t\t[ --cpp std-cpp-options ] [--include=filename]")            exitWith ExitSuccess)    let parsedArgs = parseOptions args@@ -89,8 +89,8 @@         f e (('-':x):xs) | "ansi" `isPrefixOf` x = f e{traditional=False} xs                          | "traditional" `isPrefixOf` x = f e{traditional=True} xs                          | "std" `isPrefixOf` x = f e xs -- ignore language spec-        f e ("-x":x:xs) = f e xs -- ignore langauge spec-        f e ("-include":x:xs) = x : f e xs+        f e ("-x":x:xs) = f e xs -- ignore language spec+        f e ("-include":x:xs) = ("--include="++x) : f e xs         f e ("-P":xs) = "--noline" : f e xs         f e (x:xs) | x == "-C" || x == "-CC" = f e{strip=False} xs         f e ("-A":x:xs) = f e xs -- strip assertions@@ -101,7 +101,8 @@         f e (x:xs) = f (if infile e == "-" then e{infile=x} else e{outfile=x}) xs                  f e [] = ["--hashes" | not (traditional e)] ++-                 ["--strip" | strip e] +++                 ["--strip" | traditional e && strip e] +++                 ["--strip-eol" | not (traditional e) && strip e] ++                  [infile e] ++                  ["-O" ++ outfile e | outfile e /= "-"] 
docs/cpphs/Language-Preprocessor-Cpphs-Options.html view
@@ -143,6 +143,12 @@ ></TR ><TR ><TD CLASS="recfield"+><A HREF="#v%3ApreInclude"+>preInclude</A+> :: [FilePath]</TD+></TR+><TR+><TD CLASS="recfield" ><A HREF="#v%3Aboolopts" >boolopts</A > :: <A HREF="Language-Preprocessor-Cpphs-Options.html#t%3ABoolOptions"@@ -185,12 +191,18 @@ ></TR ><TR ><TD CLASS="recfield"-><A HREF="#v%3Astrip"->strip</A+><A HREF="#v%3AstripEol"+>stripEol</A > :: Bool</TD ></TR ><TR ><TD CLASS="recfield"+><A HREF="#v%3AstripC89"+>stripC89</A+> :: Bool</TD+></TR+><TR+><TD CLASS="recfield" ><A HREF="#v%3Alang" >lang</A > :: Bool</TD@@ -363,6 +375,17 @@ ></TR ><TR ><TD CLASS="arg"+><A NAME="v%3ApreInclude"+></A+><B+>preInclude</B+> :: [FilePath]</TD+><TD CLASS="rdoc"+>Files to #include before anything else+</TD+></TR+><TR+><TD CLASS="arg" ><A NAME="v%3Aboolopts" ></A ><B@@ -469,17 +492,28 @@ ></TR ><TR ><TD CLASS="arg"-><A NAME="v%3Astrip"+><A NAME="v%3AstripEol" ></A ><B->strip</B+>stripEol</B > :: Bool</TD ><TD CLASS="rdoc"->Remove C comments everywhere?+>Remove C eol (//) comments everywhere? </TD ></TR ><TR ><TD CLASS="arg"+><A NAME="v%3AstripC89"+></A+><B+>stripC89</B+> :: Bool</TD+><TD CLASS="rdoc"+>Remove C inline (/**/) comments everywhere?+</TD+></TR+><TR+><TD CLASS="arg" ><A NAME="v%3Alang" ></A ><B@@ -497,9 +531,7 @@ >ansi</B > :: Bool</TD ><TD CLASS="rdoc"->Permit stringise <A NAME="%20and%20catenate%20%23"-></A-> operators?+>Permit stringise # and catenate ## operators? </TD ></TR ><TR
docs/cpphs/Language-Preprocessor-Cpphs-Tokenise.html view
@@ -134,7 +134,7 @@ ><TD CLASS="decl" ><A HREF="#v%3Atokenise" >tokenise</A-> :: Bool -&gt; Bool -&gt; Bool -&gt; [(<A HREF="Language-Preprocessor-Cpphs-Position.html#t%3APosn"+> :: Bool -&gt; Bool -&gt; Bool -&gt; Bool -&gt; [(<A HREF="Language-Preprocessor-Cpphs-Position.html#t%3APosn" >Posn</A >, String)] -&gt; [<A HREF="Language-Preprocessor-Cpphs-Tokenise.html#t%3AWordStyle" >WordStyle</A@@ -297,7 +297,7 @@ ></A ><B >tokenise</B-> :: Bool -&gt; Bool -&gt; Bool -&gt; [(<A HREF="Language-Preprocessor-Cpphs-Position.html#t%3APosn"+> :: Bool -&gt; Bool -&gt; Bool -&gt; Bool -&gt; [(<A HREF="Language-Preprocessor-Cpphs-Position.html#t%3APosn" >Posn</A >, String)] -&gt; [<A HREF="Language-Preprocessor-Cpphs-Tokenise.html#t%3AWordStyle" >WordStyle</A
docs/cpphs/Language-Preprocessor-Cpphs.html view
@@ -183,6 +183,12 @@ ></TR ><TR ><TD CLASS="recfield"+><A HREF="#v%3ApreInclude"+>preInclude</A+> :: [FilePath]</TD+></TR+><TR+><TD CLASS="recfield" ><A HREF="#v%3Aboolopts" >boolopts</A > :: <A HREF="Language-Preprocessor-Cpphs.html#t%3ABoolOptions"@@ -225,12 +231,18 @@ ></TR ><TR ><TD CLASS="recfield"-><A HREF="#v%3Astrip"->strip</A+><A HREF="#v%3AstripEol"+>stripEol</A > :: Bool</TD ></TR ><TR ><TD CLASS="recfield"+><A HREF="#v%3AstripC89"+>stripC89</A+> :: Bool</TD+></TR+><TR+><TD CLASS="recfield" ><A HREF="#v%3Alang" >lang</A > :: Bool</TD@@ -572,6 +584,17 @@ ></TR ><TR ><TD CLASS="arg"+><A NAME="v%3ApreInclude"+></A+><B+>preInclude</B+> :: [FilePath]</TD+><TD CLASS="rdoc"+>Files to #include before anything else+</TD+></TR+><TR+><TD CLASS="arg" ><A NAME="v%3Aboolopts" ></A ><B@@ -678,17 +701,28 @@ ></TR ><TR ><TD CLASS="arg"-><A NAME="v%3Astrip"+><A NAME="v%3AstripEol" ></A ><B->strip</B+>stripEol</B > :: Bool</TD ><TD CLASS="rdoc"->Remove C comments everywhere?+>Remove C eol (//) comments everywhere? </TD ></TR ><TR ><TD CLASS="arg"+><A NAME="v%3AstripC89"+></A+><B+>stripC89</B+> :: Bool</TD+><TD CLASS="rdoc"+>Remove C inline (/**/) comments everywhere?+</TD+></TR+><TR+><TD CLASS="arg" ><A NAME="v%3Alang" ></A ><B@@ -706,9 +740,7 @@ >ansi</B > :: Bool</TD ><TD CLASS="rdoc"->Permit stringise <A NAME="%20and%20catenate%20%23"-></A-> operators?+>Permit stringise # and catenate ## operators? </TD ></TR ><TR
docs/cpphs/Language/Preprocessor/Cpphs.html view
@@ -1,25 +1,28 @@-<pre><font color=Blue>-----------------------------------------------------------------------------</font>-<font color=Blue>-- |</font>-<font color=Blue>-- Module      :  Language.Preprocessor.Cpphs</font>-<font color=Blue>-- Copyright   :  2000-2006 Malcolm Wallace</font>-<font color=Blue>-- Licence     :  LGPL</font>-<font color=Blue>--</font>-<font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>-<font color=Blue>-- Stability   :  experimental</font>-<font color=Blue>-- Portability :  All</font>-<font color=Blue>--</font>-<font color=Blue>-- Include the interface that is exported</font>-<font color=Blue>-----------------------------------------------------------------------------</font>--<font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs-  <font color=Cyan>(</font> runCpphs<font color=Cyan>,</font> cppIfdef<font color=Cyan>,</font> macroPass<font color=Cyan>,</font> CpphsOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> BoolOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-  <font color=Cyan>,</font> parseOptions<font color=Cyan>,</font> defaultCpphsOptions<font color=Cyan>,</font> defaultBoolOptions-  <font color=Cyan>)</font> <font color=Green><u>where</u></font>--<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>CppIfdef<font color=Cyan>(</font>cppIfdef<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>MacroPass<font color=Cyan>(</font>macroPass<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>RunCpphs<font color=Cyan>(</font>runCpphs<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Options-       <font color=Cyan>(</font>CpphsOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> BoolOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> parseOptions-       <font color=Cyan>,</font>defaultCpphsOptions<font color=Cyan>,</font>defaultBoolOptions<font color=Cyan>)</font>+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">+<html>+<pre><a name="(line1)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line2)"></a><font color=Blue>-- |</font>+<a name="(line3)"></a><font color=Blue>-- Module      :  Language.Preprocessor.Cpphs</font>+<a name="(line4)"></a><font color=Blue>-- Copyright   :  2000-2006 Malcolm Wallace</font>+<a name="(line5)"></a><font color=Blue>-- Licence     :  LGPL</font>+<a name="(line6)"></a><font color=Blue>--</font>+<a name="(line7)"></a><font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>+<a name="(line8)"></a><font color=Blue>-- Stability   :  experimental</font>+<a name="(line9)"></a><font color=Blue>-- Portability :  All</font>+<a name="(line10)"></a><font color=Blue>--</font>+<a name="(line11)"></a><font color=Blue>-- Include the interface that is exported</font>+<a name="(line12)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line13)"></a>+<a name="(line14)"></a><font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs+<a name="(line15)"></a>  <font color=Cyan>(</font> runCpphs<font color=Cyan>,</font> cppIfdef<font color=Cyan>,</font> macroPass<font color=Cyan>,</font> CpphsOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> BoolOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="(line16)"></a>  <font color=Cyan>,</font> parseOptions<font color=Cyan>,</font> defaultCpphsOptions<font color=Cyan>,</font> defaultBoolOptions+<a name="(line17)"></a>  <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="(line18)"></a>+<a name="(line19)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>CppIfdef<font color=Cyan>(</font>cppIfdef<font color=Cyan>)</font>+<a name="(line20)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>MacroPass<font color=Cyan>(</font>macroPass<font color=Cyan>)</font>+<a name="(line21)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>RunCpphs<font color=Cyan>(</font>runCpphs<font color=Cyan>)</font>+<a name="(line22)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Options+<a name="(line23)"></a>       <font color=Cyan>(</font>CpphsOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> BoolOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> parseOptions+<a name="(line24)"></a>       <font color=Cyan>,</font>defaultCpphsOptions<font color=Cyan>,</font>defaultBoolOptions<font color=Cyan>)</font> </pre>+</html>
docs/cpphs/Language/Preprocessor/Cpphs/CppIfdef.html view
@@ -1,267 +1,271 @@-<pre><font color=Blue>-----------------------------------------------------------------------------</font>-<font color=Blue>-- |</font>-<font color=Blue>-- Module      :  CppIfdef</font>-<font color=Blue>-- Copyright   :  1999-2004 Malcolm Wallace</font>-<font color=Blue>-- Licence     :  LGPL</font>-<font color=Blue>-- </font>-<font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>-<font color=Blue>-- Stability   :  experimental</font>-<font color=Blue>-- Portability :  All</font>-<font color=Blue>--</font>-<font color=Blue>-- Perform a cpp.first-pass, gathering \#define's and evaluating \#ifdef's.</font>-<font color=Blue>-- and \#include's.</font>-<font color=Blue>-----------------------------------------------------------------------------</font>--<font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>CppIfdef-  <font color=Cyan>(</font> cppIfdef	<font color=Blue>-- :: FilePath -&gt; [(String,String)] -&gt; [String] -&gt; Options</font>-		<font color=Blue>--      -&gt; String -&gt; [(Posn,String)]</font>-  <font color=Cyan>)</font> <font color=Green><u>where</u></font>---<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>SymTab-<font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>HuttonMeijer-<font color=Blue>-- import HashDefine</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Position  <font color=Cyan>(</font>Posn<font color=Cyan>,</font>newfile<font color=Cyan>,</font>newline<font color=Cyan>,</font>newlines-                                             <font color=Cyan>,</font>cppline<font color=Cyan>,</font>newpos<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>ReadFirst <font color=Cyan>(</font>readFirst<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Tokenise  <font color=Cyan>(</font>linesCpp<font color=Cyan>,</font>reslash<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Options   <font color=Cyan>(</font>BoolOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>HashDefine<font color=Cyan>(</font>HashDefine<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font>parseHashDefine-                                             <font color=Cyan>,</font>expandMacro<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>MacroPass <font color=Cyan>(</font>preDefine<font color=Cyan>,</font>defineMacro<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Char      <font color=Cyan>(</font>isDigit<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Numeric   <font color=Cyan>(</font>readHex<font color=Cyan>,</font>readOct<font color=Cyan>,</font>readDec<font color=Cyan>)</font>-<font color=Green><u>import</u></font> System<font color=Cyan>.</font>IO<font color=Cyan>.</font>Unsafe <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>-<font color=Green><u>import</u></font> IO        <font color=Cyan>(</font>hPutStrLn<font color=Cyan>,</font>stderr<font color=Cyan>)</font>---<font color=Blue>-- | Run a first pass of cpp, evaluating \#ifdef's and processing \#include's,</font>-<font color=Blue>--   whilst taking account of \#define's and \#undef's as we encounter them.</font>-cppIfdef <font color=Red>::</font> FilePath		<font color=Blue>-- ^ File for error reports</font>-	<font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>	<font color=Blue>-- ^ Pre-defined symbols and their values</font>-	<font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font>		<font color=Blue>-- ^ Search path for \#includes</font>-	<font color=Red>-&gt;</font> BoolOptions		<font color=Blue>-- ^ Options controlling output style</font>-	<font color=Red>-&gt;</font> String		<font color=Blue>-- ^ The input file content</font>-	<font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>	<font color=Blue>-- ^ The file after processing (in lines)</font>-<a name="cppIfdef"></a>cppIfdef fp syms search options <font color=Red>=</font>-    cpp posn defs search options Keep <font color=Cyan>.</font> <font color=Cyan>(</font>cppline posn<font color=Red><b>:</b></font><font color=Cyan>)</font> <font color=Cyan>.</font> linesCpp-  <font color=Green><u>where</u></font>-    posn <font color=Red>=</font> newfile fp-    defs <font color=Red>=</font> preDefine options syms-<font color=Blue>-- Previous versions had a very simple symbol table  mapping strings</font>-<font color=Blue>-- to strings.  Now the #ifdef pass uses a more elaborate table, in</font>-<font color=Blue>-- particular to deal with parameterised macros in conditionals.</font>---<font color=Blue>-- | Internal state for whether lines are being kept or dropped.</font>-<font color=Blue>--   In @Drop n b@, @n@ is the depth of nesting, @b@ is whether</font>-<font color=Blue>--   we have already succeeded in keeping some lines in a chain of</font>-<font color=Blue>--   @elif@'s</font>-<a name="KeepState"></a><font color=Green><u>data</u></font> KeepState <font color=Red>=</font> Keep <font color=Red>|</font> Drop Int Bool--<font color=Blue>-- | Return just the list of lines that the real cpp would decide to keep.</font>-cpp <font color=Red>::</font> Posn <font color=Red>-&gt;</font> SymTab HashDefine <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> BoolOptions <font color=Red>-&gt;</font> KeepState-       <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>-<a name="cpp"></a>cpp <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Red>[</font><font color=Red>]</font> <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>--cpp p syms path options Keep <font color=Cyan>(</font>l<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font>-    <font color=Green><u>let</u></font> ws <font color=Red>=</font> words x-        cmd <font color=Red>=</font> head ws-        line <font color=Red>=</font> tail ws-        sym  <font color=Red>=</font> head <font color=Cyan>(</font>tail ws<font color=Cyan>)</font>-        rest <font color=Red>=</font> tail <font color=Cyan>(</font>tail ws<font color=Cyan>)</font>-        def <font color=Red>=</font> defineMacro options <font color=Cyan>(</font>sym<font color=Cyan>++</font><font color=Magenta>" "</font><font color=Cyan>++</font> maybe <font color=Magenta>"1"</font> id <font color=Cyan>(</font>un rest<font color=Cyan>)</font><font color=Cyan>)</font>-        un v <font color=Red>=</font> <font color=Green><u>if</u></font> null v <font color=Green><u>then</u></font> Nothing <font color=Green><u>else</u></font> Just <font color=Cyan>(</font>unwords v<font color=Cyan>)</font>-        keepIf p <font color=Red>=</font> <font color=Green><u>if</u></font> p <font color=Green><u>then</u></font> Keep <font color=Green><u>else</u></font> <font color=Cyan>(</font>Drop <font color=Magenta>1</font> False<font color=Cyan>)</font>-        skipn syms' ud xs' <font color=Red>=</font>-            <font color=Green><u>let</u></font> n <font color=Red>=</font> <font color=Magenta>1</font> <font color=Cyan>+</font> length <font color=Cyan>(</font>filter <font color=Cyan>(</font><font color=Cyan>==</font><font color=Magenta>'\n'</font><font color=Cyan>)</font> l<font color=Cyan>)</font> <font color=Green><u>in</u></font>-            <font color=Cyan>(</font><font color=Green><u>if</u></font> macros options <font color=Green><u>then</u></font> <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>reslash l<font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Cyan>)</font>-                               <font color=Green><u>else</u></font> <font color=Cyan>(</font>replicate n <font color=Cyan>(</font>p<font color=Cyan>,</font><font color=Magenta>""</font><font color=Cyan>)</font> <font color=Cyan>++</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>$</font>-            cpp <font color=Cyan>(</font>newlines n p<font color=Cyan>)</font> syms' path options ud xs'-    <font color=Green><u>in</u></font> <font color=Green><u>case</u></font> cmd <font color=Green><u>of</u></font>-	<font color=Magenta>"define"</font> <font color=Red>-&gt;</font> skipn <font color=Cyan>(</font>insertST def syms<font color=Cyan>)</font> Keep xs-	<font color=Magenta>"undef"</font>  <font color=Red>-&gt;</font> skipn <font color=Cyan>(</font>deleteST sym syms<font color=Cyan>)</font> Keep xs-	<font color=Magenta>"ifndef"</font> <font color=Red>-&gt;</font> skipn syms <font color=Cyan>(</font>keepIf <font color=Cyan>(</font>not <font color=Cyan>(</font>definedST sym syms<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> xs-	<font color=Magenta>"ifdef"</font>  <font color=Red>-&gt;</font> skipn syms <font color=Cyan>(</font>keepIf      <font color=Cyan>(</font>definedST sym syms<font color=Cyan>)</font><font color=Cyan>)</font> xs-	<font color=Magenta>"if"</font>     <font color=Red>-&gt;</font> skipn syms <font color=Cyan>(</font>keepIf <font color=Cyan>(</font>gatherDefined p syms <font color=Cyan>(</font>unwords line<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> xs-	<font color=Magenta>"else"</font>   <font color=Red>-&gt;</font> skipn syms <font color=Cyan>(</font>Drop <font color=Magenta>1</font> False<font color=Cyan>)</font> xs-	<font color=Magenta>"elif"</font>   <font color=Red>-&gt;</font> skipn syms <font color=Cyan>(</font>Drop <font color=Magenta>1</font> True<font color=Cyan>)</font> xs-	<font color=Magenta>"endif"</font>  <font color=Red>-&gt;</font> skipn syms  Keep xs-	<font color=Magenta>"pragma"</font> <font color=Red>-&gt;</font> skipn syms  Keep xs-        <font color=Cyan>(</font><font color=Magenta>'!'</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font>  <font color=Red>-&gt;</font> skipn syms  Keep xs	<font color=Blue>-- \#!runhs scripts</font>-	<font color=Magenta>"include"</font><font color=Red>-&gt;</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>inc<font color=Cyan>,</font>content<font color=Cyan>)</font> <font color=Red>=</font>-	                  unsafePerformIO <font color=Cyan>(</font>readFirst <font color=Cyan>(</font>file syms <font color=Cyan>(</font>unwords line<font color=Cyan>)</font><font color=Cyan>)</font>-                                                     p path-                                                     <font color=Cyan>(</font>warnings options<font color=Cyan>)</font><font color=Cyan>)</font>-	            <font color=Green><u>in</u></font>-		    cpp p syms path options Keep <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"#line 1 "</font><font color=Cyan>++</font>show inc<font color=Cyan>)</font>-                                                  <font color=Red><b>:</b></font> linesCpp content-                                                  <font color=Cyan>++</font> cppline <font color=Cyan>(</font>newline p<font color=Cyan>)</font><font color=Red><b>:</b></font> xs<font color=Cyan>)</font>-	<font color=Magenta>"warning"</font><font color=Red>-&gt;</font> <font color=Green><u>if</u></font> warnings options <font color=Green><u>then</u></font> unsafePerformIO <font color=Cyan>$</font> <font color=Green><u>do</u></font>-                       hPutStrLn stderr <font color=Cyan>(</font>l<font color=Cyan>++</font><font color=Magenta>"\nin "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>-                       return <font color=Cyan>$</font> skipn syms Keep xs-                    <font color=Green><u>else</u></font> skipn syms Keep xs-	<font color=Magenta>"error"</font>  <font color=Red>-&gt;</font> error <font color=Cyan>(</font>l<font color=Cyan>++</font><font color=Magenta>"\nin "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>-	<font color=Magenta>"line"</font>   <font color=Red>|</font> all isDigit sym-	         <font color=Red>-&gt;</font> <font color=Cyan>(</font><font color=Green><u>if</u></font> locations options <font color=Green><u>then</u></font> <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l<font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Cyan>)</font> <font color=Green><u>else</u></font> id<font color=Cyan>)</font> <font color=Cyan>$</font>-                    cpp <font color=Cyan>(</font>newpos <font color=Cyan>(</font>read sym<font color=Cyan>)</font> <font color=Cyan>(</font>un rest<font color=Cyan>)</font> p<font color=Cyan>)</font>-                        syms path options Keep xs-	n <font color=Red>|</font> all isDigit n-	         <font color=Red>-&gt;</font> <font color=Cyan>(</font><font color=Green><u>if</u></font> locations options <font color=Green><u>then</u></font> <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l<font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Cyan>)</font> <font color=Green><u>else</u></font> id<font color=Cyan>)</font> <font color=Cyan>$</font>-	            cpp <font color=Cyan>(</font>newpos <font color=Cyan>(</font>read n<font color=Cyan>)</font> <font color=Cyan>(</font>un <font color=Cyan>(</font>tail ws<font color=Cyan>)</font><font color=Cyan>)</font> p<font color=Cyan>)</font>-                        syms path options Keep xs-          <font color=Red>|</font> otherwise-	         <font color=Red>-&gt;</font> <font color=Green><u>if</u></font> warnings options <font color=Green><u>then</u></font> unsafePerformIO <font color=Cyan>$</font> <font color=Green><u>do</u></font>-                       hPutStrLn stderr <font color=Cyan>(</font><font color=Magenta>"Warning: unknown directive #"</font><font color=Cyan>++</font>n-                                        <font color=Cyan>++</font><font color=Magenta>"\nin "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>-                       return <font color=Cyan>$</font>-                         <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l<font color=Cyan>)</font><font color=Red><b>:</b></font> cpp <font color=Cyan>(</font>newline p<font color=Cyan>)</font> syms path options Keep xs<font color=Cyan>)</font>-                    <font color=Green><u>else</u></font>-                         <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l<font color=Cyan>)</font><font color=Red><b>:</b></font> cpp <font color=Cyan>(</font>newline p<font color=Cyan>)</font> syms path options Keep xs<font color=Cyan>)</font>--cpp p syms path options <font color=Cyan>(</font>Drop n b<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font>-    <font color=Green><u>let</u></font> ws <font color=Red>=</font> words x-        cmd <font color=Red>=</font> head ws-        delse    <font color=Red>|</font> n<font color=Cyan>==</font><font color=Magenta>1</font> <font color=Cyan>&amp;&amp;</font> b <font color=Red>=</font> Drop <font color=Magenta>1</font> b-                 <font color=Red>|</font> n<font color=Cyan>==</font><font color=Magenta>1</font>      <font color=Red>=</font> Keep-                 <font color=Red>|</font> otherwise <font color=Red>=</font> Drop n b-        dend     <font color=Red>|</font> n<font color=Cyan>==</font><font color=Magenta>1</font>      <font color=Red>=</font> Keep-                 <font color=Red>|</font> otherwise <font color=Red>=</font> Drop <font color=Cyan>(</font>n<font color=Blue>-</font><font color=Magenta>1</font><font color=Cyan>)</font> b-        delif s  <font color=Red>|</font> n<font color=Cyan>==</font><font color=Magenta>1</font> <font color=Cyan>&amp;&amp;</font> not b <font color=Cyan>&amp;&amp;</font> gatherDefined p syms s-                             <font color=Red>=</font> Keep-                 <font color=Red>|</font> otherwise <font color=Red>=</font> Drop n b-        skipn ud xs' <font color=Red>=</font>-                 <font color=Green><u>let</u></font> n' <font color=Red>=</font> <font color=Magenta>1</font> <font color=Cyan>+</font> length <font color=Cyan>(</font>filter <font color=Cyan>(</font><font color=Cyan>==</font><font color=Magenta>'\n'</font><font color=Cyan>)</font> x<font color=Cyan>)</font> <font color=Green><u>in</u></font>-                 replicate n' <font color=Cyan>(</font>p<font color=Cyan>,</font><font color=Magenta>""</font><font color=Cyan>)</font>-                 <font color=Cyan>++</font> cpp <font color=Cyan>(</font>newlines n' p<font color=Cyan>)</font> syms path options ud xs'-    <font color=Green><u>in</u></font>-    <font color=Green><u>if</u></font>      cmd <font color=Cyan>==</font> <font color=Magenta>"ifndef"</font> <font color=Cyan>||</font>-            cmd <font color=Cyan>==</font> <font color=Magenta>"if"</font>     <font color=Cyan>||</font>-            cmd <font color=Cyan>==</font> <font color=Magenta>"ifdef"</font>  <font color=Green><u>then</u></font>  skipn <font color=Cyan>(</font>Drop <font color=Cyan>(</font>n<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> b<font color=Cyan>)</font> xs-    <font color=Green><u>else</u></font> <font color=Green><u>if</u></font> cmd <font color=Cyan>==</font> <font color=Magenta>"elif"</font>   <font color=Green><u>then</u></font>  skipn <font color=Cyan>(</font>delif <font color=Cyan>(</font>unwords <font color=Cyan>(</font>tail ws<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> xs-    <font color=Green><u>else</u></font> <font color=Green><u>if</u></font> cmd <font color=Cyan>==</font> <font color=Magenta>"else"</font>   <font color=Green><u>then</u></font>  skipn  delse xs-    <font color=Green><u>else</u></font> <font color=Green><u>if</u></font> cmd <font color=Cyan>==</font> <font color=Magenta>"endif"</font>  <font color=Green><u>then</u></font>  skipn  dend  xs-    <font color=Green><u>else</u></font> skipn <font color=Cyan>(</font>Drop n b<font color=Cyan>)</font> xs-	<font color=Blue>-- define, undef, include, error, warning, pragma, line</font>--cpp p syms path options Keep <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font>-    <font color=Green><u>let</u></font> p' <font color=Red>=</font> newline p <font color=Green><u>in</u></font> seq p' <font color=Cyan>$</font>-    <font color=Cyan>(</font>p<font color=Cyan>,</font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>  cpp p' syms path options Keep xs-cpp p syms path options d<font color=Red>@</font><font color=Cyan>(</font>Drop <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font>-    <font color=Green><u>let</u></font> p' <font color=Red>=</font> newline p <font color=Green><u>in</u></font> seq p' <font color=Cyan>$</font>-    <font color=Cyan>(</font>p<font color=Cyan>,</font><font color=Magenta>""</font><font color=Cyan>)</font><font color=Red><b>:</b></font> cpp p' syms path options d xs---<font color=Blue>----</font>-gatherDefined <font color=Red>::</font> Posn <font color=Red>-&gt;</font> SymTab HashDefine <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> Bool-<a name="gatherDefined"></a>gatherDefined p st inp <font color=Red>=</font>-  <font color=Green><u>case</u></font> papply <font color=Cyan>(</font>parseBoolExp st<font color=Cyan>)</font> inp <font color=Green><u>of</u></font>-    <font color=Red>[</font><font color=Red>]</font>      <font color=Red>-&gt;</font> error <font color=Cyan>(</font><font color=Magenta>"Cannot parse #if directive in file "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>-    <font color=Red>[</font><font color=Cyan>(</font>b<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-&gt;</font> b-    <font color=Green><u>_</u></font>       <font color=Red>-&gt;</font> error <font color=Cyan>(</font><font color=Magenta>"Ambiguous parse for #if directive in file "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>--parseBoolExp <font color=Red>::</font> SymTab HashDefine <font color=Red>-&gt;</font> Parser Bool-<a name="parseBoolExp"></a>parseBoolExp st <font color=Red>=</font>-  <font color=Green><u>do</u></font>  a <font color=Red>&lt;-</font> parseExp1 st-      skip <font color=Cyan>(</font>string <font color=Magenta>"||"</font><font color=Cyan>)</font>-      b <font color=Red>&lt;-</font> first <font color=Cyan>(</font>skip <font color=Cyan>(</font>parseBoolExp st<font color=Cyan>)</font><font color=Cyan>)</font>-      return <font color=Cyan>(</font>a <font color=Cyan>||</font> b<font color=Cyan>)</font>-  <font color=Cyan>+++</font>-      parseExp1 st--parseExp1 <font color=Red>::</font> SymTab HashDefine <font color=Red>-&gt;</font> Parser Bool-<a name="parseExp1"></a>parseExp1 st <font color=Red>=</font>-  <font color=Green><u>do</u></font>  a <font color=Red>&lt;-</font> parseExp0 st-      skip <font color=Cyan>(</font>string <font color=Magenta>"&amp;&amp;"</font><font color=Cyan>)</font>-      b <font color=Red>&lt;-</font> first <font color=Cyan>(</font>skip <font color=Cyan>(</font>parseExp1 st<font color=Cyan>)</font><font color=Cyan>)</font>-      return <font color=Cyan>(</font>a <font color=Cyan>&amp;&amp;</font> b<font color=Cyan>)</font>-  <font color=Cyan>+++</font>-      parseExp0 st--parseExp0 <font color=Red>::</font> SymTab HashDefine <font color=Red>-&gt;</font> Parser Bool-<a name="parseExp0"></a>parseExp0 st <font color=Red>=</font>-  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>string <font color=Magenta>"defined"</font><font color=Cyan>)</font>-      sym <font color=Red>&lt;-</font> parens parseSym-      return <font color=Cyan>(</font>definedST sym st<font color=Cyan>)</font>-  <font color=Cyan>+++</font>-  <font color=Green><u>do</u></font>  parens <font color=Cyan>(</font>parseBoolExp st<font color=Cyan>)</font>-  <font color=Cyan>+++</font>-  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>char <font color=Magenta>'!'</font><font color=Cyan>)</font>-      a <font color=Red>&lt;-</font> parseExp0 st-      return <font color=Cyan>(</font>not a<font color=Cyan>)</font>-  <font color=Cyan>+++</font>-  <font color=Green><u>do</u></font>  sym1 <font color=Red>&lt;-</font> parseSymOrCall st-      op <font color=Red>&lt;-</font> parseOp st-      sym2 <font color=Red>&lt;-</font> parseSymOrCall st-      return <font color=Cyan>(</font>op <font color=Cyan>(</font>safeRead sym1<font color=Cyan>)</font> <font color=Cyan>(</font>safeRead sym2<font color=Cyan>)</font><font color=Cyan>)</font>-  <font color=Cyan>+++</font>-  <font color=Green><u>do</u></font>  sym <font color=Red>&lt;-</font> parseSymOrCall st-      <font color=Green><u>case</u></font> safeRead sym <font color=Green><u>of</u></font>-        <font color=Magenta>0</font> <font color=Red>-&gt;</font> return False-        <font color=Green><u>_</u></font> <font color=Red>-&gt;</font> return True-  <font color=Green><u>where</u></font>-    safeRead s <font color=Red>=</font>-      <font color=Green><u>case</u></font> s <font color=Green><u>of</u></font>-        <font color=Magenta>'0'</font><font color=Red><b>:</b></font><font color=Magenta>'x'</font><font color=Red><b>:</b></font>s' <font color=Red>-&gt;</font> number readHex s'-        <font color=Magenta>'0'</font><font color=Red><b>:</b></font><font color=Magenta>'o'</font><font color=Red><b>:</b></font>s' <font color=Red>-&gt;</font> number readOct s'-        <font color=Green><u>_</u></font>          <font color=Red>-&gt;</font> number readDec s-    number rd s <font color=Red>=</font>-      <font color=Green><u>case</u></font> rd s <font color=Green><u>of</u></font>-        <font color=Red>[</font><font color=Red>]</font>        <font color=Red>-&gt;</font> <font color=Magenta>0</font> <font color=Red>::</font> Integer-        <font color=Cyan>(</font><font color=Cyan>(</font>n<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-&gt;</font> n <font color=Red>::</font> Integer--parseOp <font color=Red>::</font> SymTab HashDefine <font color=Red>-&gt;</font> Parser <font color=Cyan>(</font>Integer <font color=Red>-&gt;</font> Integer <font color=Red>-&gt;</font> Bool<font color=Cyan>)</font>-<a name="parseOp"></a>parseOp <font color=Green><u>_</u></font> <font color=Red>=</font>-  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>string <font color=Magenta>"&gt;="</font><font color=Cyan>)</font>-      return <font color=Cyan>(</font><font color=Cyan>&gt;=</font><font color=Cyan>)</font>-  <font color=Cyan>+++</font>-  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>char <font color=Magenta>'&gt;'</font><font color=Cyan>)</font>-      return <font color=Cyan>(</font><font color=Cyan>&gt;</font><font color=Cyan>)</font>-  <font color=Cyan>+++</font>-  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>string <font color=Magenta>"&lt;="</font><font color=Cyan>)</font>-      return <font color=Cyan>(</font><font color=Cyan>&lt;=</font><font color=Cyan>)</font>-  <font color=Cyan>+++</font>-  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>char <font color=Magenta>'&lt;'</font><font color=Cyan>)</font>-      return <font color=Cyan>(</font><font color=Cyan>&lt;</font><font color=Cyan>)</font>-  <font color=Cyan>+++</font>-  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>string <font color=Magenta>"=="</font><font color=Cyan>)</font>-      return <font color=Cyan>(</font><font color=Cyan>==</font><font color=Cyan>)</font>-  <font color=Cyan>+++</font>-  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>string <font color=Magenta>"!="</font><font color=Cyan>)</font>-      return <font color=Cyan>(</font><font color=Cyan>/=</font><font color=Cyan>)</font>--parseSymOrCall <font color=Red>::</font> SymTab HashDefine <font color=Red>-&gt;</font> Parser String-<a name="parseSymOrCall"></a>parseSymOrCall st <font color=Red>=</font>-  <font color=Green><u>do</u></font>  sym <font color=Red>&lt;-</font> skip parseSym-      args <font color=Red>&lt;-</font> parens <font color=Cyan>(</font>parseSymOrCall st <font color=Cyan>`sepby`</font> skip <font color=Cyan>(</font>char <font color=Magenta>','</font><font color=Cyan>)</font><font color=Cyan>)</font>-      return <font color=Cyan>(</font>convert sym args<font color=Cyan>)</font>-  <font color=Cyan>+++</font>-  <font color=Green><u>do</u></font>  sym <font color=Red>&lt;-</font> skip parseSym-      return <font color=Cyan>(</font>convert sym <font color=Red>[</font><font color=Red>]</font><font color=Cyan>)</font>-  <font color=Green><u>where</u></font>-    convert sym args <font color=Red>=</font>-      <font color=Green><u>case</u></font> lookupST sym st <font color=Green><u>of</u></font>-        Nothing  <font color=Red>-&gt;</font> sym-        Just <font color=Cyan>(</font>a<font color=Red>@</font>SymbolReplacement<font color=Cyan>{</font><font color=Cyan>}</font><font color=Cyan>)</font> <font color=Red>-&gt;</font> recursivelyExpand st <font color=Cyan>(</font>replacement a<font color=Cyan>)</font>-        Just <font color=Cyan>(</font>a<font color=Red>@</font>MacroExpansion<font color=Cyan>{</font><font color=Cyan>}</font><font color=Cyan>)</font>    <font color=Red>-&gt;</font> expandMacro a args False--recursivelyExpand <font color=Red>::</font> SymTab HashDefine <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> String-<a name="recursivelyExpand"></a>recursivelyExpand st inp <font color=Red>=</font>-  <font color=Green><u>case</u></font> papply <font color=Cyan>(</font>parseSymOrCall st<font color=Cyan>)</font> inp <font color=Green><u>of</u></font>-    <font color=Red>[</font><font color=Cyan>(</font>b<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-&gt;</font> b-    <font color=Green><u>_</u></font>       <font color=Red>-&gt;</font> inp--parseSym <font color=Red>::</font> Parser String-<a name="parseSym"></a>parseSym <font color=Red>=</font> many1 <font color=Cyan>(</font>alphanum<font color=Cyan>+++</font>char <font color=Magenta>'\''</font><font color=Cyan>+++</font>char <font color=Magenta>'`'</font><font color=Cyan>)</font>--<a name="parens"></a>parens p <font color=Red>=</font> bracket <font color=Cyan>(</font>skip <font color=Cyan>(</font>char <font color=Magenta>'('</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>skip p<font color=Cyan>)</font> <font color=Cyan>(</font>skip <font color=Cyan>(</font>char <font color=Magenta>')'</font><font color=Cyan>)</font><font color=Cyan>)</font>--<font color=Blue>-- | Determine filename in \#include</font>-file <font color=Red>::</font> SymTab HashDefine <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> String-<a name="file"></a>file st name <font color=Red>=</font>-    <font color=Green><u>case</u></font> name <font color=Green><u>of</u></font>-      <font color=Cyan>(</font><font color=Magenta>'"'</font><font color=Red><b>:</b></font>ns<font color=Cyan>)</font> <font color=Red>-&gt;</font> init ns-      <font color=Cyan>(</font><font color=Magenta>'&lt;'</font><font color=Red><b>:</b></font>ns<font color=Cyan>)</font> <font color=Red>-&gt;</font> init ns-      <font color=Green><u>_</u></font> <font color=Red>-&gt;</font> <font color=Green><u>let</u></font> ex <font color=Red>=</font> recursivelyExpand st name <font color=Green><u>in</u></font>-           <font color=Green><u>if</u></font> ex <font color=Cyan>==</font> name <font color=Green><u>then</u></font> name <font color=Green><u>else</u></font> file st ex+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">+<html>+<pre><a name="(line1)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line2)"></a><font color=Blue>-- |</font>+<a name="(line3)"></a><font color=Blue>-- Module      :  CppIfdef</font>+<a name="(line4)"></a><font color=Blue>-- Copyright   :  1999-2004 Malcolm Wallace</font>+<a name="(line5)"></a><font color=Blue>-- Licence     :  LGPL</font>+<a name="(line6)"></a><font color=Blue>-- </font>+<a name="(line7)"></a><font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>+<a name="(line8)"></a><font color=Blue>-- Stability   :  experimental</font>+<a name="(line9)"></a><font color=Blue>-- Portability :  All</font>+<a name="(line10)"></a><font color=Blue>--</font>+<a name="(line11)"></a><font color=Blue>-- Perform a cpp.first-pass, gathering \#define's and evaluating \#ifdef's.</font>+<a name="(line12)"></a><font color=Blue>-- and \#include's.</font>+<a name="(line13)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line14)"></a>+<a name="(line15)"></a><font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>CppIfdef+<a name="(line16)"></a>  <font color=Cyan>(</font> cppIfdef	<font color=Blue>-- :: FilePath -&gt; [(String,String)] -&gt; [String] -&gt; Options</font>+<a name="(line17)"></a>		<font color=Blue>--      -&gt; String -&gt; [(Posn,String)]</font>+<a name="(line18)"></a>  <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="(line19)"></a>+<a name="(line20)"></a>+<a name="(line21)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>SymTab+<a name="(line22)"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>HuttonMeijer+<a name="(line23)"></a><font color=Blue>-- import HashDefine</font>+<a name="(line24)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Position  <font color=Cyan>(</font>Posn<font color=Cyan>,</font>newfile<font color=Cyan>,</font>newline<font color=Cyan>,</font>newlines+<a name="(line25)"></a>                                             <font color=Cyan>,</font>cppline<font color=Cyan>,</font>newpos<font color=Cyan>)</font>+<a name="(line26)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>ReadFirst <font color=Cyan>(</font>readFirst<font color=Cyan>)</font>+<a name="(line27)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Tokenise  <font color=Cyan>(</font>linesCpp<font color=Cyan>,</font>reslash<font color=Cyan>)</font>+<a name="(line28)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Options   <font color=Cyan>(</font>BoolOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line29)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>HashDefine<font color=Cyan>(</font>HashDefine<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font>parseHashDefine+<a name="(line30)"></a>                                             <font color=Cyan>,</font>expandMacro<font color=Cyan>)</font>+<a name="(line31)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>MacroPass <font color=Cyan>(</font>preDefine<font color=Cyan>,</font>defineMacro<font color=Cyan>)</font>+<a name="(line32)"></a><font color=Green><u>import</u></font> Char      <font color=Cyan>(</font>isDigit<font color=Cyan>)</font>+<a name="(line33)"></a><font color=Green><u>import</u></font> Numeric   <font color=Cyan>(</font>readHex<font color=Cyan>,</font>readOct<font color=Cyan>,</font>readDec<font color=Cyan>)</font>+<a name="(line34)"></a><font color=Green><u>import</u></font> System<font color=Cyan>.</font>IO<font color=Cyan>.</font>Unsafe <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>+<a name="(line35)"></a><font color=Green><u>import</u></font> IO        <font color=Cyan>(</font>hPutStrLn<font color=Cyan>,</font>stderr<font color=Cyan>)</font>+<a name="(line36)"></a>+<a name="(line37)"></a>+<a name="(line38)"></a><a name="cppIfdef"></a><font color=Blue>-- | Run a first pass of cpp, evaluating \#ifdef's and processing \#include's,</font>+<a name="(line39)"></a><font color=Blue>--   whilst taking account of \#define's and \#undef's as we encounter them.</font>+<a name="(line40)"></a>cppIfdef <font color=Red>::</font> FilePath		<font color=Blue>-- ^ File for error reports</font>+<a name="(line41)"></a>	<font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>	<font color=Blue>-- ^ Pre-defined symbols and their values</font>+<a name="(line42)"></a>	<font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font>		<font color=Blue>-- ^ Search path for \#includes</font>+<a name="(line43)"></a>	<font color=Red>-&gt;</font> BoolOptions		<font color=Blue>-- ^ Options controlling output style</font>+<a name="(line44)"></a>	<font color=Red>-&gt;</font> String		<font color=Blue>-- ^ The input file content</font>+<a name="(line45)"></a>	<font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>	<font color=Blue>-- ^ The file after processing (in lines)</font>+<a name="(line46)"></a>cppIfdef fp syms search options <font color=Red>=</font>+<a name="(line47)"></a>    cpp posn defs search options Keep <font color=Cyan>.</font> <font color=Cyan>(</font>cppline posn<font color=Red><b>:</b></font><font color=Cyan>)</font> <font color=Cyan>.</font> linesCpp+<a name="(line48)"></a>  <font color=Green><u>where</u></font>+<a name="(line49)"></a>    posn <font color=Red>=</font> newfile fp+<a name="(line50)"></a>    defs <font color=Red>=</font> preDefine options syms+<a name="(line51)"></a><font color=Blue>-- Previous versions had a very simple symbol table  mapping strings</font>+<a name="(line52)"></a><font color=Blue>-- to strings.  Now the #ifdef pass uses a more elaborate table, in</font>+<a name="(line53)"></a><font color=Blue>-- particular to deal with parameterised macros in conditionals.</font>+<a name="(line54)"></a>+<a name="(line55)"></a>+<a name="(line56)"></a><a name="KeepState"></a><font color=Blue>-- | Internal state for whether lines are being kept or dropped.</font>+<a name="(line57)"></a><a name="KeepState"></a><font color=Blue>--   In @Drop n b@, @n@ is the depth of nesting, @b@ is whether</font>+<a name="(line58)"></a><a name="KeepState"></a><font color=Blue>--   we have already succeeded in keeping some lines in a chain of</font>+<a name="(line59)"></a><a name="KeepState"></a><font color=Blue>--   @elif@'s</font>+<a name="(line60)"></a><a name="KeepState"></a><font color=Green><u>data</u></font> KeepState <font color=Red>=</font> Keep <font color=Red>|</font> Drop Int Bool+<a name="(line61)"></a>+<a name="(line62)"></a><a name="cpp"></a><font color=Blue>-- | Return just the list of lines that the real cpp would decide to keep.</font>+<a name="(line63)"></a>cpp <font color=Red>::</font> Posn <font color=Red>-&gt;</font> SymTab HashDefine <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> BoolOptions <font color=Red>-&gt;</font> KeepState+<a name="(line64)"></a>       <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>+<a name="(line65)"></a>cpp <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> [] <font color=Red>=</font> []+<a name="(line66)"></a>+<a name="(line67)"></a>cpp p syms path options Keep <font color=Cyan>(</font>l<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="(line68)"></a>    <font color=Green><u>let</u></font> ws <font color=Red>=</font> words x+<a name="(line69)"></a>        cmd <font color=Red>=</font> head ws+<a name="(line70)"></a>        line <font color=Red>=</font> tail ws+<a name="(line71)"></a>        sym  <font color=Red>=</font> head <font color=Cyan>(</font>tail ws<font color=Cyan>)</font>+<a name="(line72)"></a>        rest <font color=Red>=</font> tail <font color=Cyan>(</font>tail ws<font color=Cyan>)</font>+<a name="(line73)"></a>        def <font color=Red>=</font> defineMacro options <font color=Cyan>(</font>sym<font color=Cyan>++</font><font color=Magenta>" "</font><font color=Cyan>++</font> maybe <font color=Magenta>"1"</font> id <font color=Cyan>(</font>un rest<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line74)"></a>        un v <font color=Red>=</font> <font color=Green><u>if</u></font> null v <font color=Green><u>then</u></font> Nothing <font color=Green><u>else</u></font> Just <font color=Cyan>(</font>unwords v<font color=Cyan>)</font>+<a name="(line75)"></a>        keepIf p <font color=Red>=</font> <font color=Green><u>if</u></font> p <font color=Green><u>then</u></font> Keep <font color=Green><u>else</u></font> <font color=Cyan>(</font>Drop <font color=Magenta>1</font> False<font color=Cyan>)</font>+<a name="(line76)"></a>        skipn syms' retain ud xs' <font color=Red>=</font>+<a name="(line77)"></a>            <font color=Green><u>let</u></font> n <font color=Red>=</font> <font color=Magenta>1</font> <font color=Cyan>+</font> length <font color=Cyan>(</font>filter <font color=Cyan>(</font><font color=Cyan>==</font><font color=Magenta>'\n'</font><font color=Cyan>)</font> l<font color=Cyan>)</font> <font color=Green><u>in</u></font>+<a name="(line78)"></a>            <font color=Cyan>(</font><font color=Green><u>if</u></font> macros options <font color=Cyan>&amp;&amp;</font> retain <font color=Green><u>then</u></font> <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>reslash l<font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Cyan>)</font>+<a name="(line79)"></a>                                         <font color=Green><u>else</u></font> <font color=Cyan>(</font>replicate n <font color=Cyan>(</font>p<font color=Cyan>,</font><font color=Magenta>""</font><font color=Cyan>)</font> <font color=Cyan>++</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>$</font>+<a name="(line80)"></a>            cpp <font color=Cyan>(</font>newlines n p<font color=Cyan>)</font> syms' path options ud xs'+<a name="(line81)"></a>    <font color=Green><u>in</u></font> <font color=Green><u>case</u></font> cmd <font color=Green><u>of</u></font>+<a name="(line82)"></a>	<font color=Magenta>"define"</font> <font color=Red>-&gt;</font> skipn <font color=Cyan>(</font>insertST def syms<font color=Cyan>)</font> True Keep xs+<a name="(line83)"></a>	<font color=Magenta>"undef"</font>  <font color=Red>-&gt;</font> skipn <font color=Cyan>(</font>deleteST sym syms<font color=Cyan>)</font> True Keep xs+<a name="(line84)"></a>	<font color=Magenta>"ifndef"</font> <font color=Red>-&gt;</font> skipn syms False <font color=Cyan>(</font>keepIf <font color=Cyan>(</font>not <font color=Cyan>(</font>definedST sym syms<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> xs+<a name="(line85)"></a>	<font color=Magenta>"ifdef"</font>  <font color=Red>-&gt;</font> skipn syms False <font color=Cyan>(</font>keepIf      <font color=Cyan>(</font>definedST sym syms<font color=Cyan>)</font><font color=Cyan>)</font> xs+<a name="(line86)"></a>	<font color=Magenta>"if"</font>     <font color=Red>-&gt;</font> skipn syms False+<a name="(line87)"></a>                               <font color=Cyan>(</font>keepIf <font color=Cyan>(</font>gatherDefined p syms <font color=Cyan>(</font>unwords line<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> xs+<a name="(line88)"></a>	<font color=Magenta>"else"</font>   <font color=Red>-&gt;</font> skipn syms False <font color=Cyan>(</font>Drop <font color=Magenta>1</font> False<font color=Cyan>)</font> xs+<a name="(line89)"></a>	<font color=Magenta>"elif"</font>   <font color=Red>-&gt;</font> skipn syms False <font color=Cyan>(</font>Drop <font color=Magenta>1</font> True<font color=Cyan>)</font> xs+<a name="(line90)"></a>	<font color=Magenta>"endif"</font>  <font color=Red>-&gt;</font> skipn syms False  Keep xs+<a name="(line91)"></a>	<font color=Magenta>"pragma"</font> <font color=Red>-&gt;</font> skipn syms True   Keep xs+<a name="(line92)"></a>        <font color=Cyan>(</font><font color=Magenta>'!'</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font>  <font color=Red>-&gt;</font> skipn syms False  Keep xs	<font color=Blue>-- \#!runhs scripts</font>+<a name="(line93)"></a>	<font color=Magenta>"include"</font><font color=Red>-&gt;</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>inc<font color=Cyan>,</font>content<font color=Cyan>)</font> <font color=Red>=</font>+<a name="(line94)"></a>	                  unsafePerformIO <font color=Cyan>(</font>readFirst <font color=Cyan>(</font>file syms <font color=Cyan>(</font>unwords line<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line95)"></a>                                                     p path+<a name="(line96)"></a>                                                     <font color=Cyan>(</font>warnings options<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line97)"></a>	            <font color=Green><u>in</u></font>+<a name="(line98)"></a>		    cpp p syms path options Keep <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"#line 1 "</font><font color=Cyan>++</font>show inc<font color=Cyan>)</font>+<a name="(line99)"></a>                                                  <font color=Red><b>:</b></font> linesCpp content+<a name="(line100)"></a>                                                  <font color=Cyan>++</font> cppline <font color=Cyan>(</font>newline p<font color=Cyan>)</font><font color=Red><b>:</b></font> xs<font color=Cyan>)</font>+<a name="(line101)"></a>	<font color=Magenta>"warning"</font><font color=Red>-&gt;</font> <font color=Green><u>if</u></font> warnings options <font color=Green><u>then</u></font> unsafePerformIO <font color=Cyan>$</font> <font color=Green><u>do</u></font>+<a name="(line102)"></a>                       hPutStrLn stderr <font color=Cyan>(</font>l<font color=Cyan>++</font><font color=Magenta>"\nin "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>+<a name="(line103)"></a>                       return <font color=Cyan>$</font> skipn syms False Keep xs+<a name="(line104)"></a>                    <font color=Green><u>else</u></font> skipn syms False Keep xs+<a name="(line105)"></a>	<font color=Magenta>"error"</font>  <font color=Red>-&gt;</font> error <font color=Cyan>(</font>l<font color=Cyan>++</font><font color=Magenta>"\nin "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>+<a name="(line106)"></a>	<font color=Magenta>"line"</font>   <font color=Red>|</font> all isDigit sym+<a name="(line107)"></a>	         <font color=Red>-&gt;</font> <font color=Cyan>(</font><font color=Green><u>if</u></font> locations options <font color=Green><u>then</u></font> <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l<font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Cyan>)</font> <font color=Green><u>else</u></font> id<font color=Cyan>)</font> <font color=Cyan>$</font>+<a name="(line108)"></a>                    cpp <font color=Cyan>(</font>newpos <font color=Cyan>(</font>read sym<font color=Cyan>)</font> <font color=Cyan>(</font>un rest<font color=Cyan>)</font> p<font color=Cyan>)</font>+<a name="(line109)"></a>                        syms path options Keep xs+<a name="(line110)"></a>	n <font color=Red>|</font> all isDigit n+<a name="(line111)"></a>	         <font color=Red>-&gt;</font> <font color=Cyan>(</font><font color=Green><u>if</u></font> locations options <font color=Green><u>then</u></font> <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l<font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Cyan>)</font> <font color=Green><u>else</u></font> id<font color=Cyan>)</font> <font color=Cyan>$</font>+<a name="(line112)"></a>	            cpp <font color=Cyan>(</font>newpos <font color=Cyan>(</font>read n<font color=Cyan>)</font> <font color=Cyan>(</font>un <font color=Cyan>(</font>tail ws<font color=Cyan>)</font><font color=Cyan>)</font> p<font color=Cyan>)</font>+<a name="(line113)"></a>                        syms path options Keep xs+<a name="(line114)"></a>          <font color=Red>|</font> otherwise+<a name="(line115)"></a>	         <font color=Red>-&gt;</font> <font color=Green><u>if</u></font> warnings options <font color=Green><u>then</u></font> unsafePerformIO <font color=Cyan>$</font> <font color=Green><u>do</u></font>+<a name="(line116)"></a>                       hPutStrLn stderr <font color=Cyan>(</font><font color=Magenta>"Warning: unknown directive #"</font><font color=Cyan>++</font>n+<a name="(line117)"></a>                                        <font color=Cyan>++</font><font color=Magenta>"\nin "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>+<a name="(line118)"></a>                       return <font color=Cyan>$</font>+<a name="(line119)"></a>                         <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l<font color=Cyan>)</font><font color=Red><b>:</b></font> cpp <font color=Cyan>(</font>newline p<font color=Cyan>)</font> syms path options Keep xs<font color=Cyan>)</font>+<a name="(line120)"></a>                    <font color=Green><u>else</u></font>+<a name="(line121)"></a>                         <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l<font color=Cyan>)</font><font color=Red><b>:</b></font> cpp <font color=Cyan>(</font>newline p<font color=Cyan>)</font> syms path options Keep xs<font color=Cyan>)</font>+<a name="(line122)"></a>+<a name="(line123)"></a>cpp p syms path options <font color=Cyan>(</font>Drop n b<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="(line124)"></a>    <font color=Green><u>let</u></font> ws <font color=Red>=</font> words x+<a name="(line125)"></a>        cmd <font color=Red>=</font> head ws+<a name="(line126)"></a>        delse    <font color=Red>|</font> n<font color=Cyan>==</font><font color=Magenta>1</font> <font color=Cyan>&amp;&amp;</font> b <font color=Red>=</font> Drop <font color=Magenta>1</font> b+<a name="(line127)"></a>                 <font color=Red>|</font> n<font color=Cyan>==</font><font color=Magenta>1</font>      <font color=Red>=</font> Keep+<a name="(line128)"></a>                 <font color=Red>|</font> otherwise <font color=Red>=</font> Drop n b+<a name="(line129)"></a>        dend     <font color=Red>|</font> n<font color=Cyan>==</font><font color=Magenta>1</font>      <font color=Red>=</font> Keep+<a name="(line130)"></a>                 <font color=Red>|</font> otherwise <font color=Red>=</font> Drop <font color=Cyan>(</font>n<font color=Blue>-</font><font color=Magenta>1</font><font color=Cyan>)</font> b+<a name="(line131)"></a>        delif s  <font color=Red>|</font> n<font color=Cyan>==</font><font color=Magenta>1</font> <font color=Cyan>&amp;&amp;</font> not b <font color=Cyan>&amp;&amp;</font> gatherDefined p syms s+<a name="(line132)"></a>                             <font color=Red>=</font> Keep+<a name="(line133)"></a>                 <font color=Red>|</font> otherwise <font color=Red>=</font> Drop n b+<a name="(line134)"></a>        skipn ud xs' <font color=Red>=</font>+<a name="(line135)"></a>                 <font color=Green><u>let</u></font> n' <font color=Red>=</font> <font color=Magenta>1</font> <font color=Cyan>+</font> length <font color=Cyan>(</font>filter <font color=Cyan>(</font><font color=Cyan>==</font><font color=Magenta>'\n'</font><font color=Cyan>)</font> x<font color=Cyan>)</font> <font color=Green><u>in</u></font>+<a name="(line136)"></a>                 replicate n' <font color=Cyan>(</font>p<font color=Cyan>,</font><font color=Magenta>""</font><font color=Cyan>)</font>+<a name="(line137)"></a>                 <font color=Cyan>++</font> cpp <font color=Cyan>(</font>newlines n' p<font color=Cyan>)</font> syms path options ud xs'+<a name="(line138)"></a>    <font color=Green><u>in</u></font>+<a name="(line139)"></a>    <font color=Green><u>if</u></font>      cmd <font color=Cyan>==</font> <font color=Magenta>"ifndef"</font> <font color=Cyan>||</font>+<a name="(line140)"></a>            cmd <font color=Cyan>==</font> <font color=Magenta>"if"</font>     <font color=Cyan>||</font>+<a name="(line141)"></a>            cmd <font color=Cyan>==</font> <font color=Magenta>"ifdef"</font>  <font color=Green><u>then</u></font>  skipn <font color=Cyan>(</font>Drop <font color=Cyan>(</font>n<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> b<font color=Cyan>)</font> xs+<a name="(line142)"></a>    <font color=Green><u>else</u></font> <font color=Green><u>if</u></font> cmd <font color=Cyan>==</font> <font color=Magenta>"elif"</font>   <font color=Green><u>then</u></font>  skipn <font color=Cyan>(</font>delif <font color=Cyan>(</font>unwords <font color=Cyan>(</font>tail ws<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> xs+<a name="(line143)"></a>    <font color=Green><u>else</u></font> <font color=Green><u>if</u></font> cmd <font color=Cyan>==</font> <font color=Magenta>"else"</font>   <font color=Green><u>then</u></font>  skipn  delse xs+<a name="(line144)"></a>    <font color=Green><u>else</u></font> <font color=Green><u>if</u></font> cmd <font color=Cyan>==</font> <font color=Magenta>"endif"</font>  <font color=Green><u>then</u></font>  skipn  dend  xs+<a name="(line145)"></a>    <font color=Green><u>else</u></font> skipn <font color=Cyan>(</font>Drop n b<font color=Cyan>)</font> xs+<a name="(line146)"></a>	<font color=Blue>-- define, undef, include, error, warning, pragma, line</font>+<a name="(line147)"></a>+<a name="(line148)"></a>cpp p syms path options Keep <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="(line149)"></a>    <font color=Green><u>let</u></font> p' <font color=Red>=</font> newline p <font color=Green><u>in</u></font> seq p' <font color=Cyan>$</font>+<a name="(line150)"></a>    <font color=Cyan>(</font>p<font color=Cyan>,</font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>  cpp p' syms path options Keep xs+<a name="(line151)"></a>cpp p syms path options d<font color=Red>@</font><font color=Cyan>(</font>Drop <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="(line152)"></a>    <font color=Green><u>let</u></font> p' <font color=Red>=</font> newline p <font color=Green><u>in</u></font> seq p' <font color=Cyan>$</font>+<a name="(line153)"></a>    <font color=Cyan>(</font>p<font color=Cyan>,</font><font color=Magenta>""</font><font color=Cyan>)</font><font color=Red><b>:</b></font> cpp p' syms path options d xs+<a name="(line154)"></a>+<a name="(line155)"></a>+<a name="(line156)"></a><a name="gatherDefined"></a><font color=Blue>----</font>+<a name="(line157)"></a>gatherDefined <font color=Red>::</font> Posn <font color=Red>-&gt;</font> SymTab HashDefine <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> Bool+<a name="(line158)"></a>gatherDefined p st inp <font color=Red>=</font>+<a name="(line159)"></a>  <font color=Green><u>case</u></font> papply <font color=Cyan>(</font>parseBoolExp st<font color=Cyan>)</font> inp <font color=Green><u>of</u></font>+<a name="(line160)"></a>    []      <font color=Red>-&gt;</font> error <font color=Cyan>(</font><font color=Magenta>"Cannot parse #if directive in file "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>+<a name="(line161)"></a>    <font color=Red>[</font><font color=Cyan>(</font>b<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-&gt;</font> b+<a name="(line162)"></a>    <font color=Green><u>_</u></font>       <font color=Red>-&gt;</font> error <font color=Cyan>(</font><font color=Magenta>"Ambiguous parse for #if directive in file "</font><font color=Cyan>++</font>show p<font color=Cyan>)</font>+<a name="(line163)"></a>+<a name="(line164)"></a><a name="parseBoolExp"></a>parseBoolExp <font color=Red>::</font> SymTab HashDefine <font color=Red>-&gt;</font> Parser Bool+<a name="(line165)"></a>parseBoolExp st <font color=Red>=</font>+<a name="(line166)"></a>  <font color=Green><u>do</u></font>  a <font color=Red>&lt;-</font> parseExp1 st+<a name="(line167)"></a>      skip <font color=Cyan>(</font>string <font color=Magenta>"||"</font><font color=Cyan>)</font>+<a name="(line168)"></a>      b <font color=Red>&lt;-</font> first <font color=Cyan>(</font>skip <font color=Cyan>(</font>parseBoolExp st<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line169)"></a>      return <font color=Cyan>(</font>a <font color=Cyan>||</font> b<font color=Cyan>)</font>+<a name="(line170)"></a>  <font color=Cyan>+++</font>+<a name="(line171)"></a>      parseExp1 st+<a name="(line172)"></a>+<a name="(line173)"></a><a name="parseExp1"></a>parseExp1 <font color=Red>::</font> SymTab HashDefine <font color=Red>-&gt;</font> Parser Bool+<a name="(line174)"></a>parseExp1 st <font color=Red>=</font>+<a name="(line175)"></a>  <font color=Green><u>do</u></font>  a <font color=Red>&lt;-</font> parseExp0 st+<a name="(line176)"></a>      skip <font color=Cyan>(</font>string <font color=Magenta>"&amp;&amp;"</font><font color=Cyan>)</font>+<a name="(line177)"></a>      b <font color=Red>&lt;-</font> first <font color=Cyan>(</font>skip <font color=Cyan>(</font>parseExp1 st<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line178)"></a>      return <font color=Cyan>(</font>a <font color=Cyan>&amp;&amp;</font> b<font color=Cyan>)</font>+<a name="(line179)"></a>  <font color=Cyan>+++</font>+<a name="(line180)"></a>      parseExp0 st+<a name="(line181)"></a>+<a name="(line182)"></a><a name="parseExp0"></a>parseExp0 <font color=Red>::</font> SymTab HashDefine <font color=Red>-&gt;</font> Parser Bool+<a name="(line183)"></a>parseExp0 st <font color=Red>=</font>+<a name="(line184)"></a>  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>string <font color=Magenta>"defined"</font><font color=Cyan>)</font>+<a name="(line185)"></a>      sym <font color=Red>&lt;-</font> parens parseSym+<a name="(line186)"></a>      return <font color=Cyan>(</font>definedST sym st<font color=Cyan>)</font>+<a name="(line187)"></a>  <font color=Cyan>+++</font>+<a name="(line188)"></a>  <font color=Green><u>do</u></font>  parens <font color=Cyan>(</font>parseBoolExp st<font color=Cyan>)</font>+<a name="(line189)"></a>  <font color=Cyan>+++</font>+<a name="(line190)"></a>  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>char <font color=Magenta>'!'</font><font color=Cyan>)</font>+<a name="(line191)"></a>      a <font color=Red>&lt;-</font> parseExp0 st+<a name="(line192)"></a>      return <font color=Cyan>(</font>not a<font color=Cyan>)</font>+<a name="(line193)"></a>  <font color=Cyan>+++</font>+<a name="(line194)"></a>  <font color=Green><u>do</u></font>  sym1 <font color=Red>&lt;-</font> parseSymOrCall st+<a name="(line195)"></a>      op <font color=Red>&lt;-</font> parseOp st+<a name="(line196)"></a>      sym2 <font color=Red>&lt;-</font> parseSymOrCall st+<a name="(line197)"></a>      return <font color=Cyan>(</font>op <font color=Cyan>(</font>safeRead sym1<font color=Cyan>)</font> <font color=Cyan>(</font>safeRead sym2<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line198)"></a>  <font color=Cyan>+++</font>+<a name="(line199)"></a>  <font color=Green><u>do</u></font>  sym <font color=Red>&lt;-</font> parseSymOrCall st+<a name="(line200)"></a>      <font color=Green><u>case</u></font> safeRead sym <font color=Green><u>of</u></font>+<a name="(line201)"></a>        <font color=Magenta>0</font> <font color=Red>-&gt;</font> return False+<a name="(line202)"></a>        <font color=Green><u>_</u></font> <font color=Red>-&gt;</font> return True+<a name="(line203)"></a>  <font color=Green><u>where</u></font>+<a name="(line204)"></a>    safeRead s <font color=Red>=</font>+<a name="(line205)"></a>      <font color=Green><u>case</u></font> s <font color=Green><u>of</u></font>+<a name="(line206)"></a>        <font color=Magenta>'0'</font><font color=Red><b>:</b></font><font color=Magenta>'x'</font><font color=Red><b>:</b></font>s' <font color=Red>-&gt;</font> number readHex s'+<a name="(line207)"></a>        <font color=Magenta>'0'</font><font color=Red><b>:</b></font><font color=Magenta>'o'</font><font color=Red><b>:</b></font>s' <font color=Red>-&gt;</font> number readOct s'+<a name="(line208)"></a>        <font color=Green><u>_</u></font>          <font color=Red>-&gt;</font> number readDec s+<a name="(line209)"></a>    number rd s <font color=Red>=</font>+<a name="(line210)"></a>      <font color=Green><u>case</u></font> rd s <font color=Green><u>of</u></font>+<a name="(line211)"></a>        []        <font color=Red>-&gt;</font> <font color=Magenta>0</font> <font color=Red>::</font> Integer+<a name="(line212)"></a>        <font color=Cyan>(</font><font color=Cyan>(</font>n<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-&gt;</font> n <font color=Red>::</font> Integer+<a name="(line213)"></a>+<a name="(line214)"></a><a name="parseOp"></a>parseOp <font color=Red>::</font> SymTab HashDefine <font color=Red>-&gt;</font> Parser <font color=Cyan>(</font>Integer <font color=Red>-&gt;</font> Integer <font color=Red>-&gt;</font> Bool<font color=Cyan>)</font>+<a name="(line215)"></a>parseOp <font color=Green><u>_</u></font> <font color=Red>=</font>+<a name="(line216)"></a>  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>string <font color=Magenta>"&gt;="</font><font color=Cyan>)</font>+<a name="(line217)"></a>      return <font color=Cyan>(</font><font color=Cyan>&gt;=</font><font color=Cyan>)</font>+<a name="(line218)"></a>  <font color=Cyan>+++</font>+<a name="(line219)"></a>  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>char <font color=Magenta>'&gt;'</font><font color=Cyan>)</font>+<a name="(line220)"></a>      return <font color=Cyan>(</font><font color=Cyan>&gt;</font><font color=Cyan>)</font>+<a name="(line221)"></a>  <font color=Cyan>+++</font>+<a name="(line222)"></a>  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>string <font color=Magenta>"&lt;="</font><font color=Cyan>)</font>+<a name="(line223)"></a>      return <font color=Cyan>(</font><font color=Cyan>&lt;=</font><font color=Cyan>)</font>+<a name="(line224)"></a>  <font color=Cyan>+++</font>+<a name="(line225)"></a>  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>char <font color=Magenta>'&lt;'</font><font color=Cyan>)</font>+<a name="(line226)"></a>      return <font color=Cyan>(</font><font color=Cyan>&lt;</font><font color=Cyan>)</font>+<a name="(line227)"></a>  <font color=Cyan>+++</font>+<a name="(line228)"></a>  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>string <font color=Magenta>"=="</font><font color=Cyan>)</font>+<a name="(line229)"></a>      return <font color=Cyan>(</font><font color=Cyan>==</font><font color=Cyan>)</font>+<a name="(line230)"></a>  <font color=Cyan>+++</font>+<a name="(line231)"></a>  <font color=Green><u>do</u></font>  skip <font color=Cyan>(</font>string <font color=Magenta>"!="</font><font color=Cyan>)</font>+<a name="(line232)"></a>      return <font color=Cyan>(</font><font color=Cyan>/=</font><font color=Cyan>)</font>+<a name="(line233)"></a>+<a name="(line234)"></a><a name="parseSymOrCall"></a>parseSymOrCall <font color=Red>::</font> SymTab HashDefine <font color=Red>-&gt;</font> Parser String+<a name="(line235)"></a>parseSymOrCall st <font color=Red>=</font>+<a name="(line236)"></a>  <font color=Green><u>do</u></font>  sym <font color=Red>&lt;-</font> skip parseSym+<a name="(line237)"></a>      args <font color=Red>&lt;-</font> parens <font color=Cyan>(</font>parseSymOrCall st <font color=Cyan>`sepby`</font> skip <font color=Cyan>(</font>char <font color=Magenta>','</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line238)"></a>      return <font color=Cyan>(</font>convert sym args<font color=Cyan>)</font>+<a name="(line239)"></a>  <font color=Cyan>+++</font>+<a name="(line240)"></a>  <font color=Green><u>do</u></font>  sym <font color=Red>&lt;-</font> skip parseSym+<a name="(line241)"></a>      return <font color=Cyan>(</font>convert sym []<font color=Cyan>)</font>+<a name="(line242)"></a>  <font color=Green><u>where</u></font>+<a name="(line243)"></a>    convert sym args <font color=Red>=</font>+<a name="(line244)"></a>      <font color=Green><u>case</u></font> lookupST sym st <font color=Green><u>of</u></font>+<a name="(line245)"></a>        Nothing  <font color=Red>-&gt;</font> sym+<a name="(line246)"></a>        Just <font color=Cyan>(</font>a<font color=Red>@</font>SymbolReplacement<font color=Cyan>{</font><font color=Cyan>}</font><font color=Cyan>)</font> <font color=Red>-&gt;</font> recursivelyExpand st <font color=Cyan>(</font>replacement a<font color=Cyan>)</font>+<a name="(line247)"></a>        Just <font color=Cyan>(</font>a<font color=Red>@</font>MacroExpansion<font color=Cyan>{</font><font color=Cyan>}</font><font color=Cyan>)</font>    <font color=Red>-&gt;</font> expandMacro a args False+<a name="(line248)"></a>+<a name="(line249)"></a><a name="recursivelyExpand"></a>recursivelyExpand <font color=Red>::</font> SymTab HashDefine <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> String+<a name="(line250)"></a>recursivelyExpand st inp <font color=Red>=</font>+<a name="(line251)"></a>  <font color=Green><u>case</u></font> papply <font color=Cyan>(</font>parseSymOrCall st<font color=Cyan>)</font> inp <font color=Green><u>of</u></font>+<a name="(line252)"></a>    <font color=Red>[</font><font color=Cyan>(</font>b<font color=Cyan>,</font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-&gt;</font> b+<a name="(line253)"></a>    <font color=Green><u>_</u></font>       <font color=Red>-&gt;</font> inp+<a name="(line254)"></a>+<a name="(line255)"></a><a name="parseSym"></a>parseSym <font color=Red>::</font> Parser String+<a name="(line256)"></a>parseSym <font color=Red>=</font> many1 <font color=Cyan>(</font>alphanum<font color=Cyan>+++</font>char <font color=Magenta>'\''</font><font color=Cyan>+++</font>char <font color=Magenta>'`'</font><font color=Cyan>)</font>+<a name="(line257)"></a>+<a name="(line258)"></a><a name="parens"></a>parens p <font color=Red>=</font> bracket <font color=Cyan>(</font>skip <font color=Cyan>(</font>char <font color=Magenta>'('</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>skip p<font color=Cyan>)</font> <font color=Cyan>(</font>skip <font color=Cyan>(</font>char <font color=Magenta>')'</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line259)"></a>+<a name="(line260)"></a><a name="file"></a><font color=Blue>-- | Determine filename in \#include</font>+<a name="(line261)"></a>file <font color=Red>::</font> SymTab HashDefine <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> String+<a name="(line262)"></a>file st name <font color=Red>=</font>+<a name="(line263)"></a>    <font color=Green><u>case</u></font> name <font color=Green><u>of</u></font>+<a name="(line264)"></a>      <font color=Cyan>(</font><font color=Magenta>'"'</font><font color=Red><b>:</b></font>ns<font color=Cyan>)</font> <font color=Red>-&gt;</font> init ns+<a name="(line265)"></a>      <font color=Cyan>(</font><font color=Magenta>'&lt;'</font><font color=Red><b>:</b></font>ns<font color=Cyan>)</font> <font color=Red>-&gt;</font> init ns+<a name="(line266)"></a>      <font color=Green><u>_</u></font> <font color=Red>-&gt;</font> <font color=Green><u>let</u></font> ex <font color=Red>=</font> recursivelyExpand st name <font color=Green><u>in</u></font>+<a name="(line267)"></a>           <font color=Green><u>if</u></font> ex <font color=Cyan>==</font> name <font color=Green><u>then</u></font> name <font color=Green><u>else</u></font> file st ex </pre>+</html>
docs/cpphs/Language/Preprocessor/Cpphs/HashDefine.html view
@@ -1,108 +1,111 @@-<pre><font color=Blue>-----------------------------------------------------------------------------</font>-<font color=Blue>-- |</font>-<font color=Blue>-- Module      :  HashDefine</font>-<font color=Blue>-- Copyright   :  2004 Malcolm Wallace</font>-<font color=Blue>-- Licence     :  LGPL</font>-<font color=Blue>--</font>-<font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>-<font color=Blue>-- Stability   :  experimental</font>-<font color=Blue>-- Portability :  All</font>-<font color=Blue>--</font>-<font color=Blue>-- What structures are declared in a \#define.</font>-<font color=Blue>-----------------------------------------------------------------------------</font>- -<font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>HashDefine-  <font color=Cyan>(</font> HashDefine<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-  <font color=Cyan>,</font> ArgOrText<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-  <font color=Cyan>,</font> expandMacro-  <font color=Cyan>,</font> parseHashDefine-  <font color=Cyan>)</font> <font color=Green><u>where</u></font>--<font color=Green><u>import</u></font> Char <font color=Cyan>(</font>isSpace<font color=Cyan>)</font>-<font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font>--<a name="HashDefine"></a><font color=Green><u>data</u></font> HashDefine-	<font color=Red>=</font> LineDrop-		<font color=Cyan>{</font> name <font color=Red>::</font> String <font color=Cyan>}</font>-	<font color=Red>|</font> Pragma-		<font color=Cyan>{</font> name <font color=Red>::</font> String <font color=Cyan>}</font>-	<font color=Red>|</font> SymbolReplacement-		<font color=Cyan>{</font> name		<font color=Red>::</font> String-		<font color=Cyan>,</font> replacement	<font color=Red>::</font> String-		<font color=Cyan>,</font> linebreaks    <font color=Red>::</font> Int-		<font color=Cyan>}</font>-	<font color=Red>|</font> MacroExpansion-		<font color=Cyan>{</font> name		<font color=Red>::</font> String-		<font color=Cyan>,</font> arguments	<font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font>-		<font color=Cyan>,</font> expansion	<font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>ArgOrText<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>-		<font color=Cyan>,</font> linebreaks    <font color=Red>::</font> Int-		<font color=Cyan>}</font>-    <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>--<font color=Blue>-- | 'smart' constructor to avoid warnings from ghc (undefined fields)</font>-symbolReplacement <font color=Red>::</font> HashDefine-<a name="symbolReplacement"></a>symbolReplacement <font color=Red>=</font>-    SymbolReplacement-	 <font color=Cyan>{</font> name<font color=Red>=</font>undefined<font color=Cyan>,</font> replacement<font color=Red>=</font>undefined<font color=Cyan>,</font> linebreaks<font color=Red>=</font>undefined <font color=Cyan>}</font>--<font color=Blue>-- | Macro expansion text is divided into sections, each of which is classified</font>-<font color=Blue>--   as one of three kinds: a formal argument (Arg), plain text (Text),</font>-<font color=Blue>--   or a stringised formal argument (Str).</font>-<a name="ArgOrText"></a><font color=Green><u>data</u></font> ArgOrText <font color=Red>=</font> Arg <font color=Red>|</font> Text <font color=Red>|</font> Str <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>--<font color=Blue>-- | Expand an instance of a macro.</font>-<font color=Blue>--   Precondition: got a match on the macro name.</font>-expandMacro <font color=Red>::</font> HashDefine <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> Bool <font color=Red>-&gt;</font> String-<a name="expandMacro"></a>expandMacro macro parameters layout <font color=Red>=</font>-    <font color=Green><u>let</u></font> env <font color=Red>=</font> zip <font color=Cyan>(</font>arguments macro<font color=Cyan>)</font> parameters-        replace <font color=Cyan>(</font>Arg<font color=Cyan>,</font>s<font color=Cyan>)</font>  <font color=Red>=</font> maybe <font color=Cyan>(</font>error <font color=Magenta>"formal param"</font><font color=Cyan>)</font> id <font color=Cyan>(</font>lookup s env<font color=Cyan>)</font>-        replace <font color=Cyan>(</font>Str<font color=Cyan>,</font>s<font color=Cyan>)</font>  <font color=Red>=</font> maybe <font color=Cyan>(</font>error <font color=Magenta>"formal param"</font><font color=Cyan>)</font> str <font color=Cyan>(</font>lookup s env<font color=Cyan>)</font>-        replace <font color=Cyan>(</font>Text<font color=Cyan>,</font>s<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>if</u></font> layout <font color=Green><u>then</u></font> s <font color=Green><u>else</u></font> filter <font color=Cyan>(</font><font color=Cyan>/=</font><font color=Magenta>'\n'</font><font color=Cyan>)</font> s-        str s <font color=Red>=</font> <font color=Magenta>'"'</font><font color=Red><b>:</b></font>s<font color=Cyan>++</font><font color=Magenta>"\""</font>-    <font color=Green><u>in</u></font>-    concatMap replace <font color=Cyan>(</font>expansion macro<font color=Cyan>)</font>--<font color=Blue>-- | Parse a \#define, or \#undef, ignoring other \# directives</font>-parseHashDefine <font color=Red>::</font> Bool <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> Maybe HashDefine-<a name="parseHashDefine"></a>parseHashDefine ansi def <font color=Red>=</font> <font color=Cyan>(</font>command <font color=Cyan>.</font> skip<font color=Cyan>)</font> def-  <font color=Green><u>where</u></font>-    skip xss<font color=Red>@</font><font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> all isSpace x <font color=Red>=</font> skip xs-                    <font color=Red>|</font> otherwise     <font color=Red>=</font> xss-    skip    <font color=Red>[</font><font color=Red>]</font>      <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>-    command <font color=Cyan>(</font><font color=Magenta>"line"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>   <font color=Red>=</font> Just <font color=Cyan>(</font>LineDrop <font color=Cyan>(</font><font color=Magenta>"#line"</font><font color=Cyan>++</font>concat xs<font color=Cyan>)</font><font color=Cyan>)</font>-    command <font color=Cyan>(</font><font color=Magenta>"pragma"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> Just <font color=Cyan>(</font>Pragma <font color=Cyan>(</font><font color=Magenta>"#pragma"</font><font color=Cyan>++</font>concat xs<font color=Cyan>)</font><font color=Cyan>)</font>-    command <font color=Cyan>(</font><font color=Magenta>"define"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> Just <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>define <font color=Cyan>.</font> skip<font color=Cyan>)</font> xs<font color=Cyan>)</font> <font color=Cyan>{</font> linebreaks<font color=Red>=</font>count def <font color=Cyan>}</font><font color=Cyan>)</font>-    command <font color=Cyan>(</font><font color=Magenta>"undef"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> Just <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>undef  <font color=Cyan>.</font> skip<font color=Cyan>)</font> xs<font color=Cyan>)</font> <font color=Cyan>{</font> linebreaks<font color=Red>=</font>count def <font color=Cyan>}</font><font color=Cyan>)</font>-    command <font color=Green><u>_</u></font>             <font color=Red>=</font> Nothing-    undef  <font color=Cyan>(</font>sym<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font>   <font color=Red>=</font> symbolReplacement <font color=Cyan>{</font> name<font color=Red>=</font>sym<font color=Cyan>,</font> replacement<font color=Red>=</font>sym <font color=Cyan>}</font>-    define <font color=Cyan>(</font>sym<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> <font color=Green><u>case</u></font> <font color=Blue>{-skip-}</font> xs <font color=Green><u>of</u></font>-                           <font color=Cyan>(</font><font color=Magenta>"("</font><font color=Red><b>:</b></font>ys<font color=Cyan>)</font> <font color=Red>-&gt;</font> <font color=Cyan>(</font>macroHead sym <font color=Red>[</font><font color=Red>]</font> <font color=Cyan>.</font> skip<font color=Cyan>)</font> ys-                           ys   <font color=Red>-&gt;</font> symbolReplacement-                                     <font color=Cyan>{</font> name<font color=Red>=</font>sym-                                     <font color=Cyan>,</font> replacement <font color=Red>=</font> concatMap snd-                                             <font color=Cyan>(</font>classifyRhs <font color=Red>[</font><font color=Red>]</font> <font color=Cyan>(</font>chop <font color=Cyan>(</font>skip ys<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>}</font>-    macroHead sym args <font color=Cyan>(</font><font color=Magenta>","</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>macroHead sym args <font color=Cyan>.</font> skip<font color=Cyan>)</font> xs-    macroHead sym args <font color=Cyan>(</font><font color=Magenta>")"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> MacroExpansion-                                    <font color=Cyan>{</font> name <font color=Red>=</font>sym <font color=Cyan>,</font> arguments <font color=Red>=</font> reverse args-                                    <font color=Cyan>,</font> expansion <font color=Red>=</font> classifyRhs args <font color=Cyan>(</font>skip xs<font color=Cyan>)</font>-                                    <font color=Cyan>,</font> linebreaks <font color=Red>=</font> undefined <font color=Cyan>}</font>-    macroHead sym args <font color=Cyan>(</font>var<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>macroHead sym <font color=Cyan>(</font>var<font color=Red><b>:</b></font>args<font color=Cyan>)</font> <font color=Cyan>.</font> skip<font color=Cyan>)</font> xs-    macroHead sym args <font color=Red>[</font><font color=Red>]</font>       <font color=Red>=</font> error <font color=Cyan>(</font><font color=Magenta>"incomplete macro definition:\n"</font>-                                        <font color=Cyan>++</font><font color=Magenta>"  #define "</font><font color=Cyan>++</font>sym<font color=Cyan>++</font><font color=Magenta>"("</font>-                                        <font color=Cyan>++</font>concat <font color=Cyan>(</font>intersperse <font color=Magenta>","</font> args<font color=Cyan>)</font><font color=Cyan>)</font>-    classifyRhs args <font color=Cyan>(</font><font color=Magenta>"#"</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                          <font color=Red>|</font> ansi <font color=Cyan>&amp;&amp;</font>-                            x <font color=Cyan>`elem`</font> args    <font color=Red>=</font> <font color=Cyan>(</font>Str<font color=Cyan>,</font>x<font color=Cyan>)</font><font color=Red><b>:</b></font> classifyRhs args xs-    classifyRhs args <font color=Cyan>(</font><font color=Magenta>"##"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                          <font color=Red>|</font> ansi             <font color=Red>=</font> classifyRhs args xs-    classifyRhs args <font color=Cyan>(</font>s<font color=Red><b>:</b></font><font color=Magenta>"##"</font><font color=Red><b>:</b></font>s'<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                          <font color=Red>|</font> ansi <font color=Cyan>&amp;&amp;</font> all isSpace s <font color=Cyan>&amp;&amp;</font> all isSpace s'-                                             <font color=Red>=</font> classifyRhs args xs-    classifyRhs args <font color=Cyan>(</font>word<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                          <font color=Red>|</font> word <font color=Cyan>`elem`</font> args <font color=Red>=</font> <font color=Cyan>(</font>Arg<font color=Cyan>,</font>word<font color=Cyan>)</font><font color=Red><b>:</b></font> classifyRhs args xs-                          <font color=Red>|</font> otherwise        <font color=Red>=</font> <font color=Cyan>(</font>Text<font color=Cyan>,</font>word<font color=Cyan>)</font><font color=Red><b>:</b></font> classifyRhs args xs-    classifyRhs <font color=Green><u>_</u></font>    <font color=Red>[</font><font color=Red>]</font>                      <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>-    count <font color=Red>=</font> length <font color=Cyan>.</font> filter <font color=Cyan>(</font><font color=Cyan>==</font><font color=Magenta>'\n'</font><font color=Cyan>)</font> <font color=Cyan>.</font> concat-    chop  <font color=Red>=</font> reverse <font color=Cyan>.</font> dropWhile <font color=Cyan>(</font>all isSpace<font color=Cyan>)</font> <font color=Cyan>.</font> reverse-+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">+<html>+<pre><a name="(line1)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line2)"></a><font color=Blue>-- |</font>+<a name="(line3)"></a><font color=Blue>-- Module      :  HashDefine</font>+<a name="(line4)"></a><font color=Blue>-- Copyright   :  2004 Malcolm Wallace</font>+<a name="(line5)"></a><font color=Blue>-- Licence     :  LGPL</font>+<a name="(line6)"></a><font color=Blue>--</font>+<a name="(line7)"></a><font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>+<a name="(line8)"></a><font color=Blue>-- Stability   :  experimental</font>+<a name="(line9)"></a><font color=Blue>-- Portability :  All</font>+<a name="(line10)"></a><font color=Blue>--</font>+<a name="(line11)"></a><font color=Blue>-- What structures are declared in a \#define.</font>+<a name="(line12)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line13)"></a> +<a name="(line14)"></a><font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>HashDefine+<a name="(line15)"></a>  <font color=Cyan>(</font> HashDefine<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="(line16)"></a>  <font color=Cyan>,</font> ArgOrText<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="(line17)"></a>  <font color=Cyan>,</font> expandMacro+<a name="(line18)"></a>  <font color=Cyan>,</font> parseHashDefine+<a name="(line19)"></a>  <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="(line20)"></a>+<a name="(line21)"></a><font color=Green><u>import</u></font> Char <font color=Cyan>(</font>isSpace<font color=Cyan>)</font>+<a name="(line22)"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>intersperse<font color=Cyan>)</font>+<a name="(line23)"></a>+<a name="(line24)"></a><a name="HashDefine"></a><font color=Green><u>data</u></font> HashDefine+<a name="(line25)"></a>	<font color=Red>=</font> LineDrop+<a name="(line26)"></a>		<font color=Cyan>{</font> name <font color=Red>::</font> String <font color=Cyan>}</font>+<a name="(line27)"></a>	<font color=Red>|</font> Pragma+<a name="(line28)"></a>		<font color=Cyan>{</font> name <font color=Red>::</font> String <font color=Cyan>}</font>+<a name="(line29)"></a>	<font color=Red>|</font> SymbolReplacement+<a name="(line30)"></a>		<font color=Cyan>{</font> name		<font color=Red>::</font> String+<a name="(line31)"></a>		<font color=Cyan>,</font> replacement	<font color=Red>::</font> String+<a name="(line32)"></a>		<font color=Cyan>,</font> linebreaks    <font color=Red>::</font> Int+<a name="(line33)"></a>		<font color=Cyan>}</font>+<a name="(line34)"></a>	<font color=Red>|</font> MacroExpansion+<a name="(line35)"></a>		<font color=Cyan>{</font> name		<font color=Red>::</font> String+<a name="(line36)"></a>		<font color=Cyan>,</font> arguments	<font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font>+<a name="(line37)"></a>		<font color=Cyan>,</font> expansion	<font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>ArgOrText<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>+<a name="(line38)"></a>		<font color=Cyan>,</font> linebreaks    <font color=Red>::</font> Int+<a name="(line39)"></a>		<font color=Cyan>}</font>+<a name="(line40)"></a>    <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="(line41)"></a>+<a name="(line42)"></a><a name="symbolReplacement"></a><font color=Blue>-- | 'smart' constructor to avoid warnings from ghc (undefined fields)</font>+<a name="(line43)"></a>symbolReplacement <font color=Red>::</font> HashDefine+<a name="(line44)"></a>symbolReplacement <font color=Red>=</font>+<a name="(line45)"></a>    SymbolReplacement+<a name="(line46)"></a>	 <font color=Cyan>{</font> name<font color=Red>=</font>undefined<font color=Cyan>,</font> replacement<font color=Red>=</font>undefined<font color=Cyan>,</font> linebreaks<font color=Red>=</font>undefined <font color=Cyan>}</font>+<a name="(line47)"></a>+<a name="(line48)"></a><a name="ArgOrText"></a><font color=Blue>-- | Macro expansion text is divided into sections, each of which is classified</font>+<a name="(line49)"></a><a name="ArgOrText"></a><font color=Blue>--   as one of three kinds: a formal argument (Arg), plain text (Text),</font>+<a name="(line50)"></a><a name="ArgOrText"></a><font color=Blue>--   or a stringised formal argument (Str).</font>+<a name="(line51)"></a><a name="ArgOrText"></a><font color=Green><u>data</u></font> ArgOrText <font color=Red>=</font> Arg <font color=Red>|</font> Text <font color=Red>|</font> Str <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="(line52)"></a>+<a name="(line53)"></a><a name="expandMacro"></a><font color=Blue>-- | Expand an instance of a macro.</font>+<a name="(line54)"></a><font color=Blue>--   Precondition: got a match on the macro name.</font>+<a name="(line55)"></a>expandMacro <font color=Red>::</font> HashDefine <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> Bool <font color=Red>-&gt;</font> String+<a name="(line56)"></a>expandMacro macro parameters layout <font color=Red>=</font>+<a name="(line57)"></a>    <font color=Green><u>let</u></font> env <font color=Red>=</font> zip <font color=Cyan>(</font>arguments macro<font color=Cyan>)</font> parameters+<a name="(line58)"></a>        replace <font color=Cyan>(</font>Arg<font color=Cyan>,</font>s<font color=Cyan>)</font>  <font color=Red>=</font> maybe <font color=Cyan>(</font>error <font color=Magenta>"formal param"</font><font color=Cyan>)</font> id <font color=Cyan>(</font>lookup s env<font color=Cyan>)</font>+<a name="(line59)"></a>        replace <font color=Cyan>(</font>Str<font color=Cyan>,</font>s<font color=Cyan>)</font>  <font color=Red>=</font> maybe <font color=Cyan>(</font>error <font color=Magenta>"formal param"</font><font color=Cyan>)</font> str <font color=Cyan>(</font>lookup s env<font color=Cyan>)</font>+<a name="(line60)"></a>        replace <font color=Cyan>(</font>Text<font color=Cyan>,</font>s<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>if</u></font> layout <font color=Green><u>then</u></font> s <font color=Green><u>else</u></font> filter <font color=Cyan>(</font><font color=Cyan>/=</font><font color=Magenta>'\n'</font><font color=Cyan>)</font> s+<a name="(line61)"></a>        str s <font color=Red>=</font> <font color=Magenta>'"'</font><font color=Red><b>:</b></font>s<font color=Cyan>++</font><font color=Magenta>"\""</font>+<a name="(line62)"></a>    <font color=Green><u>in</u></font>+<a name="(line63)"></a>    concatMap replace <font color=Cyan>(</font>expansion macro<font color=Cyan>)</font>+<a name="(line64)"></a>+<a name="(line65)"></a><a name="parseHashDefine"></a><font color=Blue>-- | Parse a \#define, or \#undef, ignoring other \# directives</font>+<a name="(line66)"></a>parseHashDefine <font color=Red>::</font> Bool <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> Maybe HashDefine+<a name="(line67)"></a>parseHashDefine ansi def <font color=Red>=</font> <font color=Cyan>(</font>command <font color=Cyan>.</font> skip<font color=Cyan>)</font> def+<a name="(line68)"></a>  <font color=Green><u>where</u></font>+<a name="(line69)"></a>    skip xss<font color=Red>@</font><font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> all isSpace x <font color=Red>=</font> skip xs+<a name="(line70)"></a>                    <font color=Red>|</font> otherwise     <font color=Red>=</font> xss+<a name="(line71)"></a>    skip    []      <font color=Red>=</font> []+<a name="(line72)"></a>    command <font color=Cyan>(</font><font color=Magenta>"line"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>   <font color=Red>=</font> Just <font color=Cyan>(</font>LineDrop <font color=Cyan>(</font><font color=Magenta>"#line"</font><font color=Cyan>++</font>concat xs<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line73)"></a>    command <font color=Cyan>(</font><font color=Magenta>"pragma"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> Just <font color=Cyan>(</font>Pragma <font color=Cyan>(</font><font color=Magenta>"#pragma"</font><font color=Cyan>++</font>concat xs<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line74)"></a>    command <font color=Cyan>(</font><font color=Magenta>"define"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> Just <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>define <font color=Cyan>.</font> skip<font color=Cyan>)</font> xs<font color=Cyan>)</font> <font color=Cyan>{</font> linebreaks<font color=Red>=</font>count def <font color=Cyan>}</font><font color=Cyan>)</font>+<a name="(line75)"></a>    command <font color=Cyan>(</font><font color=Magenta>"undef"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> Just <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>undef  <font color=Cyan>.</font> skip<font color=Cyan>)</font> xs<font color=Cyan>)</font> <font color=Cyan>{</font> linebreaks<font color=Red>=</font>count def <font color=Cyan>}</font><font color=Cyan>)</font>+<a name="(line76)"></a>    command <font color=Green><u>_</u></font>             <font color=Red>=</font> Nothing+<a name="(line77)"></a>    undef  <font color=Cyan>(</font>sym<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font>   <font color=Red>=</font> symbolReplacement <font color=Cyan>{</font> name<font color=Red>=</font>sym<font color=Cyan>,</font> replacement<font color=Red>=</font>sym <font color=Cyan>}</font>+<a name="(line78)"></a>    define <font color=Cyan>(</font>sym<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> <font color=Green><u>case</u></font> <font color=Blue>{-skip-}</font> xs <font color=Green><u>of</u></font>+<a name="(line79)"></a>                           <font color=Cyan>(</font><font color=Magenta>"("</font><font color=Red><b>:</b></font>ys<font color=Cyan>)</font> <font color=Red>-&gt;</font> <font color=Cyan>(</font>macroHead sym [] <font color=Cyan>.</font> skip<font color=Cyan>)</font> ys+<a name="(line80)"></a>                           ys   <font color=Red>-&gt;</font> symbolReplacement+<a name="(line81)"></a>                                     <font color=Cyan>{</font> name<font color=Red>=</font>sym+<a name="(line82)"></a>                                     <font color=Cyan>,</font> replacement <font color=Red>=</font> concatMap snd+<a name="(line83)"></a>                                             <font color=Cyan>(</font>classifyRhs [] <font color=Cyan>(</font>chop <font color=Cyan>(</font>skip ys<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="(line84)"></a>    macroHead sym args <font color=Cyan>(</font><font color=Magenta>","</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>macroHead sym args <font color=Cyan>.</font> skip<font color=Cyan>)</font> xs+<a name="(line85)"></a>    macroHead sym args <font color=Cyan>(</font><font color=Magenta>")"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> MacroExpansion+<a name="(line86)"></a>                                    <font color=Cyan>{</font> name <font color=Red>=</font>sym <font color=Cyan>,</font> arguments <font color=Red>=</font> reverse args+<a name="(line87)"></a>                                    <font color=Cyan>,</font> expansion <font color=Red>=</font> classifyRhs args <font color=Cyan>(</font>skip xs<font color=Cyan>)</font>+<a name="(line88)"></a>                                    <font color=Cyan>,</font> linebreaks <font color=Red>=</font> undefined <font color=Cyan>}</font>+<a name="(line89)"></a>    macroHead sym args <font color=Cyan>(</font>var<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>macroHead sym <font color=Cyan>(</font>var<font color=Red><b>:</b></font>args<font color=Cyan>)</font> <font color=Cyan>.</font> skip<font color=Cyan>)</font> xs+<a name="(line90)"></a>    macroHead sym args []       <font color=Red>=</font> error <font color=Cyan>(</font><font color=Magenta>"incomplete macro definition:\n"</font>+<a name="(line91)"></a>                                        <font color=Cyan>++</font><font color=Magenta>"  #define "</font><font color=Cyan>++</font>sym<font color=Cyan>++</font><font color=Magenta>"("</font>+<a name="(line92)"></a>                                        <font color=Cyan>++</font>concat <font color=Cyan>(</font>intersperse <font color=Magenta>","</font> args<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line93)"></a>    classifyRhs args <font color=Cyan>(</font><font color=Magenta>"#"</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line94)"></a>                          <font color=Red>|</font> ansi <font color=Cyan>&amp;&amp;</font>+<a name="(line95)"></a>                            x <font color=Cyan>`elem`</font> args    <font color=Red>=</font> <font color=Cyan>(</font>Str<font color=Cyan>,</font>x<font color=Cyan>)</font><font color=Red><b>:</b></font> classifyRhs args xs+<a name="(line96)"></a>    classifyRhs args <font color=Cyan>(</font><font color=Magenta>"##"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line97)"></a>                          <font color=Red>|</font> ansi             <font color=Red>=</font> classifyRhs args xs+<a name="(line98)"></a>    classifyRhs args <font color=Cyan>(</font>s<font color=Red><b>:</b></font><font color=Magenta>"##"</font><font color=Red><b>:</b></font>s'<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line99)"></a>                          <font color=Red>|</font> ansi <font color=Cyan>&amp;&amp;</font> all isSpace s <font color=Cyan>&amp;&amp;</font> all isSpace s'+<a name="(line100)"></a>                                             <font color=Red>=</font> classifyRhs args xs+<a name="(line101)"></a>    classifyRhs args <font color=Cyan>(</font>word<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line102)"></a>                          <font color=Red>|</font> word <font color=Cyan>`elem`</font> args <font color=Red>=</font> <font color=Cyan>(</font>Arg<font color=Cyan>,</font>word<font color=Cyan>)</font><font color=Red><b>:</b></font> classifyRhs args xs+<a name="(line103)"></a>                          <font color=Red>|</font> otherwise        <font color=Red>=</font> <font color=Cyan>(</font>Text<font color=Cyan>,</font>word<font color=Cyan>)</font><font color=Red><b>:</b></font> classifyRhs args xs+<a name="(line104)"></a>    classifyRhs <font color=Green><u>_</u></font>    []                      <font color=Red>=</font> []+<a name="(line105)"></a>    count <font color=Red>=</font> length <font color=Cyan>.</font> filter <font color=Cyan>(</font><font color=Cyan>==</font><font color=Magenta>'\n'</font><font color=Cyan>)</font> <font color=Cyan>.</font> concat+<a name="(line106)"></a>    chop  <font color=Red>=</font> reverse <font color=Cyan>.</font> dropWhile <font color=Cyan>(</font>all isSpace<font color=Cyan>)</font> <font color=Cyan>.</font> reverse+<a name="(line107)"></a> </pre>+</html>
docs/cpphs/Language/Preprocessor/Cpphs/MacroPass.html view
@@ -1,129 +1,133 @@-<pre><font color=Blue>-----------------------------------------------------------------------------</font>-<font color=Blue>-- |</font>-<font color=Blue>-- Module      :  MacroPass</font>-<font color=Blue>-- Copyright   :  2004 Malcolm Wallace</font>-<font color=Blue>-- Licence     :  LGPL</font>-<font color=Blue>--</font>-<font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>-<font color=Blue>-- Stability   :  experimental</font>-<font color=Blue>-- Portability :  All</font>-<font color=Blue>--</font>-<font color=Blue>-- Perform a cpp.second-pass, accumulating \#define's and \#undef's,</font>-<font color=Blue>-- whilst doing symbol replacement and macro expansion.</font>-<font color=Blue>-----------------------------------------------------------------------------</font>--<font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>MacroPass-  <font color=Cyan>(</font> macroPass-  <font color=Cyan>,</font> preDefine-  <font color=Cyan>,</font> defineMacro-  <font color=Cyan>)</font> <font color=Green><u>where</u></font>--<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>HashDefine <font color=Cyan>(</font>HashDefine<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> expandMacro<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Tokenise   <font color=Cyan>(</font>tokenise<font color=Cyan>,</font> WordStyle<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-                                              <font color=Cyan>,</font> parseMacroCall<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>SymTab     <font color=Cyan>(</font>SymTab<font color=Cyan>,</font> lookupST<font color=Cyan>,</font> insertST-                                              <font color=Cyan>,</font> emptyST<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Position   <font color=Cyan>(</font>Posn<font color=Cyan>,</font> newfile<font color=Cyan>,</font> filename<font color=Cyan>,</font> lineno<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Options    <font color=Cyan>(</font>BoolOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>)</font>-<font color=Green><u>import</u></font> System<font color=Cyan>.</font>IO<font color=Cyan>.</font>Unsafe <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Time       <font color=Cyan>(</font>getClockTime<font color=Cyan>,</font> toCalendarTime<font color=Cyan>,</font> formatCalendarTime<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Locale     <font color=Cyan>(</font>defaultTimeLocale<font color=Cyan>)</font>--noPos <font color=Red>::</font> Posn-<a name="noPos"></a>noPos <font color=Red>=</font> newfile <font color=Magenta>"preDefined"</font>--<font color=Blue>-- | Walk through the document, replacing calls of macros with the expanded RHS.</font>-macroPass <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>	<font color=Blue>-- ^ Pre-defined symbols and their values</font>-          <font color=Red>-&gt;</font> BoolOptions	<font color=Blue>-- ^ Options that alter processing style</font>-          <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>	<font color=Blue>-- ^ The input file content</font>-          <font color=Red>-&gt;</font> String		<font color=Blue>-- ^ The file after processing</font>-<a name="macroPass"></a>macroPass syms options <font color=Red>=</font>-    safetail		<font color=Blue>-- to remove extra "\n" inserted below</font>-    <font color=Cyan>.</font> concat-    <font color=Cyan>.</font> macroProcess <font color=Cyan>(</font>pragma options<font color=Cyan>)</font> <font color=Cyan>(</font>layout options<font color=Cyan>)</font> <font color=Cyan>(</font>lang options<font color=Cyan>)</font>-                   <font color=Cyan>(</font>preDefine options syms<font color=Cyan>)</font>-    <font color=Cyan>.</font> tokenise <font color=Cyan>(</font>strip options<font color=Cyan>)</font> <font color=Cyan>(</font>ansi options<font color=Cyan>)</font> <font color=Cyan>(</font>lang options<font color=Cyan>)</font>-    <font color=Cyan>.</font> <font color=Cyan>(</font><font color=Cyan>(</font>noPos<font color=Cyan>,</font><font color=Magenta>""</font><font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Cyan>)</font>	<font color=Blue>-- ensure recognition of "\n#" at start of file</font>-  <font color=Green><u>where</u></font>-    safetail <font color=Red>[</font><font color=Red>]</font> <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>-    safetail <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> xs---<font color=Blue>-- | Turn command-line definitions (from @-D@) into 'HashDefine's.</font>-preDefine <font color=Red>::</font> BoolOptions <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-&gt;</font> SymTab HashDefine-<a name="preDefine"></a>preDefine options defines <font color=Red>=</font>-    foldr <font color=Cyan>(</font>insertST <font color=Cyan>.</font> defineMacro options <font color=Cyan>.</font> <font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>s<font color=Cyan>,</font>d<font color=Cyan>)</font><font color=Red>-&gt;</font> s<font color=Cyan>++</font><font color=Magenta>" "</font><font color=Cyan>++</font>d<font color=Cyan>)</font><font color=Cyan>)</font>-          emptyST defines--<font color=Blue>-- | Turn a string representing a macro definition into a 'HashDefine'.</font>-defineMacro <font color=Red>::</font> BoolOptions <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> <font color=Cyan>(</font>String<font color=Cyan>,</font>HashDefine<font color=Cyan>)</font>-<a name="defineMacro"></a>defineMacro opts s <font color=Red>=</font>-    <font color=Green><u>let</u></font> <font color=Cyan>(</font>Cmd <font color=Cyan>(</font>Just hd<font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> tokenise True <font color=Cyan>(</font>ansi opts<font color=Cyan>)</font> <font color=Cyan>(</font>lang opts<font color=Cyan>)</font>-                                     <font color=Red>[</font><font color=Cyan>(</font>noPos<font color=Cyan>,</font><font color=Magenta>"\n#define "</font><font color=Cyan>++</font>s<font color=Cyan>++</font><font color=Magenta>"\n"</font><font color=Cyan>)</font><font color=Red>]</font>-    <font color=Green><u>in</u></font> <font color=Cyan>(</font>name hd<font color=Cyan>,</font> hd<font color=Cyan>)</font>---<font color=Blue>-- | Trundle through the document, one word at a time, using the WordStyle</font>-<font color=Blue>--   classification introduced by 'tokenise' to decide whether to expand a</font>-<font color=Blue>--   word or macro.  Encountering a \#define or \#undef causes that symbol to</font>-<font color=Blue>--   be overwritten in the symbol table.  Any other remaining cpp directives</font>-<font color=Blue>--   are discarded and replaced with blanks, except for \#line markers.</font>-<font color=Blue>--   All valid identifiers are checked for the presence of a definition</font>-<font color=Blue>--   of that name in the symbol table, and if so, expanded appropriately.</font>-<font color=Blue>--   (Bool arguments are: keep pragmas?  retain layout?  haskell language?)</font>-macroProcess <font color=Red>::</font> Bool <font color=Red>-&gt;</font> Bool <font color=Red>-&gt;</font> Bool <font color=Red>-&gt;</font> SymTab HashDefine <font color=Red>-&gt;</font> <font color=Red>[</font>WordStyle<font color=Red>]</font>-             <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font>-<a name="macroProcess"></a>macroProcess <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font>         <font color=Red>[</font><font color=Red>]</font>               <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>-macroProcess p y l st <font color=Cyan>(</font>Other x<font color=Red><b>:</b></font> ws<font color=Cyan>)</font>           <font color=Red>=</font> x<font color=Red><b>:</b></font>    macroProcess p y l st ws-macroProcess p y l st <font color=Cyan>(</font>Cmd Nothing<font color=Red><b>:</b></font> ws<font color=Cyan>)</font>       <font color=Red>=</font> <font color=Magenta>"\n"</font><font color=Red><b>:</b></font> macroProcess p y l st ws-macroProcess p y l st <font color=Cyan>(</font>Cmd <font color=Cyan>(</font>Just <font color=Cyan>(</font>LineDrop x<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font> ws<font color=Cyan>)</font>-                                              <font color=Red>=</font> <font color=Magenta>"\n"</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>macroProcess p y l st ws-macroProcess pragma y l st <font color=Cyan>(</font>Cmd <font color=Cyan>(</font>Just <font color=Cyan>(</font>Pragma x<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font> ws<font color=Cyan>)</font>-                             <font color=Red>|</font> pragma    <font color=Red>=</font> <font color=Magenta>"\n"</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>macroProcess pragma y l st ws-                             <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Magenta>"\n"</font><font color=Red><b>:</b></font>  macroProcess pragma y l st ws-macroProcess p layout lang st <font color=Cyan>(</font>Cmd <font color=Cyan>(</font>Just hd<font color=Cyan>)</font><font color=Red><b>:</b></font> ws<font color=Cyan>)</font> <font color=Red>=</font>-    <font color=Green><u>let</u></font> n <font color=Red>=</font> <font color=Magenta>1</font> <font color=Cyan>+</font> linebreaks hd <font color=Green><u>in</u></font>-    replicate n <font color=Magenta>"\n"</font> <font color=Cyan>++</font>macroProcess p layout lang <font color=Cyan>(</font>insertST <font color=Cyan>(</font>name hd<font color=Cyan>,</font> hd<font color=Cyan>)</font> st<font color=Cyan>)</font> ws-macroProcess pr layout lang st <font color=Cyan>(</font>Ident p x<font color=Red><b>:</b></font> ws<font color=Cyan>)</font> <font color=Red>=</font>-    <font color=Green><u>case</u></font> x <font color=Green><u>of</u></font>-      <font color=Magenta>"__FILE__"</font> <font color=Red>-&gt;</font> show <font color=Cyan>(</font>filename p<font color=Cyan>)</font><font color=Red><b>:</b></font> macroProcess pr layout lang st ws-      <font color=Magenta>"__LINE__"</font> <font color=Red>-&gt;</font> show <font color=Cyan>(</font>lineno p<font color=Cyan>)</font><font color=Red><b>:</b></font>   macroProcess pr layout lang st ws-      <font color=Magenta>"__DATE__"</font> <font color=Red>-&gt;</font> formatCalendarTime defaultTimeLocale <font color=Magenta>"\"%d %b %Y\""</font>-                        <font color=Cyan>(</font>unsafePerformIO <font color=Cyan>(</font>getClockTime<font color=Cyan>&gt;&gt;=</font>toCalendarTime<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font>-                                       macroProcess pr layout lang st ws-      <font color=Magenta>"__TIME__"</font> <font color=Red>-&gt;</font> formatCalendarTime defaultTimeLocale <font color=Magenta>"\"%H:%M:%S\""</font>-                        <font color=Cyan>(</font>unsafePerformIO <font color=Cyan>(</font>getClockTime<font color=Cyan>&gt;&gt;=</font>toCalendarTime<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font>-                                       macroProcess pr layout lang st ws-      <font color=Green><u>_</u></font> <font color=Red>-&gt;</font>-        <font color=Green><u>case</u></font> lookupST x st <font color=Green><u>of</u></font>-            Nothing <font color=Red>-&gt;</font> x<font color=Red><b>:</b></font> macroProcess pr layout lang st ws-            Just hd <font color=Red>-&gt;</font>-                <font color=Green><u>case</u></font> hd <font color=Green><u>of</u></font>-                    SymbolReplacement <font color=Cyan>{</font>replacement<font color=Red>=</font>r<font color=Cyan>}</font> <font color=Red>-&gt;</font>-                        <font color=Green><u>let</u></font> r' <font color=Red>=</font> <font color=Green><u>if</u></font> layout <font color=Green><u>then</u></font> r <font color=Green><u>else</u></font> filter <font color=Cyan>(</font><font color=Cyan>/=</font><font color=Magenta>'\n'</font><font color=Cyan>)</font> r <font color=Green><u>in</u></font>-                        <font color=Blue>-- one-level expansion only:</font>-                        <font color=Blue>-- r' : macroProcess layout st ws</font>-                        <font color=Blue>-- multi-level expansion:</font>-                        macroProcess pr layout lang st-                                     <font color=Cyan>(</font>tokenise True False lang <font color=Red>[</font><font color=Cyan>(</font>p<font color=Cyan>,</font>r'<font color=Cyan>)</font><font color=Red>]</font>-                                      <font color=Cyan>++</font> ws<font color=Cyan>)</font>-                    MacroExpansion <font color=Cyan>{</font><font color=Cyan>}</font> <font color=Red>-&gt;</font>-                        <font color=Green><u>case</u></font> parseMacroCall p ws <font color=Green><u>of</u></font>-                            Nothing <font color=Red>-&gt;</font> x<font color=Red><b>:</b></font> macroProcess pr layout lang st ws-                            Just <font color=Cyan>(</font>args<font color=Cyan>,</font>ws'<font color=Cyan>)</font> <font color=Red>-&gt;</font>-                                <font color=Green><u>if</u></font> length args <font color=Cyan>/=</font> length <font color=Cyan>(</font>arguments hd<font color=Cyan>)</font> <font color=Green><u>then</u></font>-                                     x<font color=Red><b>:</b></font> macroProcess pr layout lang st ws-                                <font color=Green><u>else</u></font> <font color=Green><u>let</u></font> args' <font color=Red>=</font> map <font color=Cyan>(</font>concat-                                                     <font color=Cyan>.</font> macroProcess pr layout-                                                                    lang st<font color=Cyan>)</font>-                                                     args <font color=Green><u>in</u></font>-                                     <font color=Blue>-- one-level expansion only:</font>-                                     <font color=Blue>-- expandMacro hd args' layout:</font>-                                     <font color=Blue>--         macroProcess layout st ws'</font>-                                     <font color=Blue>-- multi-level expansion:</font>-                                     macroProcess pr layout lang st-                                         <font color=Cyan>(</font>tokenise True False lang-                                              <font color=Red>[</font><font color=Cyan>(</font>p<font color=Cyan>,</font>expandMacro hd args' layout<font color=Cyan>)</font><font color=Red>]</font>-                                         <font color=Cyan>++</font> ws'<font color=Cyan>)</font>-+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">+<html>+<pre><a name="(line1)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line2)"></a><font color=Blue>-- |</font>+<a name="(line3)"></a><font color=Blue>-- Module      :  MacroPass</font>+<a name="(line4)"></a><font color=Blue>-- Copyright   :  2004 Malcolm Wallace</font>+<a name="(line5)"></a><font color=Blue>-- Licence     :  LGPL</font>+<a name="(line6)"></a><font color=Blue>--</font>+<a name="(line7)"></a><font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>+<a name="(line8)"></a><font color=Blue>-- Stability   :  experimental</font>+<a name="(line9)"></a><font color=Blue>-- Portability :  All</font>+<a name="(line10)"></a><font color=Blue>--</font>+<a name="(line11)"></a><font color=Blue>-- Perform a cpp.second-pass, accumulating \#define's and \#undef's,</font>+<a name="(line12)"></a><font color=Blue>-- whilst doing symbol replacement and macro expansion.</font>+<a name="(line13)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line14)"></a>+<a name="(line15)"></a><font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>MacroPass+<a name="(line16)"></a>  <font color=Cyan>(</font> macroPass+<a name="(line17)"></a>  <font color=Cyan>,</font> preDefine+<a name="(line18)"></a>  <font color=Cyan>,</font> defineMacro+<a name="(line19)"></a>  <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="(line20)"></a>+<a name="(line21)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>HashDefine <font color=Cyan>(</font>HashDefine<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> expandMacro<font color=Cyan>)</font>+<a name="(line22)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Tokenise   <font color=Cyan>(</font>tokenise<font color=Cyan>,</font> WordStyle<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="(line23)"></a>                                              <font color=Cyan>,</font> parseMacroCall<font color=Cyan>)</font>+<a name="(line24)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>SymTab     <font color=Cyan>(</font>SymTab<font color=Cyan>,</font> lookupST<font color=Cyan>,</font> insertST+<a name="(line25)"></a>                                              <font color=Cyan>,</font> emptyST<font color=Cyan>)</font>+<a name="(line26)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Position   <font color=Cyan>(</font>Posn<font color=Cyan>,</font> newfile<font color=Cyan>,</font> filename<font color=Cyan>,</font> lineno<font color=Cyan>)</font>+<a name="(line27)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Options    <font color=Cyan>(</font>BoolOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line28)"></a><font color=Green><u>import</u></font> System<font color=Cyan>.</font>IO<font color=Cyan>.</font>Unsafe <font color=Cyan>(</font>unsafePerformIO<font color=Cyan>)</font>+<a name="(line29)"></a><font color=Green><u>import</u></font> Time       <font color=Cyan>(</font>getClockTime<font color=Cyan>,</font> toCalendarTime<font color=Cyan>,</font> formatCalendarTime<font color=Cyan>)</font>+<a name="(line30)"></a><font color=Green><u>import</u></font> Locale     <font color=Cyan>(</font>defaultTimeLocale<font color=Cyan>)</font>+<a name="(line31)"></a>+<a name="(line32)"></a><a name="noPos"></a>noPos <font color=Red>::</font> Posn+<a name="(line33)"></a>noPos <font color=Red>=</font> newfile <font color=Magenta>"preDefined"</font>+<a name="(line34)"></a>+<a name="(line35)"></a><a name="macroPass"></a><font color=Blue>-- | Walk through the document, replacing calls of macros with the expanded RHS.</font>+<a name="(line36)"></a>macroPass <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>	<font color=Blue>-- ^ Pre-defined symbols and their values</font>+<a name="(line37)"></a>          <font color=Red>-&gt;</font> BoolOptions	<font color=Blue>-- ^ Options that alter processing style</font>+<a name="(line38)"></a>          <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>	<font color=Blue>-- ^ The input file content</font>+<a name="(line39)"></a>          <font color=Red>-&gt;</font> String		<font color=Blue>-- ^ The file after processing</font>+<a name="(line40)"></a>macroPass syms options <font color=Red>=</font>+<a name="(line41)"></a>    safetail		<font color=Blue>-- to remove extra "\n" inserted below</font>+<a name="(line42)"></a>    <font color=Cyan>.</font> concat+<a name="(line43)"></a>    <font color=Cyan>.</font> macroProcess <font color=Cyan>(</font>pragma options<font color=Cyan>)</font> <font color=Cyan>(</font>layout options<font color=Cyan>)</font> <font color=Cyan>(</font>lang options<font color=Cyan>)</font>+<a name="(line44)"></a>                   <font color=Cyan>(</font>preDefine options syms<font color=Cyan>)</font>+<a name="(line45)"></a>    <font color=Cyan>.</font> tokenise <font color=Cyan>(</font>stripEol options<font color=Cyan>)</font> <font color=Cyan>(</font>stripC89 options<font color=Cyan>)</font>+<a name="(line46)"></a>               <font color=Cyan>(</font>ansi options<font color=Cyan>)</font> <font color=Cyan>(</font>lang options<font color=Cyan>)</font>+<a name="(line47)"></a>    <font color=Cyan>.</font> <font color=Cyan>(</font><font color=Cyan>(</font>noPos<font color=Cyan>,</font><font color=Magenta>""</font><font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Cyan>)</font>	<font color=Blue>-- ensure recognition of "\n#" at start of file</font>+<a name="(line48)"></a>  <font color=Green><u>where</u></font>+<a name="(line49)"></a>    safetail [] <font color=Red>=</font> []+<a name="(line50)"></a>    safetail <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> xs+<a name="(line51)"></a>+<a name="(line52)"></a>+<a name="(line53)"></a><a name="preDefine"></a><font color=Blue>-- | Turn command-line definitions (from @-D@) into 'HashDefine's.</font>+<a name="(line54)"></a>preDefine <font color=Red>::</font> BoolOptions <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-&gt;</font> SymTab HashDefine+<a name="(line55)"></a>preDefine options defines <font color=Red>=</font>+<a name="(line56)"></a>    foldr <font color=Cyan>(</font>insertST <font color=Cyan>.</font> defineMacro options <font color=Cyan>.</font> <font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>s<font color=Cyan>,</font>d<font color=Cyan>)</font><font color=Red>-&gt;</font> s<font color=Cyan>++</font><font color=Magenta>" "</font><font color=Cyan>++</font>d<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line57)"></a>          emptyST defines+<a name="(line58)"></a>+<a name="(line59)"></a><a name="defineMacro"></a><font color=Blue>-- | Turn a string representing a macro definition into a 'HashDefine'.</font>+<a name="(line60)"></a>defineMacro <font color=Red>::</font> BoolOptions <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> <font color=Cyan>(</font>String<font color=Cyan>,</font>HashDefine<font color=Cyan>)</font>+<a name="(line61)"></a>defineMacro opts s <font color=Red>=</font>+<a name="(line62)"></a>    <font color=Green><u>let</u></font> <font color=Cyan>(</font>Cmd <font color=Cyan>(</font>Just hd<font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> tokenise True True <font color=Cyan>(</font>ansi opts<font color=Cyan>)</font> <font color=Cyan>(</font>lang opts<font color=Cyan>)</font>+<a name="(line63)"></a>                                     <font color=Red>[</font><font color=Cyan>(</font>noPos<font color=Cyan>,</font><font color=Magenta>"\n#define "</font><font color=Cyan>++</font>s<font color=Cyan>++</font><font color=Magenta>"\n"</font><font color=Cyan>)</font><font color=Red>]</font>+<a name="(line64)"></a>    <font color=Green><u>in</u></font> <font color=Cyan>(</font>name hd<font color=Cyan>,</font> hd<font color=Cyan>)</font>+<a name="(line65)"></a>+<a name="(line66)"></a>+<a name="(line67)"></a><a name="macroProcess"></a><font color=Blue>-- | Trundle through the document, one word at a time, using the WordStyle</font>+<a name="(line68)"></a><font color=Blue>--   classification introduced by 'tokenise' to decide whether to expand a</font>+<a name="(line69)"></a><font color=Blue>--   word or macro.  Encountering a \#define or \#undef causes that symbol to</font>+<a name="(line70)"></a><font color=Blue>--   be overwritten in the symbol table.  Any other remaining cpp directives</font>+<a name="(line71)"></a><font color=Blue>--   are discarded and replaced with blanks, except for \#line markers.</font>+<a name="(line72)"></a><font color=Blue>--   All valid identifiers are checked for the presence of a definition</font>+<a name="(line73)"></a><font color=Blue>--   of that name in the symbol table, and if so, expanded appropriately.</font>+<a name="(line74)"></a><font color=Blue>--   (Bool arguments are: keep pragmas?  retain layout?  haskell language?)</font>+<a name="(line75)"></a>macroProcess <font color=Red>::</font> Bool <font color=Red>-&gt;</font> Bool <font color=Red>-&gt;</font> Bool <font color=Red>-&gt;</font> SymTab HashDefine <font color=Red>-&gt;</font> <font color=Red>[</font>WordStyle<font color=Red>]</font>+<a name="(line76)"></a>             <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font>+<a name="(line77)"></a>macroProcess <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font>         []               <font color=Red>=</font> []+<a name="(line78)"></a>macroProcess p y l st <font color=Cyan>(</font>Other x<font color=Red><b>:</b></font> ws<font color=Cyan>)</font>           <font color=Red>=</font> x<font color=Red><b>:</b></font>    macroProcess p y l st ws+<a name="(line79)"></a>macroProcess p y l st <font color=Cyan>(</font>Cmd Nothing<font color=Red><b>:</b></font> ws<font color=Cyan>)</font>       <font color=Red>=</font> <font color=Magenta>"\n"</font><font color=Red><b>:</b></font> macroProcess p y l st ws+<a name="(line80)"></a>macroProcess p y l st <font color=Cyan>(</font>Cmd <font color=Cyan>(</font>Just <font color=Cyan>(</font>LineDrop x<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font> ws<font color=Cyan>)</font>+<a name="(line81)"></a>                                              <font color=Red>=</font> <font color=Magenta>"\n"</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>macroProcess p y l st ws+<a name="(line82)"></a>macroProcess pragma y l st <font color=Cyan>(</font>Cmd <font color=Cyan>(</font>Just <font color=Cyan>(</font>Pragma x<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font> ws<font color=Cyan>)</font>+<a name="(line83)"></a>                             <font color=Red>|</font> pragma    <font color=Red>=</font> <font color=Magenta>"\n"</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>macroProcess pragma y l st ws+<a name="(line84)"></a>                             <font color=Red>|</font> otherwise <font color=Red>=</font> <font color=Magenta>"\n"</font><font color=Red><b>:</b></font>  macroProcess pragma y l st ws+<a name="(line85)"></a>macroProcess p layout lang st <font color=Cyan>(</font>Cmd <font color=Cyan>(</font>Just hd<font color=Cyan>)</font><font color=Red><b>:</b></font> ws<font color=Cyan>)</font> <font color=Red>=</font>+<a name="(line86)"></a>    <font color=Green><u>let</u></font> n <font color=Red>=</font> <font color=Magenta>1</font> <font color=Cyan>+</font> linebreaks hd <font color=Green><u>in</u></font>+<a name="(line87)"></a>    replicate n <font color=Magenta>"\n"</font> <font color=Cyan>++</font>macroProcess p layout lang <font color=Cyan>(</font>insertST <font color=Cyan>(</font>name hd<font color=Cyan>,</font> hd<font color=Cyan>)</font> st<font color=Cyan>)</font> ws+<a name="(line88)"></a>macroProcess pr layout lang st <font color=Cyan>(</font>Ident p x<font color=Red><b>:</b></font> ws<font color=Cyan>)</font> <font color=Red>=</font>+<a name="(line89)"></a>    <font color=Green><u>case</u></font> x <font color=Green><u>of</u></font>+<a name="(line90)"></a>      <font color=Magenta>"__FILE__"</font> <font color=Red>-&gt;</font> show <font color=Cyan>(</font>filename p<font color=Cyan>)</font><font color=Red><b>:</b></font> macroProcess pr layout lang st ws+<a name="(line91)"></a>      <font color=Magenta>"__LINE__"</font> <font color=Red>-&gt;</font> show <font color=Cyan>(</font>lineno p<font color=Cyan>)</font><font color=Red><b>:</b></font>   macroProcess pr layout lang st ws+<a name="(line92)"></a>      <font color=Magenta>"__DATE__"</font> <font color=Red>-&gt;</font> formatCalendarTime defaultTimeLocale <font color=Magenta>"\"%d %b %Y\""</font>+<a name="(line93)"></a>                        <font color=Cyan>(</font>unsafePerformIO <font color=Cyan>(</font>getClockTime<font color=Cyan>&gt;&gt;=</font>toCalendarTime<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font>+<a name="(line94)"></a>                                       macroProcess pr layout lang st ws+<a name="(line95)"></a>      <font color=Magenta>"__TIME__"</font> <font color=Red>-&gt;</font> formatCalendarTime defaultTimeLocale <font color=Magenta>"\"%H:%M:%S\""</font>+<a name="(line96)"></a>                        <font color=Cyan>(</font>unsafePerformIO <font color=Cyan>(</font>getClockTime<font color=Cyan>&gt;&gt;=</font>toCalendarTime<font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font>+<a name="(line97)"></a>                                       macroProcess pr layout lang st ws+<a name="(line98)"></a>      <font color=Green><u>_</u></font> <font color=Red>-&gt;</font>+<a name="(line99)"></a>        <font color=Green><u>case</u></font> lookupST x st <font color=Green><u>of</u></font>+<a name="(line100)"></a>            Nothing <font color=Red>-&gt;</font> x<font color=Red><b>:</b></font> macroProcess pr layout lang st ws+<a name="(line101)"></a>            Just hd <font color=Red>-&gt;</font>+<a name="(line102)"></a>                <font color=Green><u>case</u></font> hd <font color=Green><u>of</u></font>+<a name="(line103)"></a>                    SymbolReplacement <font color=Cyan>{</font>replacement<font color=Red>=</font>r<font color=Cyan>}</font> <font color=Red>-&gt;</font>+<a name="(line104)"></a>                        <font color=Green><u>let</u></font> r' <font color=Red>=</font> <font color=Green><u>if</u></font> layout <font color=Green><u>then</u></font> r <font color=Green><u>else</u></font> filter <font color=Cyan>(</font><font color=Cyan>/=</font><font color=Magenta>'\n'</font><font color=Cyan>)</font> r <font color=Green><u>in</u></font>+<a name="(line105)"></a>                        <font color=Blue>-- one-level expansion only:</font>+<a name="(line106)"></a>                        <font color=Blue>-- r' : macroProcess layout st ws</font>+<a name="(line107)"></a>                        <font color=Blue>-- multi-level expansion:</font>+<a name="(line108)"></a>                        macroProcess pr layout lang st+<a name="(line109)"></a>                                     <font color=Cyan>(</font>tokenise True True False lang <font color=Red>[</font><font color=Cyan>(</font>p<font color=Cyan>,</font>r'<font color=Cyan>)</font><font color=Red>]</font>+<a name="(line110)"></a>                                      <font color=Cyan>++</font> ws<font color=Cyan>)</font>+<a name="(line111)"></a>                    MacroExpansion <font color=Cyan>{</font><font color=Cyan>}</font> <font color=Red>-&gt;</font>+<a name="(line112)"></a>                        <font color=Green><u>case</u></font> parseMacroCall p ws <font color=Green><u>of</u></font>+<a name="(line113)"></a>                            Nothing <font color=Red>-&gt;</font> x<font color=Red><b>:</b></font> macroProcess pr layout lang st ws+<a name="(line114)"></a>                            Just <font color=Cyan>(</font>args<font color=Cyan>,</font>ws'<font color=Cyan>)</font> <font color=Red>-&gt;</font>+<a name="(line115)"></a>                                <font color=Green><u>if</u></font> length args <font color=Cyan>/=</font> length <font color=Cyan>(</font>arguments hd<font color=Cyan>)</font> <font color=Green><u>then</u></font>+<a name="(line116)"></a>                                     x<font color=Red><b>:</b></font> macroProcess pr layout lang st ws+<a name="(line117)"></a>                                <font color=Green><u>else</u></font> <font color=Green><u>let</u></font> args' <font color=Red>=</font> map <font color=Cyan>(</font>concat+<a name="(line118)"></a>                                                     <font color=Cyan>.</font> macroProcess pr layout+<a name="(line119)"></a>                                                                    lang st<font color=Cyan>)</font>+<a name="(line120)"></a>                                                     args <font color=Green><u>in</u></font>+<a name="(line121)"></a>                                     <font color=Blue>-- one-level expansion only:</font>+<a name="(line122)"></a>                                     <font color=Blue>-- expandMacro hd args' layout:</font>+<a name="(line123)"></a>                                     <font color=Blue>--         macroProcess layout st ws'</font>+<a name="(line124)"></a>                                     <font color=Blue>-- multi-level expansion:</font>+<a name="(line125)"></a>                                     macroProcess pr layout lang st+<a name="(line126)"></a>                                         <font color=Cyan>(</font>tokenise True True False lang+<a name="(line127)"></a>                                              <font color=Red>[</font><font color=Cyan>(</font>p<font color=Cyan>,</font>expandMacro hd args' layout<font color=Cyan>)</font><font color=Red>]</font>+<a name="(line128)"></a>                                         <font color=Cyan>++</font> ws'<font color=Cyan>)</font>+<a name="(line129)"></a> </pre>+</html>
docs/cpphs/Language/Preprocessor/Cpphs/Options.html view
@@ -1,135 +1,150 @@-<pre><font color=Blue>-----------------------------------------------------------------------------</font>-<font color=Blue>-- |</font>-<font color=Blue>-- Module      :  Options</font>-<font color=Blue>-- Copyright   :  2006 Malcolm Wallace</font>-<font color=Blue>-- Licence     :  LGPL</font>-<font color=Blue>--</font>-<font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>-<font color=Blue>-- Stability   :  experimental</font>-<font color=Blue>-- Portability :  All</font>-<font color=Blue>--</font>-<font color=Blue>-- This module deals with Cpphs options and parsing them</font>-<font color=Blue>-----------------------------------------------------------------------------</font>--<font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Options-  <font color=Cyan>(</font> CpphsOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-  <font color=Cyan>,</font> BoolOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-  <font color=Cyan>,</font> parseOptions-  <font color=Cyan>,</font> defaultCpphsOptions-  <font color=Cyan>,</font> defaultBoolOptions-  <font color=Cyan>)</font> <font color=Green><u>where</u></font>--<font color=Green><u>import</u></font> Maybe--<font color=Blue>-- | Cpphs options structure.</font>-<a name="CpphsOptions"></a><font color=Green><u>data</u></font> CpphsOptions <font color=Red>=</font> CpphsOptions -    <font color=Cyan>{</font> infiles	<font color=Red>::</font> <font color=Red>[</font>FilePath<font color=Red>]</font>-    <font color=Cyan>,</font> outfiles	<font color=Red>::</font> <font color=Red>[</font>FilePath<font color=Red>]</font>-    <font color=Cyan>,</font> defines	<font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>-    <font color=Cyan>,</font> includes	<font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font>-    <font color=Cyan>,</font> boolopts	<font color=Red>::</font> BoolOptions-    <font color=Cyan>}</font>--<font color=Blue>-- | Default options.</font>-defaultCpphsOptions <font color=Red>::</font> CpphsOptions-<a name="defaultCpphsOptions"></a>defaultCpphsOptions <font color=Red>=</font> CpphsOptions <font color=Cyan>{</font> infiles <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font><font color=Cyan>,</font> outfiles <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>-                                   <font color=Cyan>,</font> defines <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font><font color=Cyan>,</font> includes <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>-                                   <font color=Cyan>,</font> boolopts <font color=Red>=</font> defaultBoolOptions <font color=Cyan>}</font>--<font color=Blue>-- | Options representable as Booleans.</font>-<a name="BoolOptions"></a><font color=Green><u>data</u></font> BoolOptions <font color=Red>=</font> BoolOptions-    <font color=Cyan>{</font> macros	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Leave \#define and \#undef in output of ifdef?</font>-    <font color=Cyan>,</font> locations	<font color=Red>::</font> Bool	 <font color=Blue>-- ^ Place \#line droppings in output?</font>-    <font color=Cyan>,</font> pragma	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Keep \#pragma in final output?</font>-    <font color=Cyan>,</font> strip	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Remove C comments everywhere?</font>-    <font color=Cyan>,</font> lang	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Lex input as Haskell code?</font>-    <font color=Cyan>,</font> ansi	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Permit stringise # and catenate ## operators?</font>-    <font color=Cyan>,</font> layout	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Retain newlines in macro expansions?</font>-    <font color=Cyan>,</font> literate	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Remove literate markup?</font>-    <font color=Cyan>,</font> warnings	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Issue warnings?</font>-    <font color=Cyan>}</font>--<font color=Blue>-- | Default settings of boolean options.</font>-defaultBoolOptions <font color=Red>::</font> BoolOptions-<a name="defaultBoolOptions"></a>defaultBoolOptions <font color=Red>=</font> BoolOptions <font color=Cyan>{</font> macros   <font color=Red>=</font> True<font color=Cyan>,</font>   locations <font color=Red>=</font> True-                                 <font color=Cyan>,</font> pragma   <font color=Red>=</font> False<font color=Cyan>,</font>  strip     <font color=Red>=</font> False-                                 <font color=Cyan>,</font> lang     <font color=Red>=</font> True<font color=Cyan>,</font>   ansi      <font color=Red>=</font> False-                                 <font color=Cyan>,</font> layout   <font color=Red>=</font> False<font color=Cyan>,</font>  literate  <font color=Red>=</font> False-                                 <font color=Cyan>,</font> warnings <font color=Red>=</font> True <font color=Cyan>}</font>--<font color=Blue>-- | Raw command-line options.  This is an internal intermediate data</font>-<font color=Blue>--   structure, used during option parsing only.</font>-<a name="RawOption"></a><font color=Green><u>data</u></font> RawOption-    <font color=Red>=</font> NoMacro-    <font color=Red>|</font> NoLine-    <font color=Red>|</font> Pragma-    <font color=Red>|</font> Text-    <font color=Red>|</font> Strip-    <font color=Red>|</font> Ansi-    <font color=Red>|</font> Layout-    <font color=Red>|</font> Unlit-    <font color=Red>|</font> SuppressWarnings-    <font color=Red>|</font> Macro <font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font>-    <font color=Red>|</font> Path String-      <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font> Show<font color=Cyan>)</font>--flags <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font> RawOption<font color=Cyan>)</font><font color=Red>]</font>-<a name="flags"></a>flags <font color=Red>=</font> <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"--nomacro"</font><font color=Cyan>,</font> NoMacro<font color=Cyan>)</font>-        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--noline"</font><font color=Cyan>,</font>  NoLine<font color=Cyan>)</font>-        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--pragma"</font><font color=Cyan>,</font>  Pragma<font color=Cyan>)</font>-        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--text"</font><font color=Cyan>,</font>    Text<font color=Cyan>)</font>-        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--strip"</font><font color=Cyan>,</font>   Strip<font color=Cyan>)</font>-        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--hashes"</font><font color=Cyan>,</font>  Ansi<font color=Cyan>)</font>-        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--layout"</font><font color=Cyan>,</font>  Layout<font color=Cyan>)</font>-        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--unlit"</font><font color=Cyan>,</font>   Unlit<font color=Cyan>)</font>-        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--nowarn"</font><font color=Cyan>,</font>  SuppressWarnings<font color=Cyan>)</font>-        <font color=Red>]</font>--<font color=Blue>-- | Parse a single raw command-line option.  Parse failure is indicated by</font>-<font color=Blue>--   result Nothing.</font>-rawOption <font color=Red>::</font> String <font color=Red>-&gt;</font> Maybe RawOption-<a name="rawOption"></a>rawOption x <font color=Red>|</font> isJust a <font color=Red>=</font> a-    <font color=Green><u>where</u></font> a <font color=Red>=</font> lookup x flags-rawOption <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'D'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> Just <font color=Cyan>$</font> Macro <font color=Cyan>(</font>s<font color=Cyan>,</font> <font color=Green><u>if</u></font> null d <font color=Green><u>then</u></font> <font color=Magenta>"1"</font> <font color=Green><u>else</u></font> tail d<font color=Cyan>)</font>-    <font color=Green><u>where</u></font> <font color=Cyan>(</font>s<font color=Cyan>,</font>d<font color=Cyan>)</font> <font color=Red>=</font> break <font color=Cyan>(</font><font color=Cyan>==</font><font color=Magenta>'='</font><font color=Cyan>)</font> xs-rawOption <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'I'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> Just <font color=Cyan>$</font> Path <font color=Cyan>$</font> trailing <font color=Magenta>"/\\"</font> xs-rawOption <font color=Green><u>_</u></font> <font color=Red>=</font> Nothing--trailing <font color=Red>::</font> <font color=Cyan>(</font>Eq a<font color=Cyan>)</font> <font color=Red>=&gt;</font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font>a<font color=Red>]</font>-<a name="trailing"></a>trailing xs <font color=Red>=</font> reverse <font color=Cyan>.</font> dropWhile <font color=Cyan>(</font><font color=Cyan>`elem`</font>xs<font color=Cyan>)</font> <font color=Cyan>.</font> reverse--<font color=Blue>-- | Convert a list of RawOption to a BoolOptions structure.</font>-boolOpts <font color=Red>::</font> <font color=Red>[</font>RawOption<font color=Red>]</font> <font color=Red>-&gt;</font> BoolOptions-<a name="boolOpts"></a>boolOpts opts <font color=Red>=</font>-  BoolOptions-    <font color=Cyan>{</font> macros	<font color=Red>=</font> not <font color=Cyan>(</font>NoMacro <font color=Cyan>`elem`</font> opts<font color=Cyan>)</font>-    <font color=Cyan>,</font> locations	<font color=Red>=</font> not <font color=Cyan>(</font>NoLine  <font color=Cyan>`elem`</font> opts<font color=Cyan>)</font>-    <font color=Cyan>,</font> pragma	<font color=Red>=</font>      Pragma  <font color=Cyan>`elem`</font> opts-    <font color=Cyan>,</font> strip	<font color=Red>=</font>      Strip   <font color=Cyan>`elem`</font> opts-    <font color=Cyan>,</font> lang      <font color=Red>=</font> not <font color=Cyan>(</font>Text    <font color=Cyan>`elem`</font> opts<font color=Cyan>)</font>-    <font color=Cyan>,</font> ansi	<font color=Red>=</font>      Ansi    <font color=Cyan>`elem`</font> opts-    <font color=Cyan>,</font> layout	<font color=Red>=</font>      Layout  <font color=Cyan>`elem`</font> opts-    <font color=Cyan>,</font> literate	<font color=Red>=</font>      Unlit   <font color=Cyan>`elem`</font> opts-    <font color=Cyan>,</font> warnings	<font color=Red>=</font> not <font color=Cyan>(</font>SuppressWarnings <font color=Cyan>`elem`</font> opts<font color=Cyan>)</font>-    <font color=Cyan>}</font>--<font color=Blue>-- | Parse all command-line options.</font>-parseOptions <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> Either String CpphsOptions-<a name="parseOptions"></a>parseOptions xs <font color=Red>=</font> f <font color=Cyan>(</font><font color=Red>[</font><font color=Red>]</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Red>]</font><font color=Cyan>,</font> <font color=Red>[</font><font color=Red>]</font><font color=Cyan>)</font> xs-  <font color=Green><u>where</u></font>-    f <font color=Cyan>(</font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'O'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> f <font color=Cyan>(</font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> x<font color=Red><b>:</b></font>outs<font color=Cyan>)</font> xs-    f <font color=Cyan>(</font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>case</u></font> rawOption x <font color=Green><u>of</u></font>-                                           Nothing <font color=Red>-&gt;</font> Left x-                                           Just a  <font color=Red>-&gt;</font> f <font color=Cyan>(</font>a<font color=Red><b>:</b></font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> xs-    f <font color=Cyan>(</font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> f <font color=Cyan>(</font>opts<font color=Cyan>,</font> normalise x<font color=Red><b>:</b></font>ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> xs-    f <font color=Cyan>(</font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> <font color=Red>[</font><font color=Red>]</font>     <font color=Red>=</font>-        Right CpphsOptions <font color=Cyan>{</font> infiles  <font color=Red>=</font> reverse ins-                           <font color=Cyan>,</font> outfiles <font color=Red>=</font> reverse outs-                           <font color=Cyan>,</font> defines  <font color=Red>=</font> <font color=Red>[</font> x <font color=Red>|</font> Macro x <font color=Red>&lt;-</font> reverse opts <font color=Red>]</font>-                           <font color=Cyan>,</font> includes <font color=Red>=</font> <font color=Red>[</font> x <font color=Red>|</font> Path x  <font color=Red>&lt;-</font> reverse opts <font color=Red>]</font>-                           <font color=Cyan>,</font> boolopts <font color=Red>=</font> boolOpts opts-                           <font color=Cyan>}</font>-    normalise <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>filepath<font color=Cyan>)</font> <font color=Red>=</font> normalise <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>filepath<font color=Cyan>)</font>-    normalise <font color=Cyan>(</font>x<font color=Red><b>:</b></font>filepath<font color=Cyan>)</font>       <font color=Red>=</font> x<font color=Red><b>:</b></font>normalise filepath-    normalise <font color=Red>[</font><font color=Red>]</font>                 <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">+<html>+<pre><a name="(line1)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line2)"></a><font color=Blue>-- |</font>+<a name="(line3)"></a><font color=Blue>-- Module      :  Options</font>+<a name="(line4)"></a><font color=Blue>-- Copyright   :  2006 Malcolm Wallace</font>+<a name="(line5)"></a><font color=Blue>-- Licence     :  LGPL</font>+<a name="(line6)"></a><font color=Blue>--</font>+<a name="(line7)"></a><font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>+<a name="(line8)"></a><font color=Blue>-- Stability   :  experimental</font>+<a name="(line9)"></a><font color=Blue>-- Portability :  All</font>+<a name="(line10)"></a><font color=Blue>--</font>+<a name="(line11)"></a><font color=Blue>-- This module deals with Cpphs options and parsing them</font>+<a name="(line12)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line13)"></a>+<a name="(line14)"></a><font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Options+<a name="(line15)"></a>  <font color=Cyan>(</font> CpphsOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="(line16)"></a>  <font color=Cyan>,</font> BoolOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="(line17)"></a>  <font color=Cyan>,</font> parseOptions+<a name="(line18)"></a>  <font color=Cyan>,</font> defaultCpphsOptions+<a name="(line19)"></a>  <font color=Cyan>,</font> defaultBoolOptions+<a name="(line20)"></a>  <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="(line21)"></a>+<a name="(line22)"></a><font color=Green><u>import</u></font> Maybe+<a name="(line23)"></a><font color=Green><u>import</u></font> List <font color=Cyan>(</font>isPrefixOf<font color=Cyan>)</font>+<a name="(line24)"></a>+<a name="(line25)"></a><a name="CpphsOptions"></a><font color=Blue>-- | Cpphs options structure.</font>+<a name="(line26)"></a><a name="CpphsOptions"></a><font color=Green><u>data</u></font> CpphsOptions <font color=Red>=</font> CpphsOptions +<a name="(line27)"></a>    <font color=Cyan>{</font> infiles	<font color=Red>::</font> <font color=Red>[</font>FilePath<font color=Red>]</font>+<a name="(line28)"></a>    <font color=Cyan>,</font> outfiles	<font color=Red>::</font> <font color=Red>[</font>FilePath<font color=Red>]</font>+<a name="(line29)"></a>    <font color=Cyan>,</font> defines	<font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>+<a name="(line30)"></a>    <font color=Cyan>,</font> includes	<font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font>+<a name="(line31)"></a>    <font color=Cyan>,</font> preInclude<font color=Red>::</font> <font color=Red>[</font>FilePath<font color=Red>]</font>	<font color=Blue>-- ^ Files to #include before anything else</font>+<a name="(line32)"></a>    <font color=Cyan>,</font> boolopts	<font color=Red>::</font> BoolOptions+<a name="(line33)"></a>    <font color=Cyan>}</font>+<a name="(line34)"></a>+<a name="(line35)"></a><a name="defaultCpphsOptions"></a><font color=Blue>-- | Default options.</font>+<a name="(line36)"></a>defaultCpphsOptions <font color=Red>::</font> CpphsOptions+<a name="(line37)"></a>defaultCpphsOptions <font color=Red>=</font> CpphsOptions <font color=Cyan>{</font> infiles <font color=Red>=</font> []<font color=Cyan>,</font> outfiles <font color=Red>=</font> []+<a name="(line38)"></a>                                   <font color=Cyan>,</font> defines <font color=Red>=</font> []<font color=Cyan>,</font> includes <font color=Red>=</font> []+<a name="(line39)"></a>                                   <font color=Cyan>,</font> preInclude <font color=Red>=</font> []+<a name="(line40)"></a>                                   <font color=Cyan>,</font> boolopts <font color=Red>=</font> defaultBoolOptions <font color=Cyan>}</font>+<a name="(line41)"></a>+<a name="(line42)"></a><a name="BoolOptions"></a><font color=Blue>-- | Options representable as Booleans.</font>+<a name="(line43)"></a><a name="BoolOptions"></a><font color=Green><u>data</u></font> BoolOptions <font color=Red>=</font> BoolOptions+<a name="(line44)"></a>    <font color=Cyan>{</font> macros	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Leave \#define and \#undef in output of ifdef?</font>+<a name="(line45)"></a>    <font color=Cyan>,</font> locations	<font color=Red>::</font> Bool	 <font color=Blue>-- ^ Place #line droppings in output?</font>+<a name="(line46)"></a>    <font color=Cyan>,</font> pragma	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Keep #pragma in final output?</font>+<a name="(line47)"></a>    <font color=Cyan>,</font> stripEol	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Remove C eol (\/\/) comments everywhere?</font>+<a name="(line48)"></a>    <font color=Cyan>,</font> stripC89	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Remove C inline (\/**\/) comments everywhere?</font>+<a name="(line49)"></a>    <font color=Cyan>,</font> lang	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Lex input as Haskell code?</font>+<a name="(line50)"></a>    <font color=Cyan>,</font> ansi	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Permit stringise \# and catenate \#\# operators?</font>+<a name="(line51)"></a>    <font color=Cyan>,</font> layout	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Retain newlines in macro expansions?</font>+<a name="(line52)"></a>    <font color=Cyan>,</font> literate	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Remove literate markup?</font>+<a name="(line53)"></a>    <font color=Cyan>,</font> warnings	<font color=Red>::</font> Bool  <font color=Blue>-- ^ Issue warnings?</font>+<a name="(line54)"></a>    <font color=Cyan>}</font>+<a name="(line55)"></a>+<a name="(line56)"></a><a name="defaultBoolOptions"></a><font color=Blue>-- | Default settings of boolean options.</font>+<a name="(line57)"></a>defaultBoolOptions <font color=Red>::</font> BoolOptions+<a name="(line58)"></a>defaultBoolOptions <font color=Red>=</font> BoolOptions <font color=Cyan>{</font> macros   <font color=Red>=</font> True<font color=Cyan>,</font>   locations <font color=Red>=</font> True+<a name="(line59)"></a>                                 <font color=Cyan>,</font> pragma   <font color=Red>=</font> False+<a name="(line60)"></a>                                 <font color=Cyan>,</font> stripEol <font color=Red>=</font> False<font color=Cyan>,</font>  stripC89  <font color=Red>=</font> False+<a name="(line61)"></a>                                 <font color=Cyan>,</font> lang     <font color=Red>=</font> True<font color=Cyan>,</font>   ansi      <font color=Red>=</font> False+<a name="(line62)"></a>                                 <font color=Cyan>,</font> layout   <font color=Red>=</font> False<font color=Cyan>,</font>  literate  <font color=Red>=</font> False+<a name="(line63)"></a>                                 <font color=Cyan>,</font> warnings <font color=Red>=</font> True <font color=Cyan>}</font>+<a name="(line64)"></a>+<a name="(line65)"></a><a name="RawOption"></a><font color=Blue>-- | Raw command-line options.  This is an internal intermediate data</font>+<a name="(line66)"></a><a name="RawOption"></a><font color=Blue>--   structure, used during option parsing only.</font>+<a name="(line67)"></a><a name="RawOption"></a><font color=Green><u>data</u></font> RawOption+<a name="(line68)"></a>    <font color=Red>=</font> NoMacro+<a name="(line69)"></a>    <font color=Red>|</font> NoLine+<a name="(line70)"></a>    <font color=Red>|</font> Pragma+<a name="(line71)"></a>    <font color=Red>|</font> Text+<a name="(line72)"></a>    <font color=Red>|</font> Strip+<a name="(line73)"></a>    <font color=Red>|</font> StripEol+<a name="(line74)"></a>    <font color=Red>|</font> Ansi+<a name="(line75)"></a>    <font color=Red>|</font> Layout+<a name="(line76)"></a>    <font color=Red>|</font> Unlit+<a name="(line77)"></a>    <font color=Red>|</font> SuppressWarnings+<a name="(line78)"></a>    <font color=Red>|</font> Macro <font color=Cyan>(</font>String<font color=Cyan>,</font>String<font color=Cyan>)</font>+<a name="(line79)"></a>    <font color=Red>|</font> Path String+<a name="(line80)"></a>    <font color=Red>|</font> PreInclude FilePath+<a name="(line81)"></a>      <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font> Show<font color=Cyan>)</font>+<a name="(line82)"></a>+<a name="(line83)"></a><a name="flags"></a>flags <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font> RawOption<font color=Cyan>)</font><font color=Red>]</font>+<a name="(line84)"></a>flags <font color=Red>=</font> <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"--nomacro"</font><font color=Cyan>,</font> NoMacro<font color=Cyan>)</font>+<a name="(line85)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--noline"</font><font color=Cyan>,</font>  NoLine<font color=Cyan>)</font>+<a name="(line86)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--pragma"</font><font color=Cyan>,</font>  Pragma<font color=Cyan>)</font>+<a name="(line87)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--text"</font><font color=Cyan>,</font>    Text<font color=Cyan>)</font>+<a name="(line88)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--strip"</font><font color=Cyan>,</font>   Strip<font color=Cyan>)</font>+<a name="(line89)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--strip-eol"</font><font color=Cyan>,</font>  StripEol<font color=Cyan>)</font>+<a name="(line90)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--hashes"</font><font color=Cyan>,</font>  Ansi<font color=Cyan>)</font>+<a name="(line91)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--layout"</font><font color=Cyan>,</font>  Layout<font color=Cyan>)</font>+<a name="(line92)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--unlit"</font><font color=Cyan>,</font>   Unlit<font color=Cyan>)</font>+<a name="(line93)"></a>        <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"--nowarn"</font><font color=Cyan>,</font>  SuppressWarnings<font color=Cyan>)</font>+<a name="(line94)"></a>        <font color=Red>]</font>+<a name="(line95)"></a>+<a name="(line96)"></a><a name="rawOption"></a><font color=Blue>-- | Parse a single raw command-line option.  Parse failure is indicated by</font>+<a name="(line97)"></a><font color=Blue>--   result Nothing.</font>+<a name="(line98)"></a>rawOption <font color=Red>::</font> String <font color=Red>-&gt;</font> Maybe RawOption+<a name="(line99)"></a>rawOption x <font color=Red>|</font> isJust a <font color=Red>=</font> a+<a name="(line100)"></a>    <font color=Green><u>where</u></font> a <font color=Red>=</font> lookup x flags+<a name="(line101)"></a>rawOption <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'D'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> Just <font color=Cyan>$</font> Macro <font color=Cyan>(</font>s<font color=Cyan>,</font> <font color=Green><u>if</u></font> null d <font color=Green><u>then</u></font> <font color=Magenta>"1"</font> <font color=Green><u>else</u></font> tail d<font color=Cyan>)</font>+<a name="(line102)"></a>    <font color=Green><u>where</u></font> <font color=Cyan>(</font>s<font color=Cyan>,</font>d<font color=Cyan>)</font> <font color=Red>=</font> break <font color=Cyan>(</font><font color=Cyan>==</font><font color=Magenta>'='</font><font color=Cyan>)</font> xs+<a name="(line103)"></a>rawOption <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'I'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> Just <font color=Cyan>$</font> Path <font color=Cyan>$</font> trailing <font color=Magenta>"/\\"</font> xs+<a name="(line104)"></a>rawOption xs <font color=Red>|</font> <font color=Magenta>"--include="</font><font color=Cyan>`isPrefixOf`</font>xs+<a name="(line105)"></a>            <font color=Red>=</font> Just <font color=Cyan>$</font> PreInclude <font color=Cyan>(</font>drop <font color=Magenta>10</font> xs<font color=Cyan>)</font>+<a name="(line106)"></a>rawOption <font color=Green><u>_</u></font> <font color=Red>=</font> Nothing+<a name="(line107)"></a>+<a name="(line108)"></a><a name="trailing"></a>trailing <font color=Red>::</font> <font color=Cyan>(</font>Eq a<font color=Cyan>)</font> <font color=Red>=&gt;</font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font>a<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font>a<font color=Red>]</font>+<a name="(line109)"></a>trailing xs <font color=Red>=</font> reverse <font color=Cyan>.</font> dropWhile <font color=Cyan>(</font><font color=Cyan>`elem`</font>xs<font color=Cyan>)</font> <font color=Cyan>.</font> reverse+<a name="(line110)"></a>+<a name="(line111)"></a><a name="boolOpts"></a><font color=Blue>-- | Convert a list of RawOption to a BoolOptions structure.</font>+<a name="(line112)"></a>boolOpts <font color=Red>::</font> <font color=Red>[</font>RawOption<font color=Red>]</font> <font color=Red>-&gt;</font> BoolOptions+<a name="(line113)"></a>boolOpts opts <font color=Red>=</font>+<a name="(line114)"></a>  BoolOptions+<a name="(line115)"></a>    <font color=Cyan>{</font> macros	<font color=Red>=</font> not <font color=Cyan>(</font>NoMacro <font color=Cyan>`elem`</font> opts<font color=Cyan>)</font>+<a name="(line116)"></a>    <font color=Cyan>,</font> locations	<font color=Red>=</font> not <font color=Cyan>(</font>NoLine  <font color=Cyan>`elem`</font> opts<font color=Cyan>)</font>+<a name="(line117)"></a>    <font color=Cyan>,</font> pragma	<font color=Red>=</font>      Pragma  <font color=Cyan>`elem`</font> opts+<a name="(line118)"></a>    <font color=Cyan>,</font> stripEol	<font color=Red>=</font>      StripEol<font color=Cyan>`elem`</font> opts+<a name="(line119)"></a>    <font color=Cyan>,</font> stripC89	<font color=Red>=</font>      StripEol<font color=Cyan>`elem`</font> opts <font color=Cyan>||</font> Strip <font color=Cyan>`elem`</font> opts+<a name="(line120)"></a>    <font color=Cyan>,</font> lang      <font color=Red>=</font> not <font color=Cyan>(</font>Text    <font color=Cyan>`elem`</font> opts<font color=Cyan>)</font>+<a name="(line121)"></a>    <font color=Cyan>,</font> ansi	<font color=Red>=</font>      Ansi    <font color=Cyan>`elem`</font> opts+<a name="(line122)"></a>    <font color=Cyan>,</font> layout	<font color=Red>=</font>      Layout  <font color=Cyan>`elem`</font> opts+<a name="(line123)"></a>    <font color=Cyan>,</font> literate	<font color=Red>=</font>      Unlit   <font color=Cyan>`elem`</font> opts+<a name="(line124)"></a>    <font color=Cyan>,</font> warnings	<font color=Red>=</font> not <font color=Cyan>(</font>SuppressWarnings <font color=Cyan>`elem`</font> opts<font color=Cyan>)</font>+<a name="(line125)"></a>    <font color=Cyan>}</font>+<a name="(line126)"></a>+<a name="(line127)"></a><a name="parseOptions"></a><font color=Blue>-- | Parse all command-line options.</font>+<a name="(line128)"></a>parseOptions <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> Either String CpphsOptions+<a name="(line129)"></a>parseOptions xs <font color=Red>=</font> f <font color=Cyan>(</font>[]<font color=Cyan>,</font> []<font color=Cyan>,</font> []<font color=Cyan>)</font> xs+<a name="(line130)"></a>  <font color=Green><u>where</u></font>+<a name="(line131)"></a>    f <font color=Cyan>(</font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'O'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> f <font color=Cyan>(</font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> x<font color=Red><b>:</b></font>outs<font color=Cyan>)</font> xs+<a name="(line132)"></a>    f <font color=Cyan>(</font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>case</u></font> rawOption x <font color=Green><u>of</u></font>+<a name="(line133)"></a>                                           Nothing <font color=Red>-&gt;</font> Left x+<a name="(line134)"></a>                                           Just a  <font color=Red>-&gt;</font> f <font color=Cyan>(</font>a<font color=Red><b>:</b></font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> xs+<a name="(line135)"></a>    f <font color=Cyan>(</font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> f <font color=Cyan>(</font>opts<font color=Cyan>,</font> normalise x<font color=Red><b>:</b></font>ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> xs+<a name="(line136)"></a>    f <font color=Cyan>(</font>opts<font color=Cyan>,</font> ins<font color=Cyan>,</font> outs<font color=Cyan>)</font> []     <font color=Red>=</font>+<a name="(line137)"></a>        Right CpphsOptions <font color=Cyan>{</font> infiles  <font color=Red>=</font> reverse ins+<a name="(line138)"></a>                           <font color=Cyan>,</font> outfiles <font color=Red>=</font> reverse outs+<a name="(line139)"></a>                           <font color=Cyan>,</font> defines  <font color=Red>=</font> <font color=Red>[</font> x <font color=Red>|</font> Macro x <font color=Red>&lt;-</font> reverse opts <font color=Red>]</font>+<a name="(line140)"></a>                           <font color=Cyan>,</font> includes <font color=Red>=</font> <font color=Red>[</font> x <font color=Red>|</font> Path x  <font color=Red>&lt;-</font> reverse opts <font color=Red>]</font>+<a name="(line141)"></a>                           <font color=Cyan>,</font> preInclude<font color=Red>=</font><font color=Red>[</font> x <font color=Red>|</font> PreInclude x <font color=Red>&lt;-</font> reverse opts <font color=Red>]</font>+<a name="(line142)"></a>                           <font color=Cyan>,</font> boolopts <font color=Red>=</font> boolOpts opts+<a name="(line143)"></a>                           <font color=Cyan>}</font>+<a name="(line144)"></a>    normalise <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>filepath<font color=Cyan>)</font> <font color=Red>=</font> normalise <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>filepath<font color=Cyan>)</font>+<a name="(line145)"></a>    normalise <font color=Cyan>(</font>x<font color=Red><b>:</b></font>filepath<font color=Cyan>)</font>       <font color=Red>=</font> x<font color=Red><b>:</b></font>normalise filepath+<a name="(line146)"></a>    normalise []                 <font color=Red>=</font> [] </pre>+</html>
docs/cpphs/Language/Preprocessor/Cpphs/Position.html view
@@ -1,81 +1,84 @@-<pre><font color=Blue>-----------------------------------------------------------------------------</font>-<font color=Blue>-- |</font>-<font color=Blue>-- Module      :  Position</font>-<font color=Blue>-- Copyright   :  2000-2004 Malcolm Wallace</font>-<font color=Blue>-- Licence     :  LGPL</font>-<font color=Blue>--</font>-<font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>-<font color=Blue>-- Stability   :  experimental</font>-<font color=Blue>-- Portability :  All</font>-<font color=Blue>--</font>-<font color=Blue>-- Simple file position information, with recursive inclusion points.</font>-<font color=Blue>-----------------------------------------------------------------------------</font>--<font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Position-  <font color=Cyan>(</font> Posn<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-  <font color=Cyan>,</font> newfile-  <font color=Cyan>,</font> addcol<font color=Cyan>,</font> newline<font color=Cyan>,</font> tab<font color=Cyan>,</font> newlines<font color=Cyan>,</font> newpos-  <font color=Cyan>,</font> cppline-  <font color=Cyan>,</font> filename<font color=Cyan>,</font> lineno<font color=Cyan>,</font> directory-  <font color=Cyan>)</font> <font color=Green><u>where</u></font>--<font color=Blue>-- | Source positions contain a filename, line, column, and an</font>-<font color=Blue>--   inclusion point, which is itself another source position,</font>-<font color=Blue>--   recursively.</font>-<a name="Posn"></a><font color=Green><u>data</u></font> Posn <font color=Red>=</font> Pn String <font color=Cyan>!</font>Int <font color=Cyan>!</font>Int <font color=Cyan>(</font>Maybe Posn<font color=Cyan>)</font>-        <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>)</font>--<font color=Green><u>instance</u></font> Show Posn <font color=Green><u>where</u></font>-      showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>Pn f l c i<font color=Cyan>)</font> <font color=Red>=</font> showString f <font color=Cyan>.</font>-                                 showString <font color=Magenta>"  at line "</font> <font color=Cyan>.</font> shows l <font color=Cyan>.</font>-                                 showString <font color=Magenta>" col "</font> <font color=Cyan>.</font> shows c <font color=Cyan>.</font>-                                 <font color=Cyan>(</font> <font color=Green><u>case</u></font> i <font color=Green><u>of</u></font>-                                    Nothing <font color=Red>-&gt;</font> id-                                    Just p  <font color=Red>-&gt;</font> showString <font color=Magenta>"\n    used by  "</font> <font color=Cyan>.</font>-                                               shows p <font color=Cyan>)</font>--<font color=Blue>-- | Constructor</font>-newfile <font color=Red>::</font> String <font color=Red>-&gt;</font> Posn-<a name="newfile"></a>newfile name <font color=Red>=</font> Pn name <font color=Magenta>1</font> <font color=Magenta>1</font> Nothing--<font color=Blue>-- | Updates</font>-addcol <font color=Red>::</font> Int <font color=Red>-&gt;</font> Posn <font color=Red>-&gt;</font> Posn-<a name="addcol"></a>addcol n <font color=Cyan>(</font>Pn f r c i<font color=Cyan>)</font> <font color=Red>=</font> Pn f r <font color=Cyan>(</font>c<font color=Cyan>+</font>n<font color=Cyan>)</font> i--newline<font color=Cyan>,</font> tab <font color=Red>::</font> Posn <font color=Red>-&gt;</font> Posn-<font color=Blue>--newline (Pn f r _ i) = Pn f (r+1) 1 i</font>-<a name="newline"></a>newline <font color=Cyan>(</font>Pn f r <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>let</u></font> r' <font color=Red>=</font> r<font color=Cyan>+</font><font color=Magenta>1</font> <font color=Green><u>in</u></font> r' <font color=Cyan>`seq`</font> Pn f r' <font color=Magenta>1</font> i-<a name="tab"></a>tab     <font color=Cyan>(</font>Pn f r c i<font color=Cyan>)</font> <font color=Red>=</font> Pn f r <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>c<font color=Cyan>`div`</font><font color=Magenta>8</font><font color=Cyan>)</font><font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font><font color=Cyan>*</font><font color=Magenta>8</font><font color=Cyan>)</font> i--newlines <font color=Red>::</font> Int <font color=Red>-&gt;</font> Posn <font color=Red>-&gt;</font> Posn-<a name="newlines"></a>newlines n <font color=Cyan>(</font>Pn f r <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> Pn f <font color=Cyan>(</font>r<font color=Cyan>+</font>n<font color=Cyan>)</font> <font color=Magenta>1</font> i--newpos <font color=Red>::</font> Int <font color=Red>-&gt;</font> Maybe String <font color=Red>-&gt;</font> Posn <font color=Red>-&gt;</font> Posn-<a name="newpos"></a>newpos r Nothing  <font color=Cyan>(</font>Pn f <font color=Green><u>_</u></font> c i<font color=Cyan>)</font> <font color=Red>=</font> Pn f r c i-newpos r <font color=Cyan>(</font>Just <font color=Cyan>(</font><font color=Magenta>'"'</font><font color=Red><b>:</b></font>f<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>Pn <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> c i<font color=Cyan>)</font> <font color=Red>=</font> Pn <font color=Cyan>(</font>init f<font color=Cyan>)</font> r c i-newpos r <font color=Cyan>(</font>Just f<font color=Cyan>)</font>       <font color=Cyan>(</font>Pn <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> c i<font color=Cyan>)</font> <font color=Red>=</font> Pn f r c i--<font color=Blue>-- | Projections</font>--lineno    <font color=Red>::</font> Posn <font color=Red>-&gt;</font> Int-filename  <font color=Red>::</font> Posn <font color=Red>-&gt;</font> String-directory <font color=Red>::</font> Posn <font color=Red>-&gt;</font> FilePath--<a name="lineno"></a>lineno    <font color=Cyan>(</font>Pn <font color=Green><u>_</u></font> r <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> r-<a name="filename"></a>filename  <font color=Cyan>(</font>Pn f <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> f-<a name="directory"></a>directory <font color=Cyan>(</font>Pn f <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> dirname f---<font color=Blue>-- | cpp-style printing</font>-cppline <font color=Red>::</font> Posn <font color=Red>-&gt;</font> String-<a name="cppline"></a>cppline <font color=Cyan>(</font>Pn f r <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"#line "</font><font color=Cyan>++</font>show r<font color=Cyan>++</font><font color=Magenta>" "</font><font color=Cyan>++</font>show f--                                                                                -<font color=Blue>-- | Strip non-directory suffix from file name (analogous to the shell</font>-<font color=Blue>--   command of the same name).</font>-dirname <font color=Red>::</font> String <font color=Red>-&gt;</font> String-<a name="dirname"></a>dirname  <font color=Red>=</font> reverse <font color=Cyan>.</font> safetail <font color=Cyan>.</font> dropWhile <font color=Cyan>(</font>not<font color=Cyan>.</font><font color=Cyan>(</font><font color=Cyan>`elem`</font><font color=Magenta>"\\/"</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>.</font> reverse-  <font color=Green><u>where</u></font> safetail <font color=Red>[</font><font color=Red>]</font> <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>-        safetail <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>x<font color=Cyan>)</font> <font color=Red>=</font> x-+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">+<html>+<pre><a name="(line1)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line2)"></a><font color=Blue>-- |</font>+<a name="(line3)"></a><font color=Blue>-- Module      :  Position</font>+<a name="(line4)"></a><font color=Blue>-- Copyright   :  2000-2004 Malcolm Wallace</font>+<a name="(line5)"></a><font color=Blue>-- Licence     :  LGPL</font>+<a name="(line6)"></a><font color=Blue>--</font>+<a name="(line7)"></a><font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>+<a name="(line8)"></a><font color=Blue>-- Stability   :  experimental</font>+<a name="(line9)"></a><font color=Blue>-- Portability :  All</font>+<a name="(line10)"></a><font color=Blue>--</font>+<a name="(line11)"></a><font color=Blue>-- Simple file position information, with recursive inclusion points.</font>+<a name="(line12)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line13)"></a>+<a name="(line14)"></a><font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Position+<a name="(line15)"></a>  <font color=Cyan>(</font> Posn<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="(line16)"></a>  <font color=Cyan>,</font> newfile+<a name="(line17)"></a>  <font color=Cyan>,</font> addcol<font color=Cyan>,</font> newline<font color=Cyan>,</font> tab<font color=Cyan>,</font> newlines<font color=Cyan>,</font> newpos+<a name="(line18)"></a>  <font color=Cyan>,</font> cppline+<a name="(line19)"></a>  <font color=Cyan>,</font> filename<font color=Cyan>,</font> lineno<font color=Cyan>,</font> directory+<a name="(line20)"></a>  <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="(line21)"></a>+<a name="(line22)"></a><a name="Posn"></a><font color=Blue>-- | Source positions contain a filename, line, column, and an</font>+<a name="(line23)"></a><a name="Posn"></a><font color=Blue>--   inclusion point, which is itself another source position,</font>+<a name="(line24)"></a><a name="Posn"></a><font color=Blue>--   recursively.</font>+<a name="(line25)"></a><a name="Posn"></a><font color=Green><u>data</u></font> Posn <font color=Red>=</font> Pn String <font color=Cyan>!</font>Int <font color=Cyan>!</font>Int <font color=Cyan>(</font>Maybe Posn<font color=Cyan>)</font>+<a name="(line26)"></a>        <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>)</font>+<a name="(line27)"></a>+<a name="(line28)"></a><font color=Green><u>instance</u></font> Show Posn <font color=Green><u>where</u></font>+<a name="(line29)"></a>      showsPrec <font color=Green><u>_</u></font> <font color=Cyan>(</font>Pn f l c i<font color=Cyan>)</font> <font color=Red>=</font> showString f <font color=Cyan>.</font>+<a name="(line30)"></a>                                 showString <font color=Magenta>"  at line "</font> <font color=Cyan>.</font> shows l <font color=Cyan>.</font>+<a name="(line31)"></a>                                 showString <font color=Magenta>" col "</font> <font color=Cyan>.</font> shows c <font color=Cyan>.</font>+<a name="(line32)"></a>                                 <font color=Cyan>(</font> <font color=Green><u>case</u></font> i <font color=Green><u>of</u></font>+<a name="(line33)"></a>                                    Nothing <font color=Red>-&gt;</font> id+<a name="(line34)"></a>                                    Just p  <font color=Red>-&gt;</font> showString <font color=Magenta>"\n    used by  "</font> <font color=Cyan>.</font>+<a name="(line35)"></a>                                               shows p <font color=Cyan>)</font>+<a name="(line36)"></a>+<a name="(line37)"></a><a name="newfile"></a><font color=Blue>-- | Constructor</font>+<a name="(line38)"></a>newfile <font color=Red>::</font> String <font color=Red>-&gt;</font> Posn+<a name="(line39)"></a>newfile name <font color=Red>=</font> Pn name <font color=Magenta>1</font> <font color=Magenta>1</font> Nothing+<a name="(line40)"></a>+<a name="(line41)"></a><a name="addcol"></a><font color=Blue>-- | Updates</font>+<a name="(line42)"></a>addcol <font color=Red>::</font> Int <font color=Red>-&gt;</font> Posn <font color=Red>-&gt;</font> Posn+<a name="(line43)"></a>addcol n <font color=Cyan>(</font>Pn f r c i<font color=Cyan>)</font> <font color=Red>=</font> Pn f r <font color=Cyan>(</font>c<font color=Cyan>+</font>n<font color=Cyan>)</font> i+<a name="(line44)"></a>+<a name="(line45)"></a><a name="newline"></a>newline<font color=Cyan>,</font> tab <font color=Red>::</font> Posn <font color=Red>-&gt;</font> Posn+<a name="(line46)"></a><font color=Blue>--newline (Pn f r _ i) = Pn f (r+1) 1 i</font>+<a name="(line47)"></a>newline <font color=Cyan>(</font>Pn f r <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>let</u></font> r' <font color=Red>=</font> r<font color=Cyan>+</font><font color=Magenta>1</font> <font color=Green><u>in</u></font> r' <font color=Cyan>`seq`</font> Pn f r' <font color=Magenta>1</font> i+<a name="(line48)"></a><a name="tab"></a>tab     <font color=Cyan>(</font>Pn f r c i<font color=Cyan>)</font> <font color=Red>=</font> Pn f r <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>(</font>c<font color=Cyan>`div`</font><font color=Magenta>8</font><font color=Cyan>)</font><font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font><font color=Cyan>*</font><font color=Magenta>8</font><font color=Cyan>)</font> i+<a name="(line49)"></a>+<a name="(line50)"></a><a name="newlines"></a>newlines <font color=Red>::</font> Int <font color=Red>-&gt;</font> Posn <font color=Red>-&gt;</font> Posn+<a name="(line51)"></a>newlines n <font color=Cyan>(</font>Pn f r <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> Pn f <font color=Cyan>(</font>r<font color=Cyan>+</font>n<font color=Cyan>)</font> <font color=Magenta>1</font> i+<a name="(line52)"></a>+<a name="(line53)"></a><a name="newpos"></a>newpos <font color=Red>::</font> Int <font color=Red>-&gt;</font> Maybe String <font color=Red>-&gt;</font> Posn <font color=Red>-&gt;</font> Posn+<a name="(line54)"></a>newpos r Nothing  <font color=Cyan>(</font>Pn f <font color=Green><u>_</u></font> c i<font color=Cyan>)</font> <font color=Red>=</font> Pn f r c i+<a name="(line55)"></a>newpos r <font color=Cyan>(</font>Just <font color=Cyan>(</font><font color=Magenta>'"'</font><font color=Red><b>:</b></font>f<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>(</font>Pn <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> c i<font color=Cyan>)</font> <font color=Red>=</font> Pn <font color=Cyan>(</font>init f<font color=Cyan>)</font> r c i+<a name="(line56)"></a>newpos r <font color=Cyan>(</font>Just f<font color=Cyan>)</font>       <font color=Cyan>(</font>Pn <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> c i<font color=Cyan>)</font> <font color=Red>=</font> Pn f r c i+<a name="(line57)"></a>+<a name="(line58)"></a><font color=Blue>-- | Projections</font>+<a name="(line59)"></a>+<a name="(line60)"></a><a name="lineno"></a>lineno    <font color=Red>::</font> Posn <font color=Red>-&gt;</font> Int+<a name="(line61)"></a><a name="filename"></a>filename  <font color=Red>::</font> Posn <font color=Red>-&gt;</font> String+<a name="(line62)"></a><a name="directory"></a>directory <font color=Red>::</font> Posn <font color=Red>-&gt;</font> FilePath+<a name="(line63)"></a>+<a name="(line64)"></a>lineno    <font color=Cyan>(</font>Pn <font color=Green><u>_</u></font> r <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> r+<a name="(line65)"></a>filename  <font color=Cyan>(</font>Pn f <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> f+<a name="(line66)"></a>directory <font color=Cyan>(</font>Pn f <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> dirname f+<a name="(line67)"></a>+<a name="(line68)"></a>+<a name="(line69)"></a><a name="cppline"></a><font color=Blue>-- | cpp-style printing</font>+<a name="(line70)"></a>cppline <font color=Red>::</font> Posn <font color=Red>-&gt;</font> String+<a name="(line71)"></a>cppline <font color=Cyan>(</font>Pn f r <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"#line "</font><font color=Cyan>++</font>show r<font color=Cyan>++</font><font color=Magenta>" "</font><font color=Cyan>++</font>show f+<a name="(line72)"></a>+<a name="(line73)"></a>                                                                                +<a name="(line74)"></a><a name="dirname"></a><font color=Blue>-- | Strip non-directory suffix from file name (analogous to the shell</font>+<a name="(line75)"></a><font color=Blue>--   command of the same name).</font>+<a name="(line76)"></a>dirname <font color=Red>::</font> String <font color=Red>-&gt;</font> String+<a name="(line77)"></a>dirname  <font color=Red>=</font> reverse <font color=Cyan>.</font> safetail <font color=Cyan>.</font> dropWhile <font color=Cyan>(</font>not<font color=Cyan>.</font><font color=Cyan>(</font><font color=Cyan>`elem`</font><font color=Magenta>"\\/"</font><font color=Cyan>)</font><font color=Cyan>)</font> <font color=Cyan>.</font> reverse+<a name="(line78)"></a>  <font color=Green><u>where</u></font> safetail [] <font color=Red>=</font> []+<a name="(line79)"></a>        safetail <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>x<font color=Cyan>)</font> <font color=Red>=</font> x+<a name="(line80)"></a> </pre>+</html>
docs/cpphs/Language/Preprocessor/Cpphs/ReadFirst.html view
@@ -1,54 +1,57 @@-<pre><font color=Blue>-----------------------------------------------------------------------------</font>-<font color=Blue>-- |</font>-<font color=Blue>-- Module      :  ReadFirst</font>-<font color=Blue>-- Copyright   :  2004 Malcolm Wallace</font>-<font color=Blue>-- Licence     :  LGPL</font>-<font color=Blue>-- </font>-<font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>-<font color=Blue>-- Stability   :  experimental</font>-<font color=Blue>-- Portability :  All</font>-<font color=Blue>--</font>-<font color=Blue>-- Read the first file that matches in a list of search paths.</font>-<font color=Blue>-----------------------------------------------------------------------------</font>--<font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>ReadFirst-  <font color=Cyan>(</font> readFirst-  <font color=Cyan>)</font> <font color=Green><u>where</u></font>--<font color=Green><u>import</u></font> IO        <font color=Cyan>(</font>hPutStrLn<font color=Cyan>,</font> stderr<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Directory <font color=Cyan>(</font>doesFileExist<font color=Cyan>)</font>-<font color=Green><u>import</u></font> List      <font color=Cyan>(</font>intersperse<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Monad     <font color=Cyan>(</font>when<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Position  <font color=Cyan>(</font>Posn<font color=Cyan>,</font>directory<font color=Cyan>)</font>--<font color=Blue>-- | Attempt to read the given file from any location within the search path.</font>-<font color=Blue>--   The first location found is returned, together with the file content.</font>-<font color=Blue>--   (The directory of the calling file is always searched first, then</font>-<font color=Blue>--    the current directory, finally any specified search path.)</font>-readFirst <font color=Red>::</font> String		<font color=Blue>-- ^ filename</font>-	<font color=Red>-&gt;</font> Posn			<font color=Blue>-- ^ inclusion point</font>-	<font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font>		<font color=Blue>-- ^ search path</font>-	<font color=Red>-&gt;</font> Bool			<font color=Blue>-- ^ report warnings?</font>-	<font color=Red>-&gt;</font> IO <font color=Cyan>(</font> FilePath-              <font color=Cyan>,</font> String-              <font color=Cyan>)</font>			<font color=Blue>-- ^ discovered filepath, and file contents</font>--<a name="readFirst"></a>readFirst name demand path warn <font color=Red>=</font>-    try <font color=Cyan>(</font>cons dd <font color=Cyan>(</font><font color=Magenta>"."</font><font color=Red><b>:</b></font>path<font color=Cyan>)</font><font color=Cyan>)</font>-  <font color=Green><u>where</u></font>-    dd <font color=Red>=</font> directory demand-    cons x xs <font color=Red>=</font> <font color=Green><u>if</u></font> null x <font color=Green><u>then</u></font> xs <font color=Green><u>else</u></font> x<font color=Red><b>:</b></font>xs-    try <font color=Red>[</font><font color=Red>]</font> <font color=Red>=</font> <font color=Green><u>do</u></font>-        when warn <font color=Cyan>$</font>-          hPutStrLn stderr <font color=Cyan>(</font><font color=Magenta>"Warning: Can't find file \""</font><font color=Cyan>++</font>name-                           <font color=Cyan>++</font><font color=Magenta>"\" in directories\n\t"</font>-                           <font color=Cyan>++</font>concat <font color=Cyan>(</font>intersperse <font color=Magenta>"\n\t"</font> <font color=Cyan>(</font>cons dd <font color=Cyan>(</font><font color=Magenta>"."</font><font color=Red><b>:</b></font>path<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-                           <font color=Cyan>++</font><font color=Magenta>"\n  Asked for by: "</font><font color=Cyan>++</font>show demand<font color=Cyan>)</font>-        return <font color=Cyan>(</font><font color=Magenta>"missing file: "</font><font color=Cyan>++</font>name<font color=Cyan>,</font><font color=Magenta>""</font><font color=Cyan>)</font>-    try <font color=Cyan>(</font>p<font color=Red><b>:</b></font>ps<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>do</u></font>-        <font color=Green><u>let</u></font> file <font color=Red>=</font> p<font color=Cyan>++</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>name-        ok <font color=Red>&lt;-</font> doesFileExist file-        <font color=Green><u>if</u></font> not ok <font color=Green><u>then</u></font> try ps-          <font color=Green><u>else</u></font> <font color=Green><u>do</u></font> content <font color=Red>&lt;-</font> readFile file-                  return <font color=Cyan>(</font>file<font color=Cyan>,</font>content<font color=Cyan>)</font>+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">+<html>+<pre><a name="(line1)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line2)"></a><font color=Blue>-- |</font>+<a name="(line3)"></a><font color=Blue>-- Module      :  ReadFirst</font>+<a name="(line4)"></a><font color=Blue>-- Copyright   :  2004 Malcolm Wallace</font>+<a name="(line5)"></a><font color=Blue>-- Licence     :  LGPL</font>+<a name="(line6)"></a><font color=Blue>-- </font>+<a name="(line7)"></a><font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>+<a name="(line8)"></a><font color=Blue>-- Stability   :  experimental</font>+<a name="(line9)"></a><font color=Blue>-- Portability :  All</font>+<a name="(line10)"></a><font color=Blue>--</font>+<a name="(line11)"></a><font color=Blue>-- Read the first file that matches in a list of search paths.</font>+<a name="(line12)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line13)"></a>+<a name="(line14)"></a><font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>ReadFirst+<a name="(line15)"></a>  <font color=Cyan>(</font> readFirst+<a name="(line16)"></a>  <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="(line17)"></a>+<a name="(line18)"></a><font color=Green><u>import</u></font> IO        <font color=Cyan>(</font>hPutStrLn<font color=Cyan>,</font> stderr<font color=Cyan>)</font>+<a name="(line19)"></a><font color=Green><u>import</u></font> Directory <font color=Cyan>(</font>doesFileExist<font color=Cyan>)</font>+<a name="(line20)"></a><font color=Green><u>import</u></font> List      <font color=Cyan>(</font>intersperse<font color=Cyan>)</font>+<a name="(line21)"></a><font color=Green><u>import</u></font> Monad     <font color=Cyan>(</font>when<font color=Cyan>)</font>+<a name="(line22)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Position  <font color=Cyan>(</font>Posn<font color=Cyan>,</font>directory<font color=Cyan>)</font>+<a name="(line23)"></a>+<a name="(line24)"></a><a name="readFirst"></a><font color=Blue>-- | Attempt to read the given file from any location within the search path.</font>+<a name="(line25)"></a><font color=Blue>--   The first location found is returned, together with the file content.</font>+<a name="(line26)"></a><font color=Blue>--   (The directory of the calling file is always searched first, then</font>+<a name="(line27)"></a><font color=Blue>--    the current directory, finally any specified search path.)</font>+<a name="(line28)"></a>readFirst <font color=Red>::</font> String		<font color=Blue>-- ^ filename</font>+<a name="(line29)"></a>	<font color=Red>-&gt;</font> Posn			<font color=Blue>-- ^ inclusion point</font>+<a name="(line30)"></a>	<font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font>		<font color=Blue>-- ^ search path</font>+<a name="(line31)"></a>	<font color=Red>-&gt;</font> Bool			<font color=Blue>-- ^ report warnings?</font>+<a name="(line32)"></a>	<font color=Red>-&gt;</font> IO <font color=Cyan>(</font> FilePath+<a name="(line33)"></a>              <font color=Cyan>,</font> String+<a name="(line34)"></a>              <font color=Cyan>)</font>			<font color=Blue>-- ^ discovered filepath, and file contents</font>+<a name="(line35)"></a>+<a name="(line36)"></a>readFirst name demand path warn <font color=Red>=</font>+<a name="(line37)"></a>    try <font color=Cyan>(</font>cons dd <font color=Cyan>(</font><font color=Magenta>"."</font><font color=Red><b>:</b></font>path<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line38)"></a>  <font color=Green><u>where</u></font>+<a name="(line39)"></a>    dd <font color=Red>=</font> directory demand+<a name="(line40)"></a>    cons x xs <font color=Red>=</font> <font color=Green><u>if</u></font> null x <font color=Green><u>then</u></font> xs <font color=Green><u>else</u></font> x<font color=Red><b>:</b></font>xs+<a name="(line41)"></a>    try [] <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="(line42)"></a>        when warn <font color=Cyan>$</font>+<a name="(line43)"></a>          hPutStrLn stderr <font color=Cyan>(</font><font color=Magenta>"Warning: Can't find file \""</font><font color=Cyan>++</font>name+<a name="(line44)"></a>                           <font color=Cyan>++</font><font color=Magenta>"\" in directories\n\t"</font>+<a name="(line45)"></a>                           <font color=Cyan>++</font>concat <font color=Cyan>(</font>intersperse <font color=Magenta>"\n\t"</font> <font color=Cyan>(</font>cons dd <font color=Cyan>(</font><font color=Magenta>"."</font><font color=Red><b>:</b></font>path<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line46)"></a>                           <font color=Cyan>++</font><font color=Magenta>"\n  Asked for by: "</font><font color=Cyan>++</font>show demand<font color=Cyan>)</font>+<a name="(line47)"></a>        return <font color=Cyan>(</font><font color=Magenta>"missing file: "</font><font color=Cyan>++</font>name<font color=Cyan>,</font><font color=Magenta>""</font><font color=Cyan>)</font>+<a name="(line48)"></a>    try <font color=Cyan>(</font>p<font color=Red><b>:</b></font>ps<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="(line49)"></a>        <font color=Green><u>let</u></font> file <font color=Red>=</font> p<font color=Cyan>++</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>name+<a name="(line50)"></a>        ok <font color=Red>&lt;-</font> doesFileExist file+<a name="(line51)"></a>        <font color=Green><u>if</u></font> not ok <font color=Green><u>then</u></font> try ps+<a name="(line52)"></a>          <font color=Green><u>else</u></font> <font color=Green><u>do</u></font> content <font color=Red>&lt;-</font> readFile file+<a name="(line53)"></a>                  return <font color=Cyan>(</font>file<font color=Cyan>,</font>content<font color=Cyan>)</font> </pre>+</html>
docs/cpphs/Language/Preprocessor/Cpphs/RunCpphs.html view
@@ -1,26 +1,32 @@-<pre><font color=Blue>{---- The main program for cpphs, a simple C pre-processor written in Haskell.---- Copyright (c) 2004 Malcolm Wallace--- This file is GPL, although the libraries it uses are either standard--- Haskell'98 or distributed under the LGPL.--}</font>-<font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>RunCpphs <font color=Cyan>(</font> runCpphs <font color=Cyan>)</font> <font color=Green><u>where</u></font>--<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>CppIfdef <font color=Cyan>(</font>cppIfdef<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>MacroPass<font color=Cyan>(</font>macroPass<font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Options  <font color=Cyan>(</font>CpphsOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> BoolOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>)</font>-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Unlit <font color=Green><u>as</u></font> Unlit <font color=Cyan>(</font>unlit<font color=Cyan>)</font>---runCpphs <font color=Red>::</font> CpphsOptions <font color=Red>-&gt;</font> FilePath <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> String-<a name="runCpphs"></a>runCpphs options filename input <font color=Red>=</font>-  <font color=Green><u>let</u></font> bools <font color=Red>=</font> boolopts options--      pass1 <font color=Red>=</font> cppIfdef filename <font color=Cyan>(</font>defines options<font color=Cyan>)</font> <font color=Cyan>(</font>includes options<font color=Cyan>)</font> bools input-      pass2 <font color=Red>=</font> macroPass <font color=Cyan>(</font>defines options<font color=Cyan>)</font> bools pass1-      result<font color=Red>=</font> <font color=Green><u>if</u></font> not <font color=Cyan>(</font>macros bools<font color=Cyan>)</font> <font color=Green><u>then</u></font> unlines <font color=Cyan>(</font>map snd pass1<font color=Cyan>)</font> <font color=Green><u>else</u></font> pass2-      pass3 <font color=Red>=</font> <font color=Green><u>if</u></font> literate bools <font color=Green><u>then</u></font> Unlit<font color=Cyan>.</font>unlit filename <font color=Green><u>else</u></font> id--  <font color=Green><u>in</u></font> pass3 result+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">+<html>+<pre><a name="(line1)"></a><font color=Blue>{-+<a name="(line2)"></a>-- The main program for cpphs, a simple C pre-processor written in Haskell.+<a name="(line3)"></a>+<a name="(line4)"></a>-- Copyright (c) 2004 Malcolm Wallace+<a name="(line5)"></a>-- This file is GPL, although the libraries it uses are either standard+<a name="(line6)"></a>-- Haskell'98 or distributed under the LGPL.+<a name="(line7)"></a>-}</font>+<a name="(line8)"></a><font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>RunCpphs <font color=Cyan>(</font> runCpphs <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="(line9)"></a>+<a name="(line10)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>CppIfdef <font color=Cyan>(</font>cppIfdef<font color=Cyan>)</font>+<a name="(line11)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>MacroPass<font color=Cyan>(</font>macroPass<font color=Cyan>)</font>+<a name="(line12)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Options  <font color=Cyan>(</font>CpphsOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> BoolOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line13)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Unlit <font color=Green><u>as</u></font> Unlit <font color=Cyan>(</font>unlit<font color=Cyan>)</font>+<a name="(line14)"></a>+<a name="(line15)"></a>+<a name="(line16)"></a><a name="runCpphs"></a>runCpphs <font color=Red>::</font> CpphsOptions <font color=Red>-&gt;</font> FilePath <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> String+<a name="(line17)"></a>runCpphs options filename input <font color=Red>=</font>+<a name="(line18)"></a>  <font color=Green><u>let</u></font> bools <font color=Red>=</font> boolopts options+<a name="(line19)"></a>      preInc <font color=Red>=</font> concatMap <font color=Cyan>(</font><font color=Red>\</font>f<font color=Red>-&gt;</font><font color=Magenta>"#include \""</font><font color=Cyan>++</font>f<font color=Cyan>++</font><font color=Magenta>"\"\n"</font><font color=Cyan>)</font> <font color=Cyan>(</font>preInclude options<font color=Cyan>)</font>+<a name="(line20)"></a><font color=Blue>--             ++ "#line 1\n"</font>+<a name="(line21)"></a>+<a name="(line22)"></a>      pass1 <font color=Red>=</font> cppIfdef filename <font color=Cyan>(</font>defines options<font color=Cyan>)</font> <font color=Cyan>(</font>includes options<font color=Cyan>)</font> bools+<a name="(line23)"></a>                       <font color=Cyan>(</font>preInc<font color=Cyan>++</font>input<font color=Cyan>)</font>+<a name="(line24)"></a>      pass2 <font color=Red>=</font> macroPass <font color=Cyan>(</font>defines options<font color=Cyan>)</font> bools pass1+<a name="(line25)"></a>      result<font color=Red>=</font> <font color=Green><u>if</u></font> not <font color=Cyan>(</font>macros bools<font color=Cyan>)</font> <font color=Green><u>then</u></font> unlines <font color=Cyan>(</font>map snd pass1<font color=Cyan>)</font> <font color=Green><u>else</u></font> pass2+<a name="(line26)"></a>      pass3 <font color=Red>=</font> <font color=Green><u>if</u></font> literate bools <font color=Green><u>then</u></font> Unlit<font color=Cyan>.</font>unlit filename <font color=Green><u>else</u></font> id+<a name="(line27)"></a>+<a name="(line28)"></a>  <font color=Green><u>in</u></font> pass3 result </pre>+</html>
docs/cpphs/Language/Preprocessor/Cpphs/SymTab.html view
@@ -1,87 +1,90 @@-<pre><font color=Blue>-----------------------------------------------------------------------------</font>-<font color=Blue>-- |</font>-<font color=Blue>-- Module      :  SymTab</font>-<font color=Blue>-- Copyright   :  2000-2004 Malcolm Wallace</font>-<font color=Blue>-- Licence     :  LGPL</font>-<font color=Blue>-- </font>-<font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>-<font color=Blue>-- Stability   :  Stable</font>-<font color=Blue>-- Portability :  All</font>-<font color=Blue>--</font>-<font color=Blue>-- Symbol Table, based on index trees using a hash on the key.</font>-<font color=Blue>--   Keys are always Strings.  Stored values can be any type.</font>-<font color=Blue>-----------------------------------------------------------------------------</font>--<font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>SymTab-  <font color=Cyan>(</font> SymTab-  <font color=Cyan>,</font> emptyST-  <font color=Cyan>,</font> insertST-  <font color=Cyan>,</font> deleteST-  <font color=Cyan>,</font> lookupST-  <font color=Cyan>,</font> definedST-  <font color=Cyan>,</font> IndTree-  <font color=Cyan>)</font> <font color=Green><u>where</u></font>--<font color=Blue>-- | Symbol Table.  Stored values are polymorphic, but the keys are</font>-<font color=Blue>--   always strings.</font>-<a name="SymTab"></a><font color=Green><u>type</u></font> SymTab v <font color=Red>=</font> IndTree <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>v<font color=Cyan>)</font><font color=Red>]</font>--emptyST   <font color=Red>::</font> SymTab v-insertST  <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Cyan>,</font>v<font color=Cyan>)</font> <font color=Red>-&gt;</font> SymTab v <font color=Red>-&gt;</font> SymTab v-deleteST  <font color=Red>::</font> String <font color=Red>-&gt;</font> SymTab v <font color=Red>-&gt;</font> SymTab v-lookupST  <font color=Red>::</font> String <font color=Red>-&gt;</font> SymTab v <font color=Red>-&gt;</font> Maybe v-definedST <font color=Red>::</font> String <font color=Red>-&gt;</font> SymTab v <font color=Red>-&gt;</font> Bool--<a name="emptyST"></a>emptyST           <font color=Red>=</font> itgen maxHash <font color=Red>[</font><font color=Red>]</font>-<a name="insertST"></a>insertST <font color=Cyan>(</font>s<font color=Cyan>,</font>v<font color=Cyan>)</font> ss <font color=Red>=</font> itiap <font color=Cyan>(</font>hash s<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Cyan>(</font>s<font color=Cyan>,</font>v<font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Cyan>)</font>    ss id-<a name="deleteST"></a>deleteST  s    ss <font color=Red>=</font> itiap <font color=Cyan>(</font>hash s<font color=Cyan>)</font> <font color=Cyan>(</font>filter <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>/=</font>s<font color=Cyan>)</font><font color=Cyan>.</font>fst<font color=Cyan>)</font><font color=Cyan>)</font> ss id-<a name="lookupST"></a>lookupST  s    ss <font color=Red>=</font> <font color=Green><u>let</u></font> vs <font color=Red>=</font> filter <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>==</font>s<font color=Cyan>)</font><font color=Cyan>.</font>fst<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Cyan>(</font>itind <font color=Cyan>(</font>hash s<font color=Cyan>)</font><font color=Cyan>)</font> ss<font color=Cyan>)</font>-                    <font color=Green><u>in</u></font> <font color=Green><u>if</u></font> null vs <font color=Green><u>then</u></font> Nothing-                       <font color=Green><u>else</u></font> <font color=Cyan>(</font>Just <font color=Cyan>.</font> snd <font color=Cyan>.</font> head<font color=Cyan>)</font> vs-<a name="definedST"></a>definedST s    ss <font color=Red>=</font> <font color=Green><u>let</u></font> vs <font color=Red>=</font> filter <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>==</font>s<font color=Cyan>)</font><font color=Cyan>.</font>fst<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Cyan>(</font>itind <font color=Cyan>(</font>hash s<font color=Cyan>)</font><font color=Cyan>)</font> ss<font color=Cyan>)</font>-                    <font color=Green><u>in</u></font> <font color=Cyan>(</font>not <font color=Cyan>.</font> null<font color=Cyan>)</font> vs---<font color=Blue>----</font>-<font color=Blue>-- | Index Trees (storing indexes at nodes).</font>--<a name="IndTree"></a><font color=Green><u>data</u></font> IndTree t <font color=Red>=</font> Leaf t <font color=Red>|</font> Fork Int <font color=Cyan>(</font>IndTree t<font color=Cyan>)</font> <font color=Cyan>(</font>IndTree t<font color=Cyan>)</font>-     <font color=Green><u>deriving</u></font> Show--itgen <font color=Red>::</font> Int <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> IndTree a-<a name="itgen"></a>itgen <font color=Magenta>1</font> x <font color=Red>=</font> Leaf x-itgen n x <font color=Red>=</font>-  <font color=Green><u>let</u></font> n' <font color=Red>=</font> n <font color=Cyan>`div`</font> <font color=Magenta>2</font>-  <font color=Green><u>in</u></font> Fork n' <font color=Cyan>(</font>itgen n' x<font color=Cyan>)</font> <font color=Cyan>(</font>itgen <font color=Cyan>(</font>n<font color=Blue>-</font>n'<font color=Cyan>)</font> x<font color=Cyan>)</font>--itiap <font color=Red>::</font> <font color=Blue>--Eval a =&gt;</font>-         Int <font color=Red>-&gt;</font> <font color=Cyan>(</font>a<font color=Red>-&gt;</font>a<font color=Cyan>)</font> <font color=Red>-&gt;</font> IndTree a <font color=Red>-&gt;</font> <font color=Cyan>(</font>IndTree a <font color=Red>-&gt;</font> b<font color=Cyan>)</font> <font color=Red>-&gt;</font> b-<a name="itiap"></a>itiap <font color=Green><u>_</u></font> f <font color=Cyan>(</font>Leaf x<font color=Cyan>)</font>       k <font color=Red>=</font> <font color=Green><u>let</u></font> fx <font color=Red>=</font> f x <font color=Green><u>in</u></font> <font color=Blue>{-seq fx-}</font> <font color=Cyan>(</font>k <font color=Cyan>(</font>Leaf fx<font color=Cyan>)</font><font color=Cyan>)</font>-itiap i f <font color=Cyan>(</font>Fork n lt rt<font color=Cyan>)</font> k <font color=Red>=</font>-  <font color=Green><u>if</u></font> i<font color=Cyan>&lt;</font>n <font color=Green><u>then</u></font>-       itiap i f lt <font color=Cyan>$</font> <font color=Red>\</font>lt' <font color=Red>-&gt;</font> k <font color=Cyan>(</font>Fork n lt' rt<font color=Cyan>)</font>-  <font color=Green><u>else</u></font> itiap <font color=Cyan>(</font>i<font color=Blue>-</font>n<font color=Cyan>)</font> f rt <font color=Cyan>$</font> <font color=Red>\</font>rt' <font color=Red>-&gt;</font> k <font color=Cyan>(</font>Fork n lt rt'<font color=Cyan>)</font>--itind <font color=Red>::</font> Int <font color=Red>-&gt;</font> IndTree a <font color=Red>-&gt;</font> a  -<a name="itind"></a>itind <font color=Green><u>_</u></font> <font color=Cyan>(</font>Leaf x<font color=Cyan>)</font> <font color=Red>=</font> x-itind i <font color=Cyan>(</font>Fork n lt rt<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>if</u></font> i<font color=Cyan>&lt;</font>n <font color=Green><u>then</u></font> itind i lt <font color=Green><u>else</u></font> itind <font color=Cyan>(</font>i<font color=Blue>-</font>n<font color=Cyan>)</font> rt---<font color=Blue>----</font>-<font color=Blue>-- Hash values</font>--maxHash <font color=Red>::</font> Int <font color=Blue>-- should be prime</font>-<a name="maxHash"></a>maxHash <font color=Red>=</font> <font color=Magenta>101</font>--<a name="Hashable"></a><font color=Green><u>class</u></font> Hashable a <font color=Green><u>where</u></font>-    hashWithMax <font color=Red>::</font> Int <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> Int-    hash        <font color=Red>::</font> a <font color=Red>-&gt;</font> Int-    hash <font color=Red>=</font> hashWithMax maxHash--<font color=Green><u>instance</u></font> Enum a <font color=Red>=&gt;</font> Hashable <font color=Red>[</font>a<font color=Red>]</font> <font color=Green><u>where</u></font>-    hashWithMax m <font color=Red>=</font> h <font color=Magenta>0</font>-        <font color=Green><u>where</u></font> h a <font color=Red>[</font><font color=Red>]</font>     <font color=Red>=</font> a-              h a <font color=Cyan>(</font>c<font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>=</font> h <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>17</font><font color=Cyan>*</font><font color=Cyan>(</font>fromEnum c<font color=Cyan>)</font><font color=Cyan>+</font><font color=Magenta>19</font><font color=Cyan>*</font>a<font color=Cyan>)</font><font color=Cyan>`rem`</font>m<font color=Cyan>)</font> cs--<font color=Blue>----</font>+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">+<html>+<pre><a name="(line1)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line2)"></a><font color=Blue>-- |</font>+<a name="(line3)"></a><font color=Blue>-- Module      :  SymTab</font>+<a name="(line4)"></a><font color=Blue>-- Copyright   :  2000-2004 Malcolm Wallace</font>+<a name="(line5)"></a><font color=Blue>-- Licence     :  LGPL</font>+<a name="(line6)"></a><font color=Blue>-- </font>+<a name="(line7)"></a><font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>+<a name="(line8)"></a><font color=Blue>-- Stability   :  Stable</font>+<a name="(line9)"></a><font color=Blue>-- Portability :  All</font>+<a name="(line10)"></a><font color=Blue>--</font>+<a name="(line11)"></a><font color=Blue>-- Symbol Table, based on index trees using a hash on the key.</font>+<a name="(line12)"></a><font color=Blue>--   Keys are always Strings.  Stored values can be any type.</font>+<a name="(line13)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line14)"></a>+<a name="(line15)"></a><font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>SymTab+<a name="(line16)"></a>  <font color=Cyan>(</font> SymTab+<a name="(line17)"></a>  <font color=Cyan>,</font> emptyST+<a name="(line18)"></a>  <font color=Cyan>,</font> insertST+<a name="(line19)"></a>  <font color=Cyan>,</font> deleteST+<a name="(line20)"></a>  <font color=Cyan>,</font> lookupST+<a name="(line21)"></a>  <font color=Cyan>,</font> definedST+<a name="(line22)"></a>  <font color=Cyan>,</font> IndTree+<a name="(line23)"></a>  <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="(line24)"></a>+<a name="(line25)"></a><a name="SymTab"></a><font color=Blue>-- | Symbol Table.  Stored values are polymorphic, but the keys are</font>+<a name="(line26)"></a><a name="SymTab"></a><font color=Blue>--   always strings.</font>+<a name="(line27)"></a><a name="SymTab"></a><font color=Green><u>type</u></font> SymTab v <font color=Red>=</font> IndTree <font color=Red>[</font><font color=Cyan>(</font>String<font color=Cyan>,</font>v<font color=Cyan>)</font><font color=Red>]</font>+<a name="(line28)"></a>+<a name="(line29)"></a><a name="emptyST"></a>emptyST   <font color=Red>::</font> SymTab v+<a name="(line30)"></a><a name="insertST"></a>insertST  <font color=Red>::</font> <font color=Cyan>(</font>String<font color=Cyan>,</font>v<font color=Cyan>)</font> <font color=Red>-&gt;</font> SymTab v <font color=Red>-&gt;</font> SymTab v+<a name="(line31)"></a><a name="deleteST"></a>deleteST  <font color=Red>::</font> String <font color=Red>-&gt;</font> SymTab v <font color=Red>-&gt;</font> SymTab v+<a name="(line32)"></a><a name="lookupST"></a>lookupST  <font color=Red>::</font> String <font color=Red>-&gt;</font> SymTab v <font color=Red>-&gt;</font> Maybe v+<a name="(line33)"></a><a name="definedST"></a>definedST <font color=Red>::</font> String <font color=Red>-&gt;</font> SymTab v <font color=Red>-&gt;</font> Bool+<a name="(line34)"></a>+<a name="(line35)"></a>emptyST           <font color=Red>=</font> itgen maxHash []+<a name="(line36)"></a>insertST <font color=Cyan>(</font>s<font color=Cyan>,</font>v<font color=Cyan>)</font> ss <font color=Red>=</font> itiap <font color=Cyan>(</font>hash s<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Cyan>(</font>s<font color=Cyan>,</font>v<font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Cyan>)</font>    ss id+<a name="(line37)"></a>deleteST  s    ss <font color=Red>=</font> itiap <font color=Cyan>(</font>hash s<font color=Cyan>)</font> <font color=Cyan>(</font>filter <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>/=</font>s<font color=Cyan>)</font><font color=Cyan>.</font>fst<font color=Cyan>)</font><font color=Cyan>)</font> ss id+<a name="(line38)"></a>lookupST  s    ss <font color=Red>=</font> <font color=Green><u>let</u></font> vs <font color=Red>=</font> filter <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>==</font>s<font color=Cyan>)</font><font color=Cyan>.</font>fst<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Cyan>(</font>itind <font color=Cyan>(</font>hash s<font color=Cyan>)</font><font color=Cyan>)</font> ss<font color=Cyan>)</font>+<a name="(line39)"></a>                    <font color=Green><u>in</u></font> <font color=Green><u>if</u></font> null vs <font color=Green><u>then</u></font> Nothing+<a name="(line40)"></a>                       <font color=Green><u>else</u></font> <font color=Cyan>(</font>Just <font color=Cyan>.</font> snd <font color=Cyan>.</font> head<font color=Cyan>)</font> vs+<a name="(line41)"></a>definedST s    ss <font color=Red>=</font> <font color=Green><u>let</u></font> vs <font color=Red>=</font> filter <font color=Cyan>(</font><font color=Cyan>(</font><font color=Cyan>==</font>s<font color=Cyan>)</font><font color=Cyan>.</font>fst<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Cyan>(</font>itind <font color=Cyan>(</font>hash s<font color=Cyan>)</font><font color=Cyan>)</font> ss<font color=Cyan>)</font>+<a name="(line42)"></a>                    <font color=Green><u>in</u></font> <font color=Cyan>(</font>not <font color=Cyan>.</font> null<font color=Cyan>)</font> vs+<a name="(line43)"></a>+<a name="(line44)"></a>+<a name="(line45)"></a><font color=Blue>----</font>+<a name="(line46)"></a><font color=Blue>-- | Index Trees (storing indexes at nodes).</font>+<a name="(line47)"></a>+<a name="(line48)"></a><a name="IndTree"></a><font color=Green><u>data</u></font> IndTree t <font color=Red>=</font> Leaf t <font color=Red>|</font> Fork Int <font color=Cyan>(</font>IndTree t<font color=Cyan>)</font> <font color=Cyan>(</font>IndTree t<font color=Cyan>)</font>+<a name="(line49)"></a>     <font color=Green><u>deriving</u></font> Show+<a name="(line50)"></a>+<a name="(line51)"></a><a name="itgen"></a>itgen <font color=Red>::</font> Int <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> IndTree a+<a name="(line52)"></a>itgen <font color=Magenta>1</font> x <font color=Red>=</font> Leaf x+<a name="(line53)"></a>itgen n x <font color=Red>=</font>+<a name="(line54)"></a>  <font color=Green><u>let</u></font> n' <font color=Red>=</font> n <font color=Cyan>`div`</font> <font color=Magenta>2</font>+<a name="(line55)"></a>  <font color=Green><u>in</u></font> Fork n' <font color=Cyan>(</font>itgen n' x<font color=Cyan>)</font> <font color=Cyan>(</font>itgen <font color=Cyan>(</font>n<font color=Blue>-</font>n'<font color=Cyan>)</font> x<font color=Cyan>)</font>+<a name="(line56)"></a>+<a name="(line57)"></a><a name="itiap"></a>itiap <font color=Red>::</font> <font color=Blue>--Eval a =&gt;</font>+<a name="(line58)"></a>         Int <font color=Red>-&gt;</font> <font color=Cyan>(</font>a<font color=Red>-&gt;</font>a<font color=Cyan>)</font> <font color=Red>-&gt;</font> IndTree a <font color=Red>-&gt;</font> <font color=Cyan>(</font>IndTree a <font color=Red>-&gt;</font> b<font color=Cyan>)</font> <font color=Red>-&gt;</font> b+<a name="(line59)"></a>itiap <font color=Green><u>_</u></font> f <font color=Cyan>(</font>Leaf x<font color=Cyan>)</font>       k <font color=Red>=</font> <font color=Green><u>let</u></font> fx <font color=Red>=</font> f x <font color=Green><u>in</u></font> <font color=Blue>{-seq fx-}</font> <font color=Cyan>(</font>k <font color=Cyan>(</font>Leaf fx<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line60)"></a>itiap i f <font color=Cyan>(</font>Fork n lt rt<font color=Cyan>)</font> k <font color=Red>=</font>+<a name="(line61)"></a>  <font color=Green><u>if</u></font> i<font color=Cyan>&lt;</font>n <font color=Green><u>then</u></font>+<a name="(line62)"></a>       itiap i f lt <font color=Cyan>$</font> <font color=Red>\</font>lt' <font color=Red>-&gt;</font> k <font color=Cyan>(</font>Fork n lt' rt<font color=Cyan>)</font>+<a name="(line63)"></a>  <font color=Green><u>else</u></font> itiap <font color=Cyan>(</font>i<font color=Blue>-</font>n<font color=Cyan>)</font> f rt <font color=Cyan>$</font> <font color=Red>\</font>rt' <font color=Red>-&gt;</font> k <font color=Cyan>(</font>Fork n lt rt'<font color=Cyan>)</font>+<a name="(line64)"></a>+<a name="(line65)"></a><a name="itind"></a>itind <font color=Red>::</font> Int <font color=Red>-&gt;</font> IndTree a <font color=Red>-&gt;</font> a  +<a name="(line66)"></a>itind <font color=Green><u>_</u></font> <font color=Cyan>(</font>Leaf x<font color=Cyan>)</font> <font color=Red>=</font> x+<a name="(line67)"></a>itind i <font color=Cyan>(</font>Fork n lt rt<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>if</u></font> i<font color=Cyan>&lt;</font>n <font color=Green><u>then</u></font> itind i lt <font color=Green><u>else</u></font> itind <font color=Cyan>(</font>i<font color=Blue>-</font>n<font color=Cyan>)</font> rt+<a name="(line68)"></a>+<a name="(line69)"></a>+<a name="(line70)"></a><font color=Blue>----</font>+<a name="(line71)"></a><font color=Blue>-- Hash values</font>+<a name="(line72)"></a>+<a name="(line73)"></a><a name="maxHash"></a>maxHash <font color=Red>::</font> Int <font color=Blue>-- should be prime</font>+<a name="(line74)"></a>maxHash <font color=Red>=</font> <font color=Magenta>101</font>+<a name="(line75)"></a>+<a name="(line76)"></a><a name="Hashable"></a><font color=Green><u>class</u></font> Hashable a <font color=Green><u>where</u></font>+<a name="(line77)"></a>    hashWithMax <font color=Red>::</font> Int <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> Int+<a name="(line78)"></a>    hash        <font color=Red>::</font> a <font color=Red>-&gt;</font> Int+<a name="(line79)"></a>    hash <font color=Red>=</font> hashWithMax maxHash+<a name="(line80)"></a>+<a name="(line81)"></a><font color=Green><u>instance</u></font> Enum a <font color=Red>=&gt;</font> Hashable <font color=Red>[</font>a<font color=Red>]</font> <font color=Green><u>where</u></font>+<a name="(line82)"></a>    hashWithMax m <font color=Red>=</font> h <font color=Magenta>0</font>+<a name="(line83)"></a>        <font color=Green><u>where</u></font> h a []     <font color=Red>=</font> a+<a name="(line84)"></a>              h a <font color=Cyan>(</font>c<font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>=</font> h <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>17</font><font color=Cyan>*</font><font color=Cyan>(</font>fromEnum c<font color=Cyan>)</font><font color=Cyan>+</font><font color=Magenta>19</font><font color=Cyan>*</font>a<font color=Cyan>)</font><font color=Cyan>`rem`</font>m<font color=Cyan>)</font> cs+<a name="(line85)"></a>+<a name="(line86)"></a><font color=Blue>----</font> </pre>+</html>
docs/cpphs/Language/Preprocessor/Cpphs/Tokenise.html view
@@ -1,257 +1,275 @@-<pre><font color=Blue>-----------------------------------------------------------------------------</font>-<font color=Blue>-- |</font>-<font color=Blue>-- Module      :  Tokenise</font>-<font color=Blue>-- Copyright   :  2004 Malcolm Wallace</font>-<font color=Blue>-- Licence     :  LGPL</font>-<font color=Blue>--</font>-<font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>-<font color=Blue>-- Stability   :  experimental</font>-<font color=Blue>-- Portability :  All</font>-<font color=Blue>--</font>-<font color=Blue>-- The purpose of this module is to lex a source file (language</font>-<font color=Blue>-- unspecified) into tokens such that cpp can recognise a replaceable</font>-<font color=Blue>-- symbol or macro-use, and do the right thing.</font>-<font color=Blue>-----------------------------------------------------------------------------</font>--<font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Tokenise-  <font color=Cyan>(</font> linesCpp-  <font color=Cyan>,</font> reslash-  <font color=Cyan>,</font> tokenise-  <font color=Cyan>,</font> WordStyle<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>-  <font color=Cyan>,</font> deWordStyle-  <font color=Cyan>,</font> parseMacroCall-  <font color=Cyan>)</font> <font color=Green><u>where</u></font>--<font color=Green><u>import</u></font> Char-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>HashDefine-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Position--<font color=Blue>-- | A Mode value describes whether to tokenise a la Haskell, or a la Cpp.</font>-<font color=Blue>--   The main difference is that in Cpp mode we should recognise line</font>-<font color=Blue>--   continuation characters.</font>-<a name="Mode"></a><font color=Green><u>data</u></font> Mode <font color=Red>=</font> Haskell <font color=Red>|</font> Cpp--<font color=Blue>-- | linesCpp is, broadly speaking, Prelude.lines, except that</font>-<font color=Blue>--   on a line beginning with a \#, line continuation characters are</font>-<font color=Blue>--   recognised.  In a line continuation, the newline character is</font>-<font color=Blue>--   preserved, but the backslash is not.</font>-linesCpp <font color=Red>::</font> String <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font>-<a name="linesCpp"></a>linesCpp  <font color=Red>[</font><font color=Red>]</font>                 <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>-linesCpp <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> x<font color=Cyan>==</font><font color=Magenta>'#'</font>     <font color=Red>=</font> tok Cpp     <font color=Red>[</font><font color=Magenta>'#'</font><font color=Red>]</font> xs-                <font color=Red>|</font> otherwise  <font color=Red>=</font> tok Haskell <font color=Red>[</font><font color=Red>]</font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-  <font color=Green><u>where</u></font>-    tok Cpp   acc <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>ys<font color=Cyan>)</font>   <font color=Red>=</font> tok Cpp <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>acc<font color=Cyan>)</font> ys-    tok <font color=Green><u>_</u></font>     acc <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>ys<font color=Cyan>)</font>    <font color=Red>=</font> reverse acc<font color=Red><b>:</b></font> tok Cpp <font color=Red>[</font><font color=Magenta>'#'</font><font color=Red>]</font> ys-    tok <font color=Green><u>_</u></font>     acc <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>ys<font color=Cyan>)</font>        <font color=Red>=</font> reverse acc<font color=Red><b>:</b></font> tok Haskell <font color=Red>[</font><font color=Red>]</font> ys-    tok <font color=Green><u>_</u></font>     acc <font color=Red>[</font><font color=Red>]</font>               <font color=Red>=</font> reverse acc<font color=Red><b>:</b></font> <font color=Red>[</font><font color=Red>]</font>-    tok mode  acc <font color=Cyan>(</font>y<font color=Red><b>:</b></font>ys<font color=Cyan>)</font>           <font color=Red>=</font> tok mode <font color=Cyan>(</font>y<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> ys--<font color=Blue>-- | Put back the line-continuation characters.</font>-reslash <font color=Red>::</font> String <font color=Red>-&gt;</font> String-<a name="reslash"></a>reslash <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'\\'</font><font color=Red><b>:</b></font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>reslash xs-reslash <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>    <font color=Red>=</font> x<font color=Red><b>:</b></font> reslash xs-reslash   <font color=Red>[</font><font color=Red>]</font>      <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>--<font color=Blue>----</font>-<font color=Blue>-- | Submodes are required to deal correctly with nesting of lexical</font>-<font color=Blue>--   structures.</font>-<a name="SubMode"></a><font color=Green><u>data</u></font> SubMode <font color=Red>=</font> Any <font color=Red>|</font> Pred <font color=Cyan>(</font>Char<font color=Red>-&gt;</font>Bool<font color=Cyan>)</font> <font color=Cyan>(</font>Posn<font color=Red>-&gt;</font>String<font color=Red>-&gt;</font>WordStyle<font color=Cyan>)</font>-             <font color=Red>|</font> String Char <font color=Red>|</font> LineComment <font color=Red>|</font> NestComment Int-             <font color=Red>|</font> CComment--<font color=Blue>-- | Each token is classified as one of Ident, Other, or Cmd:</font>-<font color=Blue>--   * Ident is a word that could potentially match a macro name.</font>-<font color=Blue>--   * Cmd is a complete cpp directive (\#define etc).</font>-<font color=Blue>--   * Other is anything else.</font>-<a name="WordStyle"></a><font color=Green><u>data</u></font> WordStyle <font color=Red>=</font> Ident Posn String <font color=Red>|</font> Other String <font color=Red>|</font> Cmd <font color=Cyan>(</font>Maybe HashDefine<font color=Cyan>)</font>-  <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>-other <font color=Red>::</font> Posn <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> WordStyle-<a name="other"></a>other <font color=Green><u>_</u></font> s <font color=Red>=</font> Other s--deWordStyle <font color=Red>::</font> WordStyle <font color=Red>-&gt;</font> String-<a name="deWordStyle"></a>deWordStyle <font color=Cyan>(</font>Ident <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> i-deWordStyle <font color=Cyan>(</font>Other i<font color=Cyan>)</font>   <font color=Red>=</font> i-deWordStyle <font color=Cyan>(</font>Cmd <font color=Green><u>_</u></font><font color=Cyan>)</font>     <font color=Red>=</font> <font color=Magenta>"\n"</font>--<font color=Blue>-- | tokenise is, broadly-speaking, Prelude.words, except that:</font>-<font color=Blue>--    * the input is already divided into lines</font>-<font color=Blue>--    * each word-like "token" is categorised as one of {Ident,Other,Cmd}</font>-<font color=Blue>--    * \#define's are parsed and returned out-of-band using the Cmd variant</font>-<font color=Blue>--    * All whitespace is preserved intact as tokens.</font>-<font color=Blue>--    * C-comments are converted to white-space (depending on first param)</font>-<font color=Blue>--    * Parens and commas are tokens in their own right.</font>-<font color=Blue>--    * Any cpp line continuations are respected.</font>-<font color=Blue>--   No errors can be raised.</font>-<font color=Blue>--   The inverse of tokenise is (concatMap deWordStyle).</font>-tokenise <font color=Red>::</font> Bool <font color=Red>-&gt;</font> Bool <font color=Red>-&gt;</font> Bool <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font>WordStyle<font color=Red>]</font>-<a name="tokenise"></a>tokenise <font color=Green><u>_</u></font>     <font color=Green><u>_</u></font>    <font color=Green><u>_</u></font>     <font color=Red>[</font><font color=Red>]</font> <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>-tokenise strip ansi lang <font color=Cyan>(</font><font color=Cyan>(</font>pos<font color=Cyan>,</font>str<font color=Cyan>)</font><font color=Red><b>:</b></font>pos_strs<font color=Cyan>)</font> <font color=Red>=</font>-    <font color=Cyan>(</font><font color=Green><u>if</u></font> lang <font color=Green><u>then</u></font> haskell <font color=Green><u>else</u></font> plaintext<font color=Cyan>)</font> Any <font color=Red>[</font><font color=Red>]</font> pos pos_strs str- <font color=Green><u>where</u></font>-    <font color=Blue>-- rules to lex Haskell</font>-  haskell <font color=Red>::</font> SubMode <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> Posn <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>-             <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> <font color=Red>[</font>WordStyle<font color=Red>]</font>-  haskell Any acc p ls <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>      <font color=Red>=</font> emit acc <font color=Cyan>$</font>  <font color=Blue>-- emit "\n" $</font>-                                            cpp Any haskell <font color=Red>[</font><font color=Red>]</font> <font color=Red>[</font><font color=Red>]</font> p ls xs-    <font color=Blue>-- warning: non-maximal munch on comment</font>-  haskell Any acc p ls <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'-'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>       <font color=Red>=</font> emit acc <font color=Cyan>$</font>-                                            haskell LineComment <font color=Magenta>"--"</font> p ls xs-  haskell Any acc p ls <font color=Cyan>(</font><font color=Magenta>'{'</font><font color=Red><b>:</b></font><font color=Magenta>'-'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>       <font color=Red>=</font> emit acc <font color=Cyan>$</font>-                                            haskell <font color=Cyan>(</font>NestComment <font color=Magenta>0</font><font color=Cyan>)</font> <font color=Magenta>"-{"</font> p ls xs-  haskell Any acc p ls <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font><font color=Magenta>'*'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font><font color=Red>|</font>strip <font color=Red>=</font> emit acc <font color=Cyan>$</font>-                                            haskell CComment <font color=Magenta>"  "</font> p ls xs-  haskell Any acc p ls <font color=Cyan>(</font><font color=Magenta>'"'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>           <font color=Red>=</font> emit acc <font color=Cyan>$</font>-                                            haskell <font color=Cyan>(</font>String <font color=Magenta>'"'</font><font color=Cyan>)</font> <font color=Red>[</font><font color=Magenta>'"'</font><font color=Red>]</font> p ls xs-  haskell Any acc p ls <font color=Cyan>(</font><font color=Magenta>'\''</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>          <font color=Red>=</font> emit acc <font color=Cyan>$</font>-                                            haskell <font color=Cyan>(</font>String <font color=Magenta>'\''</font><font color=Cyan>)</font> <font color=Magenta>"'"</font> p ls xs-  haskell Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> single x  <font color=Red>=</font> emit acc <font color=Cyan>$</font> emit <font color=Red>[</font>x<font color=Red>]</font> <font color=Cyan>$</font>-                                            haskell Any <font color=Red>[</font><font color=Red>]</font> p ls xs-  haskell Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> space x   <font color=Red>=</font> emit acc <font color=Cyan>$</font>-                                            haskell <font color=Cyan>(</font>Pred space other<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font>-                                                                        p ls xs-  haskell Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> symbol x  <font color=Red>=</font> emit acc <font color=Cyan>$</font>-                                            haskell <font color=Cyan>(</font>Pred symbol other<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font>-                                                                        p ls xs- <font color=Blue>-- haskell Any [] p ls (x:xs) | ident0 x  = id $</font>-  haskell Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> ident0 x  <font color=Red>=</font> emit acc <font color=Cyan>$</font>-                                            haskell <font color=Cyan>(</font>Pred ident1 Ident<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font>-                                                                        p ls xs-  haskell Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>             <font color=Red>=</font> haskell Any <font color=Cyan>(</font>x<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs--  haskell pre<font color=Red>@</font><font color=Cyan>(</font>Pred pred ws<font color=Cyan>)</font> acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                        <font color=Red>|</font> pred x    <font color=Red>=</font> haskell pre <font color=Cyan>(</font>x<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs-  haskell <font color=Cyan>(</font>Pred <font color=Green><u>_</u></font> ws<font color=Cyan>)</font> acc p ls xs   <font color=Red>=</font> ws p <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Red><b>:</b></font>-                                      haskell Any <font color=Red>[</font><font color=Red>]</font> p ls xs-  haskell <font color=Cyan>(</font>String c<font color=Cyan>)</font> acc p ls <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                        <font color=Red>|</font> x<font color=Cyan>==</font><font color=Magenta>'\\'</font>   <font color=Red>=</font> haskell <font color=Cyan>(</font>String c<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs-                        <font color=Red>|</font> x<font color=Cyan>==</font>c      <font color=Red>=</font> haskell <font color=Cyan>(</font>String c<font color=Cyan>)</font> <font color=Cyan>(</font>c<font color=Red><b>:</b></font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs-  haskell <font color=Cyan>(</font>String c<font color=Cyan>)</font> acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                        <font color=Red>|</font> x<font color=Cyan>==</font>c      <font color=Red>=</font> emit <font color=Cyan>(</font>c<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> <font color=Cyan>$</font> haskell Any <font color=Red>[</font><font color=Red>]</font> p ls xs-                        <font color=Red>|</font> otherwise <font color=Red>=</font> haskell <font color=Cyan>(</font>String c<font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs-  haskell LineComment acc p ls xs<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> emit acc <font color=Cyan>$</font> haskell Any <font color=Red>[</font><font color=Red>]</font> p ls xs-  haskell LineComment acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>      <font color=Red>=</font> haskell LineComment <font color=Cyan>(</font>x<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs-  haskell <font color=Cyan>(</font>NestComment n<font color=Cyan>)</font> acc p ls <font color=Cyan>(</font><font color=Magenta>'{'</font><font color=Red><b>:</b></font><font color=Magenta>'-'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                                    <font color=Red>=</font> haskell <font color=Cyan>(</font>NestComment <font color=Cyan>(</font>n<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font><font color=Cyan>)</font>-                                                            <font color=Cyan>(</font><font color=Magenta>"-{"</font><font color=Cyan>++</font>acc<font color=Cyan>)</font> p ls xs-  haskell <font color=Cyan>(</font>NestComment <font color=Magenta>0</font><font color=Cyan>)</font> acc p ls <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'}'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                                    <font color=Red>=</font> emit <font color=Cyan>(</font><font color=Magenta>"}-"</font><font color=Cyan>++</font>acc<font color=Cyan>)</font> <font color=Cyan>$</font> haskell Any <font color=Red>[</font><font color=Red>]</font> p ls xs-  haskell <font color=Cyan>(</font>NestComment n<font color=Cyan>)</font> acc p ls <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'}'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                                    <font color=Red>=</font> haskell <font color=Cyan>(</font>NestComment <font color=Cyan>(</font>n<font color=Blue>-</font><font color=Magenta>1</font><font color=Cyan>)</font><font color=Cyan>)</font>-                                                            <font color=Cyan>(</font><font color=Magenta>"}-"</font><font color=Cyan>++</font>acc<font color=Cyan>)</font> p ls xs-  haskell <font color=Cyan>(</font>NestComment n<font color=Cyan>)</font> acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> haskell <font color=Cyan>(</font>NestComment n<font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font>acc<font color=Cyan>)</font>-                                                                        p ls xs-  haskell CComment acc p ls <font color=Cyan>(</font><font color=Magenta>'*'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> emit <font color=Cyan>(</font><font color=Magenta>"  "</font><font color=Cyan>++</font>acc<font color=Cyan>)</font> <font color=Cyan>$</font>-                                            haskell Any <font color=Red>[</font><font color=Red>]</font> p ls xs-  haskell CComment acc p ls <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>        <font color=Red>=</font> haskell CComment <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs-  haskell mode acc <font color=Green><u>_</u></font> <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l<font color=Cyan>)</font><font color=Red><b>:</b></font>ls<font color=Cyan>)</font> <font color=Red>[</font><font color=Red>]</font>        <font color=Red>=</font> haskell mode acc p ls <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>l<font color=Cyan>)</font>-  haskell <font color=Green><u>_</u></font>    acc <font color=Green><u>_</u></font> <font color=Red>[</font><font color=Red>]</font> <font color=Red>[</font><font color=Red>]</font>                <font color=Red>=</font> emit acc <font color=Cyan>$</font> <font color=Red>[</font><font color=Red>]</font>--  <font color=Blue>-- rules to lex Cpp</font>-  cpp <font color=Red>::</font> SubMode <font color=Red>-&gt;</font> <font color=Cyan>(</font>SubMode <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> Posn <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>-                     <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> <font color=Red>[</font>WordStyle<font color=Red>]</font><font color=Cyan>)</font>-         <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> Posn <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>-         <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> <font color=Red>[</font>WordStyle<font color=Red>]</font>-  cpp mode next word line pos remaining input <font color=Red>=</font>-    lexcpp mode word line remaining input-   <font color=Green><u>where</u></font>-    lexcpp Any w l ls <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font><font color=Magenta>'*'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>   <font color=Red>=</font> lexcpp <font color=Cyan>(</font>NestComment <font color=Magenta>0</font><font color=Cyan>)</font> <font color=Magenta>""</font> <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs-    lexcpp Any w l ls <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>   <font color=Red>=</font> lexcpp LineComment <font color=Magenta>"  "</font> <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs-    lexcpp Any w l <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l'<font color=Cyan>)</font><font color=Red><b>:</b></font>ls<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font><font color=Red>[</font><font color=Red>]</font><font color=Cyan>)</font>  <font color=Red>=</font> cpp Any next <font color=Red>[</font><font color=Red>]</font> <font color=Cyan>(</font><font color=Magenta>"\n"</font><font color=Red><b>:</b></font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> p ls l'-    lexcpp Any w l ls <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> lexcpp Any <font color=Red>[</font><font color=Red>]</font> <font color=Cyan>(</font><font color=Magenta>"\n"</font><font color=Red><b>:</b></font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs-    lexcpp Any w l ls xs<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font>    <font color=Red>=</font> Cmd <font color=Cyan>(</font>parseHashDefine ansi-                                                           <font color=Cyan>(</font>reverse <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font>-                                       next Any <font color=Red>[</font><font color=Red>]</font> pos ls xs- <font color=Blue>-- lexcpp Any w l ls ('"':xs)     = lexcpp (String '"') ['"'] (w*/*l) ls xs</font>- <font color=Blue>-- lexcpp Any w l ls ('\'':xs)    = lexcpp (String '\'') "'"  (w*/*l) ls xs</font>-    lexcpp Any w l ls <font color=Cyan>(</font><font color=Magenta>'"'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>       <font color=Red>=</font> lexcpp Any <font color=Red>[</font><font color=Red>]</font> <font color=Cyan>(</font><font color=Magenta>"\""</font><font color=Red><b>:</b></font><font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font><font color=Cyan>)</font> ls xs-    lexcpp Any w l ls <font color=Cyan>(</font><font color=Magenta>'\''</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>      <font color=Red>=</font> lexcpp Any <font color=Red>[</font><font color=Red>]</font> <font color=Cyan>(</font><font color=Magenta>"'"</font><font color=Red><b>:</b></font> <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font><font color=Cyan>)</font> ls xs-    lexcpp Any <font color=Red>[</font><font color=Red>]</font> l ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                    <font color=Red>|</font> ident0 x  <font color=Red>=</font> lexcpp <font color=Cyan>(</font>Pred ident1 Ident<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font> l ls xs- <font color=Blue>-- lexcpp Any w l ls (x:xs) | ident0 x  = lexcpp (Pred ident1 Ident) [x] (w*/*l) ls xs</font>-    lexcpp Any w l ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                    <font color=Red>|</font> single x  <font color=Red>=</font> lexcpp Any <font color=Red>[</font><font color=Red>]</font> <font color=Cyan>(</font><font color=Red>[</font>x<font color=Red>]</font><font color=Red><b>:</b></font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs-                    <font color=Red>|</font> space x   <font color=Red>=</font> lexcpp <font color=Cyan>(</font>Pred space other<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font> <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs-                    <font color=Red>|</font> symbol x  <font color=Red>=</font> lexcpp <font color=Cyan>(</font>Pred symbol other<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font> <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs-                    <font color=Red>|</font> otherwise <font color=Red>=</font> lexcpp Any <font color=Cyan>(</font>x<font color=Red><b>:</b></font>w<font color=Cyan>)</font> l ls xs-    lexcpp pre<font color=Red>@</font><font color=Cyan>(</font>Pred pred <font color=Green><u>_</u></font><font color=Cyan>)</font> w l ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                    <font color=Red>|</font> pred x    <font color=Red>=</font> lexcpp pre <font color=Cyan>(</font>x<font color=Red><b>:</b></font>w<font color=Cyan>)</font> l ls xs-    lexcpp <font color=Cyan>(</font>Pred <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> w l ls xs <font color=Red>=</font> lexcpp Any <font color=Red>[</font><font color=Red>]</font> <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs-    lexcpp <font color=Cyan>(</font>String c<font color=Cyan>)</font> w l ls <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                    <font color=Red>|</font> x<font color=Cyan>==</font><font color=Magenta>'\\'</font>   <font color=Red>=</font> lexcpp <font color=Cyan>(</font>String c<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font> l ls xs-                    <font color=Red>|</font> x<font color=Cyan>==</font>c      <font color=Red>=</font> lexcpp <font color=Cyan>(</font>String c<font color=Cyan>)</font> <font color=Cyan>(</font>c<font color=Red><b>:</b></font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font> l ls xs-    lexcpp <font color=Cyan>(</font>String c<font color=Cyan>)</font> w l ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                    <font color=Red>|</font> x<font color=Cyan>==</font>c      <font color=Red>=</font> lexcpp Any <font color=Red>[</font><font color=Red>]</font> <font color=Cyan>(</font><font color=Cyan>(</font>c<font color=Red><b>:</b></font>w<font color=Cyan>)</font><font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs-                    <font color=Red>|</font> otherwise <font color=Red>=</font> lexcpp <font color=Cyan>(</font>String c<font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font>w<font color=Cyan>)</font> l ls xs-    lexcpp LineComment w l <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l'<font color=Cyan>)</font><font color=Red><b>:</b></font>ls<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font><font color=Red>[</font><font color=Red>]</font><font color=Cyan>)</font>-                             <font color=Red>=</font> cpp LineComment next <font color=Red>[</font><font color=Red>]</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font><font color=Cyan>*/*</font>l<font color=Cyan>)</font> pos ls l'-    lexcpp LineComment w l ls <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                                <font color=Red>=</font> lexcpp LineComment <font color=Red>[</font><font color=Red>]</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font><font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs-    lexcpp LineComment w l ls xs<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> lexcpp Any w l ls xs-    lexcpp LineComment w l ls <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>      <font color=Red>=</font> lexcpp LineComment <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font> l ls xs-    lexcpp <font color=Cyan>(</font>NestComment <font color=Green><u>_</u></font><font color=Cyan>)</font> w l ls <font color=Cyan>(</font><font color=Magenta>'*'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                                          <font color=Red>=</font> lexcpp Any <font color=Red>[</font><font color=Red>]</font> <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs-    lexcpp <font color=Cyan>(</font>NestComment n<font color=Cyan>)</font> w l ls <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> lexcpp <font color=Cyan>(</font>NestComment n<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font> l-                                                                        ls xs-    lexcpp mode w l <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l'<font color=Cyan>)</font><font color=Red><b>:</b></font>ls<font color=Cyan>)</font> <font color=Red>[</font><font color=Red>]</font>        <font color=Red>=</font> cpp mode next w l p ls <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>l'<font color=Cyan>)</font>-    lexcpp <font color=Green><u>_</u></font>    <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Red>[</font><font color=Red>]</font>          <font color=Red>[</font><font color=Red>]</font>        <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>--    <font color=Blue>-- rules to lex non-Haskell, non-cpp text</font>-  plaintext <font color=Red>::</font> SubMode <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> Posn <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>-            <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> <font color=Red>[</font>WordStyle<font color=Red>]</font>-  plaintext Any acc p ls <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> emit acc <font color=Cyan>$</font>  <font color=Blue>-- emit "\n" $</font>-                                          cpp Any plaintext <font color=Red>[</font><font color=Red>]</font> <font color=Red>[</font><font color=Red>]</font> p ls xs-  plaintext Any acc p ls <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font><font color=Magenta>'*'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font><font color=Red>|</font>strip <font color=Red>=</font> emit acc <font color=Cyan>$</font>-                                              plaintext CComment <font color=Magenta>"  "</font> p ls xs-  plaintext Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> single x  <font color=Red>=</font> emit acc <font color=Cyan>$</font> emit <font color=Red>[</font>x<font color=Red>]</font> <font color=Cyan>$</font>-                                              plaintext Any <font color=Red>[</font><font color=Red>]</font> p ls xs-  plaintext Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> space x   <font color=Red>=</font> emit acc <font color=Cyan>$</font>-                                              plaintext <font color=Cyan>(</font>Pred space other<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font>-                                                                        p ls xs-  plaintext Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> ident0 x  <font color=Red>=</font> emit acc <font color=Cyan>$</font>-                                              plaintext <font color=Cyan>(</font>Pred ident1 Ident<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font>-                                                                        p ls xs-  plaintext Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>             <font color=Red>=</font> plaintext Any <font color=Cyan>(</font>x<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs-  plaintext pre<font color=Red>@</font><font color=Cyan>(</font>Pred pred ws<font color=Cyan>)</font> acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>-                                <font color=Red>|</font> pred x    <font color=Red>=</font> plaintext pre <font color=Cyan>(</font>x<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs-  plaintext <font color=Cyan>(</font>Pred <font color=Green><u>_</u></font> ws<font color=Cyan>)</font> acc p ls xs         <font color=Red>=</font> ws p <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Red><b>:</b></font>-                                              plaintext Any <font color=Red>[</font><font color=Red>]</font> p ls xs-  plaintext CComment acc p ls <font color=Cyan>(</font><font color=Magenta>'*'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> emit <font color=Cyan>(</font><font color=Magenta>"  "</font><font color=Cyan>++</font>acc<font color=Cyan>)</font> <font color=Cyan>$</font>-                                              plaintext Any <font color=Red>[</font><font color=Red>]</font> p ls xs-  plaintext CComment acc p ls <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>    <font color=Red>=</font> plaintext CComment <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs-  plaintext mode acc <font color=Green><u>_</u></font> <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l<font color=Cyan>)</font><font color=Red><b>:</b></font>ls<font color=Cyan>)</font> <font color=Red>[</font><font color=Red>]</font>    <font color=Red>=</font> plaintext mode acc p ls <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>l<font color=Cyan>)</font>-  plaintext <font color=Green><u>_</u></font>    acc <font color=Green><u>_</u></font> <font color=Red>[</font><font color=Red>]</font> <font color=Red>[</font><font color=Red>]</font>            <font color=Red>=</font> emit acc <font color=Cyan>$</font> <font color=Red>[</font><font color=Red>]</font>--  <font color=Blue>-- predicates for lexing Haskell.</font>-  ident0 x <font color=Red>=</font> isAlpha x    <font color=Cyan>||</font> x <font color=Cyan>`elem`</font> <font color=Magenta>"_`"</font>-  ident1 x <font color=Red>=</font> isAlphaNum x <font color=Cyan>||</font> x <font color=Cyan>`elem`</font> <font color=Magenta>"'_`"</font>-  symbol x <font color=Red>=</font> x <font color=Cyan>`elem`</font> <font color=Magenta>":!#$%&amp;*+./&lt;=&gt;?@\\^|-~"</font>-  single x <font color=Red>=</font> x <font color=Cyan>`elem`</font> <font color=Magenta>"(),[];{}"</font>-  space  x <font color=Red>=</font> x <font color=Cyan>`elem`</font> <font color=Magenta>" \t"</font>-  <font color=Blue>-- emit a token (if there is one) from the accumulator</font>-  emit <font color=Magenta>""</font>  <font color=Red>=</font> id-  emit xs  <font color=Red>=</font> <font color=Cyan>(</font>Other <font color=Cyan>(</font>reverse xs<font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Cyan>)</font>-  <font color=Blue>-- add a reversed word to the accumulator</font>-  <font color=Magenta>""</font> <font color=Cyan>*/*</font> l <font color=Red>=</font> l-  w <font color=Cyan>*/*</font> l  <font color=Red>=</font> reverse w <font color=Red><b>:</b></font> l-  <font color=Blue>-- help out broken Haskell compilers which need balanced numbers of C</font>-  <font color=Blue>-- comments in order to do import chasing :-)  -----&gt;   */*</font>---<font color=Blue>-- | Parse a possible macro call, returning argument list and remaining input</font>-parseMacroCall <font color=Red>::</font> Posn <font color=Red>-&gt;</font> <font color=Red>[</font>WordStyle<font color=Red>]</font> <font color=Red>-&gt;</font> Maybe <font color=Cyan>(</font><font color=Red>[</font><font color=Red>[</font>WordStyle<font color=Red>]</font><font color=Red>]</font><font color=Cyan>,</font><font color=Red>[</font>WordStyle<font color=Red>]</font><font color=Cyan>)</font>-<a name="parseMacroCall"></a>parseMacroCall p <font color=Red>=</font> call <font color=Cyan>.</font> skip-  <font color=Green><u>where</u></font>-    skip <font color=Cyan>(</font>Other x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> all isSpace x <font color=Red>=</font> skip xs-    skip xss                          <font color=Red>=</font> xss-    call <font color=Cyan>(</font>Other <font color=Magenta>"("</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>   <font color=Red>=</font> <font color=Cyan>(</font>args <font color=Cyan>(</font><font color=Magenta>0</font><font color=Red>::</font>Int<font color=Cyan>)</font> <font color=Red>[</font><font color=Red>]</font> <font color=Red>[</font><font color=Red>]</font> <font color=Cyan>.</font> skip<font color=Cyan>)</font> xs-    call <font color=Green><u>_</u></font>                <font color=Red>=</font> Nothing-    args <font color=Magenta>0</font> w acc <font color=Cyan>(</font>   Other <font color=Magenta>")"</font> <font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> Just <font color=Cyan>(</font>reverse <font color=Cyan>(</font>addone w acc<font color=Cyan>)</font><font color=Cyan>,</font> xs<font color=Cyan>)</font>-    args <font color=Magenta>0</font> w acc <font color=Cyan>(</font>   Other <font color=Magenta>","</font> <font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> args <font color=Magenta>0</font>     <font color=Red>[</font><font color=Red>]</font>   <font color=Cyan>(</font>addone w acc<font color=Cyan>)</font> <font color=Cyan>(</font>skip xs<font color=Cyan>)</font>-    args n w acc <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Other <font color=Magenta>"("</font><font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> args <font color=Cyan>(</font>n<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font>w<font color=Cyan>)</font>         acc    xs-    args n w acc <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Other <font color=Magenta>")"</font><font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> args <font color=Cyan>(</font>n<font color=Blue>-</font><font color=Magenta>1</font><font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font>w<font color=Cyan>)</font>         acc    xs-    args n w acc <font color=Cyan>(</font>   Ident <font color=Green><u>_</u></font> v <font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> args n     <font color=Cyan>(</font>Ident p v<font color=Red><b>:</b></font>w<font color=Cyan>)</font> acc    xs-    args n w acc <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Other <font color=Green><u>_</u></font><font color=Cyan>)</font>  <font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> args n     <font color=Cyan>(</font>x<font color=Red><b>:</b></font>w<font color=Cyan>)</font>         acc    xs-    args <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font>   <font color=Green><u>_</u></font>                   <font color=Red>=</font> Nothing-    addone w acc <font color=Red>=</font> reverse <font color=Cyan>(</font>skip w<font color=Cyan>)</font><font color=Red><b>:</b></font> acc-+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">+<html>+<pre><a name="(line1)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line2)"></a><font color=Blue>-- |</font>+<a name="(line3)"></a><font color=Blue>-- Module      :  Tokenise</font>+<a name="(line4)"></a><font color=Blue>-- Copyright   :  2004 Malcolm Wallace</font>+<a name="(line5)"></a><font color=Blue>-- Licence     :  LGPL</font>+<a name="(line6)"></a><font color=Blue>--</font>+<a name="(line7)"></a><font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>+<a name="(line8)"></a><font color=Blue>-- Stability   :  experimental</font>+<a name="(line9)"></a><font color=Blue>-- Portability :  All</font>+<a name="(line10)"></a><font color=Blue>--</font>+<a name="(line11)"></a><font color=Blue>-- The purpose of this module is to lex a source file (language</font>+<a name="(line12)"></a><font color=Blue>-- unspecified) into tokens such that cpp can recognise a replaceable</font>+<a name="(line13)"></a><font color=Blue>-- symbol or macro-use, and do the right thing.</font>+<a name="(line14)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line15)"></a>+<a name="(line16)"></a><font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Tokenise+<a name="(line17)"></a>  <font color=Cyan>(</font> linesCpp+<a name="(line18)"></a>  <font color=Cyan>,</font> reslash+<a name="(line19)"></a>  <font color=Cyan>,</font> tokenise+<a name="(line20)"></a>  <font color=Cyan>,</font> WordStyle<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font>+<a name="(line21)"></a>  <font color=Cyan>,</font> deWordStyle+<a name="(line22)"></a>  <font color=Cyan>,</font> parseMacroCall+<a name="(line23)"></a>  <font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="(line24)"></a>+<a name="(line25)"></a><font color=Green><u>import</u></font> Char+<a name="(line26)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>HashDefine+<a name="(line27)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs<font color=Cyan>.</font>Position+<a name="(line28)"></a>+<a name="(line29)"></a><a name="Mode"></a><font color=Blue>-- | A Mode value describes whether to tokenise a la Haskell, or a la Cpp.</font>+<a name="(line30)"></a><a name="Mode"></a><font color=Blue>--   The main difference is that in Cpp mode we should recognise line</font>+<a name="(line31)"></a><a name="Mode"></a><font color=Blue>--   continuation characters.</font>+<a name="(line32)"></a><a name="Mode"></a><font color=Green><u>data</u></font> Mode <font color=Red>=</font> Haskell <font color=Red>|</font> Cpp+<a name="(line33)"></a>+<a name="(line34)"></a><a name="linesCpp"></a><font color=Blue>-- | linesCpp is, broadly speaking, Prelude.lines, except that</font>+<a name="(line35)"></a><font color=Blue>--   on a line beginning with a \#, line continuation characters are</font>+<a name="(line36)"></a><font color=Blue>--   recognised.  In a line continuation, the newline character is</font>+<a name="(line37)"></a><font color=Blue>--   preserved, but the backslash is not.</font>+<a name="(line38)"></a>linesCpp <font color=Red>::</font> String <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font>+<a name="(line39)"></a>linesCpp  []                 <font color=Red>=</font> []+<a name="(line40)"></a>linesCpp <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> x<font color=Cyan>==</font><font color=Magenta>'#'</font>     <font color=Red>=</font> tok Cpp     <font color=Red>[</font><font color=Magenta>'#'</font><font color=Red>]</font> xs+<a name="(line41)"></a>                <font color=Red>|</font> otherwise  <font color=Red>=</font> tok Haskell [] <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line42)"></a>  <font color=Green><u>where</u></font>+<a name="(line43)"></a>    tok Cpp   acc <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>ys<font color=Cyan>)</font>   <font color=Red>=</font> tok Cpp <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>acc<font color=Cyan>)</font> ys+<a name="(line44)"></a>    tok <font color=Green><u>_</u></font>     acc <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>ys<font color=Cyan>)</font>    <font color=Red>=</font> reverse acc<font color=Red><b>:</b></font> tok Cpp <font color=Red>[</font><font color=Magenta>'#'</font><font color=Red>]</font> ys+<a name="(line45)"></a>    tok <font color=Green><u>_</u></font>     acc <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>ys<font color=Cyan>)</font>        <font color=Red>=</font> reverse acc<font color=Red><b>:</b></font> tok Haskell [] ys+<a name="(line46)"></a>    tok <font color=Green><u>_</u></font>     acc []               <font color=Red>=</font> reverse acc<font color=Red><b>:</b></font> []+<a name="(line47)"></a>    tok mode  acc <font color=Cyan>(</font>y<font color=Red><b>:</b></font>ys<font color=Cyan>)</font>           <font color=Red>=</font> tok mode <font color=Cyan>(</font>y<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> ys+<a name="(line48)"></a>+<a name="(line49)"></a><a name="reslash"></a><font color=Blue>-- | Put back the line-continuation characters.</font>+<a name="(line50)"></a>reslash <font color=Red>::</font> String <font color=Red>-&gt;</font> String+<a name="(line51)"></a>reslash <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'\\'</font><font color=Red><b>:</b></font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>reslash xs+<a name="(line52)"></a>reslash <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>    <font color=Red>=</font> x<font color=Red><b>:</b></font> reslash xs+<a name="(line53)"></a>reslash   []      <font color=Red>=</font> []+<a name="(line54)"></a>+<a name="(line55)"></a><a name="SubMode"></a><font color=Blue>----</font>+<a name="(line56)"></a><a name="SubMode"></a><font color=Blue>-- | Submodes are required to deal correctly with nesting of lexical</font>+<a name="(line57)"></a><a name="SubMode"></a><font color=Blue>--   structures.</font>+<a name="(line58)"></a><a name="SubMode"></a><font color=Green><u>data</u></font> SubMode <font color=Red>=</font> Any <font color=Red>|</font> Pred <font color=Cyan>(</font>Char<font color=Red>-&gt;</font>Bool<font color=Cyan>)</font> <font color=Cyan>(</font>Posn<font color=Red>-&gt;</font>String<font color=Red>-&gt;</font>WordStyle<font color=Cyan>)</font>+<a name="(line59)"></a>             <font color=Red>|</font> String Char <font color=Red>|</font> LineComment <font color=Red>|</font> NestComment Int+<a name="(line60)"></a>             <font color=Red>|</font> CComment <font color=Red>|</font> CLineComment+<a name="(line61)"></a>+<a name="(line62)"></a><a name="WordStyle"></a><font color=Blue>-- | Each token is classified as one of Ident, Other, or Cmd:</font>+<a name="(line63)"></a><a name="WordStyle"></a><font color=Blue>--   * Ident is a word that could potentially match a macro name.</font>+<a name="(line64)"></a><a name="WordStyle"></a><font color=Blue>--   * Cmd is a complete cpp directive (\#define etc).</font>+<a name="(line65)"></a><a name="WordStyle"></a><font color=Blue>--   * Other is anything else.</font>+<a name="(line66)"></a><a name="WordStyle"></a><font color=Green><u>data</u></font> WordStyle <font color=Red>=</font> Ident Posn String <font color=Red>|</font> Other String <font color=Red>|</font> Cmd <font color=Cyan>(</font>Maybe HashDefine<font color=Cyan>)</font>+<a name="(line67)"></a>  <font color=Green><u>deriving</u></font> <font color=Cyan>(</font>Eq<font color=Cyan>,</font>Show<font color=Cyan>)</font>+<a name="(line68)"></a><a name="other"></a>other <font color=Red>::</font> Posn <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> WordStyle+<a name="(line69)"></a>other <font color=Green><u>_</u></font> s <font color=Red>=</font> Other s+<a name="(line70)"></a>+<a name="(line71)"></a><a name="deWordStyle"></a>deWordStyle <font color=Red>::</font> WordStyle <font color=Red>-&gt;</font> String+<a name="(line72)"></a>deWordStyle <font color=Cyan>(</font>Ident <font color=Green><u>_</u></font> i<font color=Cyan>)</font> <font color=Red>=</font> i+<a name="(line73)"></a>deWordStyle <font color=Cyan>(</font>Other i<font color=Cyan>)</font>   <font color=Red>=</font> i+<a name="(line74)"></a>deWordStyle <font color=Cyan>(</font>Cmd <font color=Green><u>_</u></font><font color=Cyan>)</font>     <font color=Red>=</font> <font color=Magenta>"\n"</font>+<a name="(line75)"></a>+<a name="(line76)"></a><a name="tokenise"></a><font color=Blue>-- | tokenise is, broadly-speaking, Prelude.words, except that:</font>+<a name="(line77)"></a><font color=Blue>--    * the input is already divided into lines</font>+<a name="(line78)"></a><font color=Blue>--    * each word-like "token" is categorised as one of {Ident,Other,Cmd}</font>+<a name="(line79)"></a><font color=Blue>--    * \#define's are parsed and returned out-of-band using the Cmd variant</font>+<a name="(line80)"></a><font color=Blue>--    * All whitespace is preserved intact as tokens.</font>+<a name="(line81)"></a><font color=Blue>--    * C-comments are converted to white-space (depending on first param)</font>+<a name="(line82)"></a><font color=Blue>--    * Parens and commas are tokens in their own right.</font>+<a name="(line83)"></a><font color=Blue>--    * Any cpp line continuations are respected.</font>+<a name="(line84)"></a><font color=Blue>--   No errors can be raised.</font>+<a name="(line85)"></a><font color=Blue>--   The inverse of tokenise is (concatMap deWordStyle).</font>+<a name="(line86)"></a>tokenise <font color=Red>::</font> Bool <font color=Red>-&gt;</font> Bool <font color=Red>-&gt;</font> Bool <font color=Red>-&gt;</font> Bool <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font>WordStyle<font color=Red>]</font>+<a name="(line87)"></a>tokenise <font color=Green><u>_</u></font>        <font color=Green><u>_</u></font>             <font color=Green><u>_</u></font>    <font color=Green><u>_</u></font>     [] <font color=Red>=</font> []+<a name="(line88)"></a>tokenise stripEol stripComments ansi lang <font color=Cyan>(</font><font color=Cyan>(</font>pos<font color=Cyan>,</font>str<font color=Cyan>)</font><font color=Red><b>:</b></font>pos_strs<font color=Cyan>)</font> <font color=Red>=</font>+<a name="(line89)"></a>    <font color=Cyan>(</font><font color=Green><u>if</u></font> lang <font color=Green><u>then</u></font> haskell <font color=Green><u>else</u></font> plaintext<font color=Cyan>)</font> Any [] pos pos_strs str+<a name="(line90)"></a> <font color=Green><u>where</u></font>+<a name="(line91)"></a>    <font color=Blue>-- rules to lex Haskell</font>+<a name="(line92)"></a>  haskell <font color=Red>::</font> SubMode <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> Posn <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>+<a name="(line93)"></a>             <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> <font color=Red>[</font>WordStyle<font color=Red>]</font>+<a name="(line94)"></a>  haskell Any acc p ls <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>      <font color=Red>=</font> emit acc <font color=Cyan>$</font>  <font color=Blue>-- emit "\n" $</font>+<a name="(line95)"></a>                                            cpp Any haskell [] [] p ls xs+<a name="(line96)"></a>    <font color=Blue>-- warning: non-maximal munch on comment</font>+<a name="(line97)"></a>  haskell Any acc p ls <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'-'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>       <font color=Red>=</font> emit acc <font color=Cyan>$</font>+<a name="(line98)"></a>                                            haskell LineComment <font color=Magenta>"--"</font> p ls xs+<a name="(line99)"></a>  haskell Any acc p ls <font color=Cyan>(</font><font color=Magenta>'{'</font><font color=Red><b>:</b></font><font color=Magenta>'-'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>       <font color=Red>=</font> emit acc <font color=Cyan>$</font>+<a name="(line100)"></a>                                            haskell <font color=Cyan>(</font>NestComment <font color=Magenta>0</font><font color=Cyan>)</font> <font color=Magenta>"-{"</font> p ls xs+<a name="(line101)"></a>  haskell Any acc p ls <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font><font color=Magenta>'*'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line102)"></a>                          <font color=Red>|</font> stripComments <font color=Red>=</font> emit acc <font color=Cyan>$</font>+<a name="(line103)"></a>                                            haskell CComment <font color=Magenta>"  "</font> p ls xs+<a name="(line104)"></a>  haskell Any acc p ls <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line105)"></a>                          <font color=Red>|</font> stripEol      <font color=Red>=</font> emit acc <font color=Cyan>$</font>+<a name="(line106)"></a>                                            haskell CLineComment <font color=Magenta>"  "</font> p ls xs+<a name="(line107)"></a>  haskell Any acc p ls <font color=Cyan>(</font><font color=Magenta>'"'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>           <font color=Red>=</font> emit acc <font color=Cyan>$</font>+<a name="(line108)"></a>                                            haskell <font color=Cyan>(</font>String <font color=Magenta>'"'</font><font color=Cyan>)</font> <font color=Red>[</font><font color=Magenta>'"'</font><font color=Red>]</font> p ls xs+<a name="(line109)"></a>  haskell Any acc p ls <font color=Cyan>(</font><font color=Magenta>'\''</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>          <font color=Red>=</font> emit acc <font color=Cyan>$</font>+<a name="(line110)"></a>                                            haskell <font color=Cyan>(</font>String <font color=Magenta>'\''</font><font color=Cyan>)</font> <font color=Magenta>"'"</font> p ls xs+<a name="(line111)"></a>  haskell Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> single x  <font color=Red>=</font> emit acc <font color=Cyan>$</font> emit <font color=Red>[</font>x<font color=Red>]</font> <font color=Cyan>$</font>+<a name="(line112)"></a>                                            haskell Any [] p ls xs+<a name="(line113)"></a>  haskell Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> space x   <font color=Red>=</font> emit acc <font color=Cyan>$</font>+<a name="(line114)"></a>                                            haskell <font color=Cyan>(</font>Pred space other<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font>+<a name="(line115)"></a>                                                                        p ls xs+<a name="(line116)"></a>  haskell Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> symbol x  <font color=Red>=</font> emit acc <font color=Cyan>$</font>+<a name="(line117)"></a>                                            haskell <font color=Cyan>(</font>Pred symbol other<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font>+<a name="(line118)"></a>                                                                        p ls xs+<a name="(line119)"></a> <font color=Blue>-- haskell Any [] p ls (x:xs) | ident0 x  = id $</font>+<a name="(line120)"></a>  haskell Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> ident0 x  <font color=Red>=</font> emit acc <font color=Cyan>$</font>+<a name="(line121)"></a>                                            haskell <font color=Cyan>(</font>Pred ident1 Ident<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font>+<a name="(line122)"></a>                                                                        p ls xs+<a name="(line123)"></a>  haskell Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>             <font color=Red>=</font> haskell Any <font color=Cyan>(</font>x<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs+<a name="(line124)"></a>+<a name="(line125)"></a>  haskell pre<font color=Red>@</font><font color=Cyan>(</font>Pred pred ws<font color=Cyan>)</font> acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line126)"></a>                        <font color=Red>|</font> pred x    <font color=Red>=</font> haskell pre <font color=Cyan>(</font>x<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs+<a name="(line127)"></a>  haskell <font color=Cyan>(</font>Pred <font color=Green><u>_</u></font> ws<font color=Cyan>)</font> acc p ls xs   <font color=Red>=</font> ws p <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Red><b>:</b></font>+<a name="(line128)"></a>                                      haskell Any [] p ls xs+<a name="(line129)"></a>  haskell <font color=Cyan>(</font>String c<font color=Cyan>)</font> acc p ls <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line130)"></a>                        <font color=Red>|</font> x<font color=Cyan>==</font><font color=Magenta>'\\'</font>   <font color=Red>=</font> haskell <font color=Cyan>(</font>String c<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs+<a name="(line131)"></a>                        <font color=Red>|</font> x<font color=Cyan>==</font>c      <font color=Red>=</font> haskell <font color=Cyan>(</font>String c<font color=Cyan>)</font> <font color=Cyan>(</font>c<font color=Red><b>:</b></font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs+<a name="(line132)"></a>  haskell <font color=Cyan>(</font>String c<font color=Cyan>)</font> acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line133)"></a>                        <font color=Red>|</font> x<font color=Cyan>==</font>c      <font color=Red>=</font> emit <font color=Cyan>(</font>c<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> <font color=Cyan>$</font> haskell Any [] p ls xs+<a name="(line134)"></a>                        <font color=Red>|</font> otherwise <font color=Red>=</font> haskell <font color=Cyan>(</font>String c<font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs+<a name="(line135)"></a>  haskell LineComment acc p ls xs<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> emit acc <font color=Cyan>$</font> haskell Any [] p ls xs+<a name="(line136)"></a>  haskell LineComment acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>      <font color=Red>=</font> haskell LineComment <font color=Cyan>(</font>x<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs+<a name="(line137)"></a>  haskell <font color=Cyan>(</font>NestComment n<font color=Cyan>)</font> acc p ls <font color=Cyan>(</font><font color=Magenta>'{'</font><font color=Red><b>:</b></font><font color=Magenta>'-'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line138)"></a>                                    <font color=Red>=</font> haskell <font color=Cyan>(</font>NestComment <font color=Cyan>(</font>n<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line139)"></a>                                                            <font color=Cyan>(</font><font color=Magenta>"-{"</font><font color=Cyan>++</font>acc<font color=Cyan>)</font> p ls xs+<a name="(line140)"></a>  haskell <font color=Cyan>(</font>NestComment <font color=Magenta>0</font><font color=Cyan>)</font> acc p ls <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'}'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line141)"></a>                                    <font color=Red>=</font> emit <font color=Cyan>(</font><font color=Magenta>"}-"</font><font color=Cyan>++</font>acc<font color=Cyan>)</font> <font color=Cyan>$</font> haskell Any [] p ls xs+<a name="(line142)"></a>  haskell <font color=Cyan>(</font>NestComment n<font color=Cyan>)</font> acc p ls <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'}'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line143)"></a>                                    <font color=Red>=</font> haskell <font color=Cyan>(</font>NestComment <font color=Cyan>(</font>n<font color=Blue>-</font><font color=Magenta>1</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line144)"></a>                                                            <font color=Cyan>(</font><font color=Magenta>"}-"</font><font color=Cyan>++</font>acc<font color=Cyan>)</font> p ls xs+<a name="(line145)"></a>  haskell <font color=Cyan>(</font>NestComment n<font color=Cyan>)</font> acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> haskell <font color=Cyan>(</font>NestComment n<font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font>acc<font color=Cyan>)</font>+<a name="(line146)"></a>                                                                        p ls xs+<a name="(line147)"></a>  haskell CComment acc p ls <font color=Cyan>(</font><font color=Magenta>'*'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> emit <font color=Cyan>(</font><font color=Magenta>"  "</font><font color=Cyan>++</font>acc<font color=Cyan>)</font> <font color=Cyan>$</font>+<a name="(line148)"></a>                                            haskell Any [] p ls xs+<a name="(line149)"></a>  haskell CComment acc p ls <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>        <font color=Red>=</font> haskell CComment <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs+<a name="(line150)"></a>  haskell CLineComment acc p ls xs<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red>=</font> emit acc <font color=Cyan>$</font> haskell Any [] p ls xs+<a name="(line151)"></a>  haskell CLineComment acc p ls <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>    <font color=Red>=</font> haskell CLineComment <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font>acc<font color=Cyan>)</font>+<a name="(line152)"></a>                                                                       p ls xs+<a name="(line153)"></a>  haskell mode acc <font color=Green><u>_</u></font> <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l<font color=Cyan>)</font><font color=Red><b>:</b></font>ls<font color=Cyan>)</font> []        <font color=Red>=</font> haskell mode acc p ls <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>l<font color=Cyan>)</font>+<a name="(line154)"></a>  haskell <font color=Green><u>_</u></font>    acc <font color=Green><u>_</u></font> [] []                <font color=Red>=</font> emit acc <font color=Cyan>$</font> []+<a name="(line155)"></a>+<a name="(line156)"></a>  <font color=Blue>-- rules to lex Cpp</font>+<a name="(line157)"></a>  cpp <font color=Red>::</font> SubMode <font color=Red>-&gt;</font> <font color=Cyan>(</font>SubMode <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> Posn <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>+<a name="(line158)"></a>                     <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> <font color=Red>[</font>WordStyle<font color=Red>]</font><font color=Cyan>)</font>+<a name="(line159)"></a>         <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> Posn <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>+<a name="(line160)"></a>         <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> <font color=Red>[</font>WordStyle<font color=Red>]</font>+<a name="(line161)"></a>  cpp mode next word line pos remaining input <font color=Red>=</font>+<a name="(line162)"></a>    lexcpp mode word line remaining input+<a name="(line163)"></a>   <font color=Green><u>where</u></font>+<a name="(line164)"></a>    lexcpp Any w l ls <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font><font color=Magenta>'*'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>   <font color=Red>=</font> lexcpp <font color=Cyan>(</font>NestComment <font color=Magenta>0</font><font color=Cyan>)</font> <font color=Magenta>""</font> <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs+<a name="(line165)"></a>    lexcpp Any w l ls <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>   <font color=Red>=</font> lexcpp LineComment <font color=Magenta>"  "</font> <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs+<a name="(line166)"></a>    lexcpp Any w l <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l'<font color=Cyan>)</font><font color=Red><b>:</b></font>ls<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>[]<font color=Cyan>)</font>  <font color=Red>=</font> cpp Any next [] <font color=Cyan>(</font><font color=Magenta>"\n"</font><font color=Red><b>:</b></font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> p ls l'+<a name="(line167)"></a>    lexcpp Any w l ls <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> lexcpp Any [] <font color=Cyan>(</font><font color=Magenta>"\n"</font><font color=Red><b>:</b></font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs+<a name="(line168)"></a>    lexcpp Any w l ls xs<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font>    <font color=Red>=</font> Cmd <font color=Cyan>(</font>parseHashDefine ansi+<a name="(line169)"></a>                                                           <font color=Cyan>(</font>reverse <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font><font color=Red><b>:</b></font>+<a name="(line170)"></a>                                       next Any [] pos ls xs+<a name="(line171)"></a> <font color=Blue>-- lexcpp Any w l ls ('"':xs)     = lexcpp (String '"') ['"'] (w*/*l) ls xs</font>+<a name="(line172)"></a> <font color=Blue>-- lexcpp Any w l ls ('\'':xs)    = lexcpp (String '\'') "'"  (w*/*l) ls xs</font>+<a name="(line173)"></a>    lexcpp Any w l ls <font color=Cyan>(</font><font color=Magenta>'"'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>       <font color=Red>=</font> lexcpp Any [] <font color=Cyan>(</font><font color=Magenta>"\""</font><font color=Red><b>:</b></font><font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font><font color=Cyan>)</font> ls xs+<a name="(line174)"></a>    lexcpp Any w l ls <font color=Cyan>(</font><font color=Magenta>'\''</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>      <font color=Red>=</font> lexcpp Any [] <font color=Cyan>(</font><font color=Magenta>"'"</font><font color=Red><b>:</b></font> <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font><font color=Cyan>)</font> ls xs+<a name="(line175)"></a>    lexcpp Any [] l ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line176)"></a>                    <font color=Red>|</font> ident0 x  <font color=Red>=</font> lexcpp <font color=Cyan>(</font>Pred ident1 Ident<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font> l ls xs+<a name="(line177)"></a> <font color=Blue>-- lexcpp Any w l ls (x:xs) | ident0 x  = lexcpp (Pred ident1 Ident) [x] (w*/*l) ls xs</font>+<a name="(line178)"></a>    lexcpp Any w l ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line179)"></a>                    <font color=Red>|</font> single x  <font color=Red>=</font> lexcpp Any [] <font color=Cyan>(</font><font color=Red>[</font>x<font color=Red>]</font><font color=Red><b>:</b></font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs+<a name="(line180)"></a>                    <font color=Red>|</font> space x   <font color=Red>=</font> lexcpp <font color=Cyan>(</font>Pred space other<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font> <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs+<a name="(line181)"></a>                    <font color=Red>|</font> symbol x  <font color=Red>=</font> lexcpp <font color=Cyan>(</font>Pred symbol other<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font> <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs+<a name="(line182)"></a>                    <font color=Red>|</font> otherwise <font color=Red>=</font> lexcpp Any <font color=Cyan>(</font>x<font color=Red><b>:</b></font>w<font color=Cyan>)</font> l ls xs+<a name="(line183)"></a>    lexcpp pre<font color=Red>@</font><font color=Cyan>(</font>Pred pred <font color=Green><u>_</u></font><font color=Cyan>)</font> w l ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line184)"></a>                    <font color=Red>|</font> pred x    <font color=Red>=</font> lexcpp pre <font color=Cyan>(</font>x<font color=Red><b>:</b></font>w<font color=Cyan>)</font> l ls xs+<a name="(line185)"></a>    lexcpp <font color=Cyan>(</font>Pred <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> w l ls xs <font color=Red>=</font> lexcpp Any [] <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs+<a name="(line186)"></a>    lexcpp <font color=Cyan>(</font>String c<font color=Cyan>)</font> w l ls <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line187)"></a>                    <font color=Red>|</font> x<font color=Cyan>==</font><font color=Magenta>'\\'</font>   <font color=Red>=</font> lexcpp <font color=Cyan>(</font>String c<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font> l ls xs+<a name="(line188)"></a>                    <font color=Red>|</font> x<font color=Cyan>==</font>c      <font color=Red>=</font> lexcpp <font color=Cyan>(</font>String c<font color=Cyan>)</font> <font color=Cyan>(</font>c<font color=Red><b>:</b></font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font> l ls xs+<a name="(line189)"></a>    lexcpp <font color=Cyan>(</font>String c<font color=Cyan>)</font> w l ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line190)"></a>                    <font color=Red>|</font> x<font color=Cyan>==</font>c      <font color=Red>=</font> lexcpp Any [] <font color=Cyan>(</font><font color=Cyan>(</font>c<font color=Red><b>:</b></font>w<font color=Cyan>)</font><font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs+<a name="(line191)"></a>                    <font color=Red>|</font> otherwise <font color=Red>=</font> lexcpp <font color=Cyan>(</font>String c<font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font>w<font color=Cyan>)</font> l ls xs+<a name="(line192)"></a>    lexcpp LineComment w l <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l'<font color=Cyan>)</font><font color=Red><b>:</b></font>ls<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>[]<font color=Cyan>)</font>+<a name="(line193)"></a>                             <font color=Red>=</font> cpp LineComment next [] <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font><font color=Cyan>*/*</font>l<font color=Cyan>)</font> pos ls l'+<a name="(line194)"></a>    lexcpp LineComment w l ls <font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line195)"></a>                                <font color=Red>=</font> lexcpp LineComment [] <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font><font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs+<a name="(line196)"></a>    lexcpp LineComment w l ls xs<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> lexcpp Any w l ls xs+<a name="(line197)"></a>    lexcpp LineComment w l ls <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>      <font color=Red>=</font> lexcpp LineComment <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font> l ls xs+<a name="(line198)"></a>    lexcpp <font color=Cyan>(</font>NestComment <font color=Green><u>_</u></font><font color=Cyan>)</font> w l ls <font color=Cyan>(</font><font color=Magenta>'*'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line199)"></a>                                          <font color=Red>=</font> lexcpp Any [] <font color=Cyan>(</font>w<font color=Cyan>*/*</font>l<font color=Cyan>)</font> ls xs+<a name="(line200)"></a>    lexcpp <font color=Cyan>(</font>NestComment n<font color=Cyan>)</font> w l ls <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> lexcpp <font color=Cyan>(</font>NestComment n<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font>w<font color=Cyan>)</font> l+<a name="(line201)"></a>                                                                        ls xs+<a name="(line202)"></a>    lexcpp mode w l <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l'<font color=Cyan>)</font><font color=Red><b>:</b></font>ls<font color=Cyan>)</font> []        <font color=Red>=</font> cpp mode next w l p ls <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>l'<font color=Cyan>)</font>+<a name="(line203)"></a>    lexcpp <font color=Green><u>_</u></font>    <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> []          []        <font color=Red>=</font> []+<a name="(line204)"></a>+<a name="(line205)"></a>    <font color=Blue>-- rules to lex non-Haskell, non-cpp text</font>+<a name="(line206)"></a>  plaintext <font color=Red>::</font> SubMode <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> Posn <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>Posn<font color=Cyan>,</font>String<font color=Cyan>)</font><font color=Red>]</font>+<a name="(line207)"></a>            <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> <font color=Red>[</font>WordStyle<font color=Red>]</font>+<a name="(line208)"></a>  plaintext Any acc p ls <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> emit acc <font color=Cyan>$</font>  <font color=Blue>-- emit "\n" $</font>+<a name="(line209)"></a>                                          cpp Any plaintext [] [] p ls xs+<a name="(line210)"></a>  plaintext Any acc p ls <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font><font color=Magenta>'*'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line211)"></a>                           <font color=Red>|</font> stripComments <font color=Red>=</font> emit acc <font color=Cyan>$</font>+<a name="(line212)"></a>                                             plaintext CComment <font color=Magenta>"  "</font> p ls xs+<a name="(line213)"></a>  plaintext Any acc p ls <font color=Cyan>(</font><font color=Magenta>'/'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line214)"></a>                                <font color=Red>|</font> stripEol <font color=Red>=</font> emit acc <font color=Cyan>$</font>+<a name="(line215)"></a>                                             plaintext CLineComment <font color=Magenta>"  "</font> p ls xs+<a name="(line216)"></a>  plaintext Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> single x <font color=Red>=</font> emit acc <font color=Cyan>$</font> emit <font color=Red>[</font>x<font color=Red>]</font> <font color=Cyan>$</font>+<a name="(line217)"></a>                                             plaintext Any [] p ls xs+<a name="(line218)"></a>  plaintext Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> space x  <font color=Red>=</font> emit acc <font color=Cyan>$</font>+<a name="(line219)"></a>                                             plaintext <font color=Cyan>(</font>Pred space other<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font>+<a name="(line220)"></a>                                                                        p ls xs+<a name="(line221)"></a>  plaintext Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> ident0 x <font color=Red>=</font> emit acc <font color=Cyan>$</font>+<a name="(line222)"></a>                                             plaintext <font color=Cyan>(</font>Pred ident1 Ident<font color=Cyan>)</font> <font color=Red>[</font>x<font color=Red>]</font>+<a name="(line223)"></a>                                                                        p ls xs+<a name="(line224)"></a>  plaintext Any acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>            <font color=Red>=</font> plaintext Any <font color=Cyan>(</font>x<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs+<a name="(line225)"></a>  plaintext pre<font color=Red>@</font><font color=Cyan>(</font>Pred pred ws<font color=Cyan>)</font> acc p ls <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>+<a name="(line226)"></a>                                <font color=Red>|</font> pred x   <font color=Red>=</font> plaintext pre <font color=Cyan>(</font>x<font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs+<a name="(line227)"></a>  plaintext <font color=Cyan>(</font>Pred <font color=Green><u>_</u></font> ws<font color=Cyan>)</font> acc p ls xs        <font color=Red>=</font> ws p <font color=Cyan>(</font>reverse acc<font color=Cyan>)</font><font color=Red><b>:</b></font>+<a name="(line228)"></a>                                             plaintext Any [] p ls xs+<a name="(line229)"></a>  plaintext CComment acc p ls <font color=Cyan>(</font><font color=Magenta>'*'</font><font color=Red><b>:</b></font><font color=Magenta>'/'</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> emit <font color=Cyan>(</font><font color=Magenta>"  "</font><font color=Cyan>++</font>acc<font color=Cyan>)</font> <font color=Cyan>$</font>+<a name="(line230)"></a>                                             plaintext Any [] p ls xs+<a name="(line231)"></a>  plaintext CComment acc p ls <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>    <font color=Red>=</font> plaintext CComment <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font>acc<font color=Cyan>)</font> p ls xs+<a name="(line232)"></a>  plaintext CLineComment acc p ls xs<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font>+<a name="(line233)"></a>                                        <font color=Red>=</font> emit acc <font color=Cyan>$</font> plaintext Any [] p ls xs+<a name="(line234)"></a>  plaintext CLineComment acc p ls <font color=Cyan>(</font><font color=Green><u>_</u></font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font><font color=Red>=</font> plaintext CLineComment <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font>acc<font color=Cyan>)</font>+<a name="(line235)"></a>                                                                       p ls xs+<a name="(line236)"></a>  plaintext mode acc <font color=Green><u>_</u></font> <font color=Cyan>(</font><font color=Cyan>(</font>p<font color=Cyan>,</font>l<font color=Cyan>)</font><font color=Red><b>:</b></font>ls<font color=Cyan>)</font> []    <font color=Red>=</font> plaintext mode acc p ls <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>l<font color=Cyan>)</font>+<a name="(line237)"></a>  plaintext <font color=Green><u>_</u></font>    acc <font color=Green><u>_</u></font> [] []            <font color=Red>=</font> emit acc <font color=Cyan>$</font> []+<a name="(line238)"></a>+<a name="(line239)"></a>  <font color=Blue>-- predicates for lexing Haskell.</font>+<a name="(line240)"></a>  ident0 x <font color=Red>=</font> isAlpha x    <font color=Cyan>||</font> x <font color=Cyan>`elem`</font> <font color=Magenta>"_`"</font>+<a name="(line241)"></a>  ident1 x <font color=Red>=</font> isAlphaNum x <font color=Cyan>||</font> x <font color=Cyan>`elem`</font> <font color=Magenta>"'_`"</font>+<a name="(line242)"></a>  symbol x <font color=Red>=</font> x <font color=Cyan>`elem`</font> <font color=Magenta>":!#$%&amp;*+./&lt;=&gt;?@\\^|-~"</font>+<a name="(line243)"></a>  single x <font color=Red>=</font> x <font color=Cyan>`elem`</font> <font color=Magenta>"(),[];{}"</font>+<a name="(line244)"></a>  space  x <font color=Red>=</font> x <font color=Cyan>`elem`</font> <font color=Magenta>" \t"</font>+<a name="(line245)"></a>  <font color=Blue>-- emit a token (if there is one) from the accumulator</font>+<a name="(line246)"></a>  emit <font color=Magenta>""</font>  <font color=Red>=</font> id+<a name="(line247)"></a>  emit xs  <font color=Red>=</font> <font color=Cyan>(</font>Other <font color=Cyan>(</font>reverse xs<font color=Cyan>)</font><font color=Red><b>:</b></font><font color=Cyan>)</font>+<a name="(line248)"></a>  <font color=Blue>-- add a reversed word to the accumulator</font>+<a name="(line249)"></a>  <font color=Magenta>""</font> <font color=Cyan>*/*</font> l <font color=Red>=</font> l+<a name="(line250)"></a>  w <font color=Cyan>*/*</font> l  <font color=Red>=</font> reverse w <font color=Red><b>:</b></font> l+<a name="(line251)"></a>  <font color=Blue>-- help out broken Haskell compilers which need balanced numbers of C</font>+<a name="(line252)"></a>  <font color=Blue>-- comments in order to do import chasing :-)  -----&gt;   */*</font>+<a name="(line253)"></a>+<a name="(line254)"></a>+<a name="(line255)"></a><a name="parseMacroCall"></a><font color=Blue>-- | Parse a possible macro call, returning argument list and remaining input</font>+<a name="(line256)"></a>parseMacroCall <font color=Red>::</font> Posn <font color=Red>-&gt;</font> <font color=Red>[</font>WordStyle<font color=Red>]</font> <font color=Red>-&gt;</font> Maybe <font color=Cyan>(</font><font color=Red>[</font><font color=Red>[</font>WordStyle<font color=Red>]</font><font color=Red>]</font><font color=Cyan>,</font><font color=Red>[</font>WordStyle<font color=Red>]</font><font color=Cyan>)</font>+<a name="(line257)"></a>parseMacroCall p <font color=Red>=</font> call <font color=Cyan>.</font> skip+<a name="(line258)"></a>  <font color=Green><u>where</u></font>+<a name="(line259)"></a>    skip <font color=Cyan>(</font>Other x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> all isSpace x <font color=Red>=</font> skip xs+<a name="(line260)"></a>    skip xss                          <font color=Red>=</font> xss+<a name="(line261)"></a>    call <font color=Cyan>(</font>Other <font color=Magenta>"("</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>   <font color=Red>=</font> <font color=Cyan>(</font>args <font color=Cyan>(</font><font color=Magenta>0</font><font color=Red>::</font>Int<font color=Cyan>)</font> [] [] <font color=Cyan>.</font> skip<font color=Cyan>)</font> xs+<a name="(line262)"></a>    call <font color=Green><u>_</u></font>                <font color=Red>=</font> Nothing+<a name="(line263)"></a>    args <font color=Magenta>0</font> w acc <font color=Cyan>(</font>   Other <font color=Magenta>")"</font> <font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> Just <font color=Cyan>(</font>reverse <font color=Cyan>(</font>addone w acc<font color=Cyan>)</font><font color=Cyan>,</font> xs<font color=Cyan>)</font>+<a name="(line264)"></a>    args <font color=Magenta>0</font> w acc <font color=Cyan>(</font>   Other <font color=Magenta>","</font> <font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> args <font color=Magenta>0</font>     []   <font color=Cyan>(</font>addone w acc<font color=Cyan>)</font> <font color=Cyan>(</font>skip xs<font color=Cyan>)</font>+<a name="(line265)"></a>    args n w acc <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Other <font color=Magenta>"("</font><font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> args <font color=Cyan>(</font>n<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font>w<font color=Cyan>)</font>         acc    xs+<a name="(line266)"></a>    args n w acc <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Other <font color=Magenta>")"</font><font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> args <font color=Cyan>(</font>n<font color=Blue>-</font><font color=Magenta>1</font><font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red><b>:</b></font>w<font color=Cyan>)</font>         acc    xs+<a name="(line267)"></a>    args n w acc <font color=Cyan>(</font>   Ident <font color=Green><u>_</u></font> v <font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> args n     <font color=Cyan>(</font>Ident p v<font color=Red><b>:</b></font>w<font color=Cyan>)</font> acc    xs+<a name="(line268)"></a>    args n w acc <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Other <font color=Green><u>_</u></font><font color=Cyan>)</font>  <font color=Red><b>:</b></font>xs<font color=Cyan>)</font>  <font color=Red>=</font> args n     <font color=Cyan>(</font>x<font color=Red><b>:</b></font>w<font color=Cyan>)</font>         acc    xs+<a name="(line269)"></a>    args <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font>   <font color=Green><u>_</u></font>                   <font color=Red>=</font> Nothing+<a name="(line270)"></a>    addone w acc <font color=Red>=</font> reverse <font color=Cyan>(</font>skip w<font color=Cyan>)</font><font color=Red><b>:</b></font> acc+<a name="(line271)"></a> </pre>+</html>
docs/cpphs/Language/Preprocessor/Unlit.html view
@@ -1,71 +1,74 @@-<pre><font color=Blue>-- | Part of this code is from "Report on the Programming Language Haskell",</font>-<font color=Blue>--   version 1.2, appendix C.</font>-<font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Unlit <font color=Cyan>(</font>unlit<font color=Cyan>)</font> <font color=Green><u>where</u></font>--<font color=Green><u>import</u></font> Char--<a name="Classified"></a><font color=Green><u>data</u></font> Classified <font color=Red>=</font> Program String <font color=Red>|</font> Blank <font color=Red>|</font> Comment-                <font color=Red>|</font> Include Int String <font color=Red>|</font> Pre String--classify <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font>Classified<font color=Red>]</font>-<a name="classify"></a>classify <font color=Red>[</font><font color=Red>]</font>                <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>-classify <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> x <font color=Cyan>==</font> <font color=Magenta>"begin{code}"</font> <font color=Red>=</font> Blank <font color=Red><b>:</b></font> allProg xs-   <font color=Green><u>where</u></font> allProg <font color=Red>[</font><font color=Red>]</font> <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>  <font color=Blue>-- Should give an error message,</font>-                          <font color=Blue>-- but I have no good position information.</font>-         allProg <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font>  x <font color=Cyan>==</font> <font color=Magenta>"end{code}"</font> <font color=Red>=</font> Blank <font color=Red><b>:</b></font> classify xs-	 allProg <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> Program x<font color=Red><b>:</b></font>allProg xs-classify <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'&gt;'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>      <font color=Red>=</font> Program <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font> <font color=Red><b>:</b></font> classify xs-classify <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>      <font color=Red>=</font> <font color=Cyan>(</font><font color=Green><u>case</u></font> words x <font color=Green><u>of</u></font>-                                <font color=Cyan>(</font>line<font color=Red><b>:</b></font>file<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>|</font> all isDigit line-                                   <font color=Red>-&gt;</font> Include <font color=Cyan>(</font>read line<font color=Cyan>)</font> file-                                <font color=Green><u>_</u></font>  <font color=Red>-&gt;</font> Pre x-                             <font color=Cyan>)</font> <font color=Red><b>:</b></font> classify xs-classify <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> all isSpace x <font color=Red>=</font> Blank<font color=Red><b>:</b></font>classify xs-classify <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>                 <font color=Red>=</font> Comment<font color=Red><b>:</b></font>classify xs--unclassify <font color=Red>::</font> Classified <font color=Red>-&gt;</font> String-<a name="unclassify"></a>unclassify <font color=Cyan>(</font>Program s<font color=Cyan>)</font> <font color=Red>=</font> s-unclassify <font color=Cyan>(</font>Pre s<font color=Cyan>)</font>     <font color=Red>=</font> <font color=Magenta>'#'</font><font color=Red><b>:</b></font>s-unclassify <font color=Cyan>(</font>Include i f<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'#'</font><font color=Red><b>:</b></font><font color=Magenta>' '</font><font color=Red><b>:</b></font>show i <font color=Cyan>++</font> <font color=Magenta>' '</font><font color=Red><b>:</b></font>f-unclassify Blank       <font color=Red>=</font> <font color=Magenta>""</font>-unclassify Comment     <font color=Red>=</font> <font color=Magenta>""</font>--<font color=Blue>-- | 'unlit' takes a filename (for error reports), and transforms the</font>-<font color=Blue>--   given string, to eliminate the literate comments from the program text.</font>-unlit <font color=Red>::</font> FilePath <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> String-<a name="unlit"></a>unlit file lhs <font color=Red>=</font> <font color=Cyan>(</font>unlines-                 <font color=Cyan>.</font> map unclassify-                 <font color=Cyan>.</font> adjacent file <font color=Cyan>(</font><font color=Magenta>0</font><font color=Red>::</font>Int<font color=Cyan>)</font> Blank-                 <font color=Cyan>.</font> classify<font color=Cyan>)</font> <font color=Cyan>(</font>inlines lhs<font color=Cyan>)</font>--adjacent <font color=Red>::</font> FilePath <font color=Red>-&gt;</font> Int <font color=Red>-&gt;</font> Classified <font color=Red>-&gt;</font> <font color=Red>[</font>Classified<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font>Classified<font color=Red>]</font>-<a name="adjacent"></a>adjacent file <font color=Magenta>0</font> <font color=Green><u>_</u></font>             <font color=Cyan>(</font>x              <font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x <font color=Red><b>:</b></font> adjacent file <font color=Magenta>1</font> x xs <font color=Blue>-- force evaluation of line number</font>-adjacent file n y<font color=Red>@</font><font color=Cyan>(</font>Program <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red>@</font>Comment      <font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> error <font color=Cyan>(</font>message file n <font color=Magenta>"program"</font> <font color=Magenta>"comment"</font><font color=Cyan>)</font>-adjacent file n y<font color=Red>@</font><font color=Cyan>(</font>Program <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Include i f<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Red><b>:</b></font> adjacent f    i     y xs-adjacent file n y<font color=Red>@</font><font color=Cyan>(</font>Program <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Pre <font color=Green><u>_</u></font><font color=Cyan>)</font>      <font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Red><b>:</b></font> adjacent file <font color=Cyan>(</font>n<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> y xs-adjacent file n y<font color=Red>@</font>Comment     <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Program <font color=Green><u>_</u></font><font color=Cyan>)</font>  <font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> error <font color=Cyan>(</font>message file n <font color=Magenta>"comment"</font> <font color=Magenta>"program"</font><font color=Cyan>)</font>-adjacent file n y<font color=Red>@</font>Comment     <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Include i f<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Red><b>:</b></font> adjacent f    i     y xs-adjacent file n y<font color=Red>@</font>Comment     <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Pre <font color=Green><u>_</u></font><font color=Cyan>)</font>      <font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Red><b>:</b></font> adjacent file <font color=Cyan>(</font>n<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> y xs-adjacent file n y<font color=Red>@</font>Blank       <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Include i f<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Red><b>:</b></font> adjacent f    i     y xs-adjacent file n y<font color=Red>@</font>Blank       <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Pre <font color=Green><u>_</u></font><font color=Cyan>)</font>      <font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Red><b>:</b></font> adjacent file <font color=Cyan>(</font>n<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> y xs-adjacent file n <font color=Green><u>_</u></font>             <font color=Cyan>(</font>x<font color=Red>@</font>next         <font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Red><b>:</b></font> adjacent file <font color=Cyan>(</font>n<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> x xs-adjacent file n <font color=Green><u>_</u></font>             <font color=Red>[</font><font color=Red>]</font>                   <font color=Red>=</font> <font color=Red>[</font><font color=Red>]</font>--message <font color=Red>::</font> String <font color=Red>-&gt;</font> Int <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> String-<a name="message"></a>message <font color=Magenta>"\"\""</font> n p c <font color=Red>=</font> <font color=Magenta>"Line "</font><font color=Cyan>++</font>show n<font color=Cyan>++</font><font color=Magenta>": "</font><font color=Cyan>++</font>p<font color=Cyan>++</font> <font color=Magenta>" line before "</font><font color=Cyan>++</font>c<font color=Cyan>++</font><font color=Magenta>" line.\n"</font>-message <font color=Red>[</font><font color=Red>]</font>     n p c <font color=Red>=</font> <font color=Magenta>"Line "</font><font color=Cyan>++</font>show n<font color=Cyan>++</font><font color=Magenta>": "</font><font color=Cyan>++</font>p<font color=Cyan>++</font> <font color=Magenta>" line before "</font><font color=Cyan>++</font>c<font color=Cyan>++</font><font color=Magenta>" line.\n"</font>-message file   n p c <font color=Red>=</font> <font color=Magenta>"In file "</font> <font color=Cyan>++</font> file <font color=Cyan>++</font> <font color=Magenta>" at line "</font><font color=Cyan>++</font>show n<font color=Cyan>++</font><font color=Magenta>": "</font><font color=Cyan>++</font>p<font color=Cyan>++</font> <font color=Magenta>" line before "</font><font color=Cyan>++</font>c<font color=Cyan>++</font><font color=Magenta>" line.\n"</font>---<font color=Blue>-- Re-implementation of 'lines', for better efficiency (but decreased laziness).</font>-<font color=Blue>-- Also, importantly, accepts non-standard DOS and Mac line ending characters.</font>-inlines <font color=Red>::</font> String <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font>-<a name="inlines"></a>inlines s <font color=Red>=</font> lines' s id-  <font color=Green><u>where</u></font>-  lines' <font color=Red>[</font><font color=Red>]</font>             acc <font color=Red>=</font> <font color=Red>[</font>acc <font color=Red>[</font><font color=Red>]</font><font color=Red>]</font>-  lines' <font color=Cyan>(</font><font color=Magenta>'\^M'</font><font color=Red><b>:</b></font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> acc <font color=Red>=</font> acc <font color=Red>[</font><font color=Red>]</font> <font color=Red><b>:</b></font> lines' s id	<font color=Blue>-- DOS</font>-  lines' <font color=Cyan>(</font><font color=Magenta>'\^M'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font>      acc <font color=Red>=</font> acc <font color=Red>[</font><font color=Red>]</font> <font color=Red><b>:</b></font> lines' s id	<font color=Blue>-- MacOS</font>-  lines' <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font>       acc <font color=Red>=</font> acc <font color=Red>[</font><font color=Red>]</font> <font color=Red><b>:</b></font> lines' s id	<font color=Blue>-- Unix</font>-  lines' <font color=Cyan>(</font>c<font color=Red><b>:</b></font>s<font color=Cyan>)</font>          acc <font color=Red>=</font> lines' s <font color=Cyan>(</font>acc <font color=Cyan>.</font> <font color=Cyan>(</font>c<font color=Red><b>:</b></font><font color=Cyan>)</font><font color=Cyan>)</font>-+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">+<html>+<pre><a name="(line1)"></a><font color=Blue>-- | Part of this code is from "Report on the Programming Language Haskell",</font>+<a name="(line2)"></a><font color=Blue>--   version 1.2, appendix C.</font>+<a name="(line3)"></a><font color=Green><u>module</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Unlit <font color=Cyan>(</font>unlit<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="(line4)"></a>+<a name="(line5)"></a><font color=Green><u>import</u></font> Char+<a name="(line6)"></a>+<a name="(line7)"></a><a name="Classified"></a><font color=Green><u>data</u></font> Classified <font color=Red>=</font> Program String <font color=Red>|</font> Blank <font color=Red>|</font> Comment+<a name="(line8)"></a>                <font color=Red>|</font> Include Int String <font color=Red>|</font> Pre String+<a name="(line9)"></a>+<a name="(line10)"></a><a name="classify"></a>classify <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font>Classified<font color=Red>]</font>+<a name="(line11)"></a>classify []                <font color=Red>=</font> []+<a name="(line12)"></a>classify <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> x <font color=Cyan>==</font> <font color=Magenta>"begin{code}"</font> <font color=Red>=</font> Blank <font color=Red><b>:</b></font> allProg xs+<a name="(line13)"></a>   <font color=Green><u>where</u></font> allProg [] <font color=Red>=</font> []  <font color=Blue>-- Should give an error message,</font>+<a name="(line14)"></a>                          <font color=Blue>-- but I have no good position information.</font>+<a name="(line15)"></a>         allProg <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'\\'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font>  x <font color=Cyan>==</font> <font color=Magenta>"end{code}"</font> <font color=Red>=</font> Blank <font color=Red><b>:</b></font> classify xs+<a name="(line16)"></a>	 allProg <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> Program x<font color=Red><b>:</b></font>allProg xs+<a name="(line17)"></a>classify <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'&gt;'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>      <font color=Red>=</font> Program <font color=Cyan>(</font><font color=Magenta>' '</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font> <font color=Red><b>:</b></font> classify xs+<a name="(line18)"></a>classify <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'#'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font>      <font color=Red>=</font> <font color=Cyan>(</font><font color=Green><u>case</u></font> words x <font color=Green><u>of</u></font>+<a name="(line19)"></a>                                <font color=Cyan>(</font>line<font color=Red><b>:</b></font>rest<font color=Cyan>)</font> <font color=Red>|</font> all isDigit line+<a name="(line20)"></a>                                   <font color=Red>-&gt;</font> Include <font color=Cyan>(</font>read line<font color=Cyan>)</font> <font color=Cyan>(</font>unwords rest<font color=Cyan>)</font>+<a name="(line21)"></a>                                <font color=Green><u>_</u></font>  <font color=Red>-&gt;</font> Pre x+<a name="(line22)"></a>                             <font color=Cyan>)</font> <font color=Red><b>:</b></font> classify xs+<a name="(line23)"></a>classify <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> all isSpace x <font color=Red>=</font> Blank<font color=Red><b>:</b></font>classify xs+<a name="(line24)"></a>classify <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>                 <font color=Red>=</font> Comment<font color=Red><b>:</b></font>classify xs+<a name="(line25)"></a>+<a name="(line26)"></a><a name="unclassify"></a>unclassify <font color=Red>::</font> Classified <font color=Red>-&gt;</font> String+<a name="(line27)"></a>unclassify <font color=Cyan>(</font>Program s<font color=Cyan>)</font> <font color=Red>=</font> s+<a name="(line28)"></a>unclassify <font color=Cyan>(</font>Pre s<font color=Cyan>)</font>     <font color=Red>=</font> <font color=Magenta>'#'</font><font color=Red><b>:</b></font>s+<a name="(line29)"></a>unclassify <font color=Cyan>(</font>Include i f<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>'#'</font><font color=Red><b>:</b></font><font color=Magenta>' '</font><font color=Red><b>:</b></font>show i <font color=Cyan>++</font> <font color=Magenta>' '</font><font color=Red><b>:</b></font>f+<a name="(line30)"></a>unclassify Blank       <font color=Red>=</font> <font color=Magenta>""</font>+<a name="(line31)"></a>unclassify Comment     <font color=Red>=</font> <font color=Magenta>""</font>+<a name="(line32)"></a>+<a name="(line33)"></a><a name="unlit"></a><font color=Blue>-- | 'unlit' takes a filename (for error reports), and transforms the</font>+<a name="(line34)"></a><font color=Blue>--   given string, to eliminate the literate comments from the program text.</font>+<a name="(line35)"></a>unlit <font color=Red>::</font> FilePath <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> String+<a name="(line36)"></a>unlit file lhs <font color=Red>=</font> <font color=Cyan>(</font>unlines+<a name="(line37)"></a>                 <font color=Cyan>.</font> map unclassify+<a name="(line38)"></a>                 <font color=Cyan>.</font> adjacent file <font color=Cyan>(</font><font color=Magenta>0</font><font color=Red>::</font>Int<font color=Cyan>)</font> Blank+<a name="(line39)"></a>                 <font color=Cyan>.</font> classify<font color=Cyan>)</font> <font color=Cyan>(</font>inlines lhs<font color=Cyan>)</font>+<a name="(line40)"></a>+<a name="(line41)"></a><a name="adjacent"></a>adjacent <font color=Red>::</font> FilePath <font color=Red>-&gt;</font> Int <font color=Red>-&gt;</font> Classified <font color=Red>-&gt;</font> <font color=Red>[</font>Classified<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font>Classified<font color=Red>]</font>+<a name="(line42)"></a>adjacent file <font color=Magenta>0</font> <font color=Green><u>_</u></font>             <font color=Cyan>(</font>x              <font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x <font color=Red><b>:</b></font> adjacent file <font color=Magenta>1</font> x xs <font color=Blue>-- force evaluation of line number</font>+<a name="(line43)"></a>adjacent file n y<font color=Red>@</font><font color=Cyan>(</font>Program <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red>@</font>Comment      <font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> error <font color=Cyan>(</font>message file n <font color=Magenta>"program"</font> <font color=Magenta>"comment"</font><font color=Cyan>)</font>+<a name="(line44)"></a>adjacent file n y<font color=Red>@</font><font color=Cyan>(</font>Program <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Include i f<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Red><b>:</b></font> adjacent f    i     y xs+<a name="(line45)"></a>adjacent file n y<font color=Red>@</font><font color=Cyan>(</font>Program <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Pre <font color=Green><u>_</u></font><font color=Cyan>)</font>      <font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Red><b>:</b></font> adjacent file <font color=Cyan>(</font>n<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> y xs+<a name="(line46)"></a>adjacent file n y<font color=Red>@</font>Comment     <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Program <font color=Green><u>_</u></font><font color=Cyan>)</font>  <font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> error <font color=Cyan>(</font>message file n <font color=Magenta>"comment"</font> <font color=Magenta>"program"</font><font color=Cyan>)</font>+<a name="(line47)"></a>adjacent file n y<font color=Red>@</font>Comment     <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Include i f<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Red><b>:</b></font> adjacent f    i     y xs+<a name="(line48)"></a>adjacent file n y<font color=Red>@</font>Comment     <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Pre <font color=Green><u>_</u></font><font color=Cyan>)</font>      <font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Red><b>:</b></font> adjacent file <font color=Cyan>(</font>n<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> y xs+<a name="(line49)"></a>adjacent file n y<font color=Red>@</font>Blank       <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Include i f<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Red><b>:</b></font> adjacent f    i     y xs+<a name="(line50)"></a>adjacent file n y<font color=Red>@</font>Blank       <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font>Pre <font color=Green><u>_</u></font><font color=Cyan>)</font>      <font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Red><b>:</b></font> adjacent file <font color=Cyan>(</font>n<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> y xs+<a name="(line51)"></a>adjacent file n <font color=Green><u>_</u></font>             <font color=Cyan>(</font>x<font color=Red>@</font>next         <font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x<font color=Red><b>:</b></font> adjacent file <font color=Cyan>(</font>n<font color=Cyan>+</font><font color=Magenta>1</font><font color=Cyan>)</font> x xs+<a name="(line52)"></a>adjacent file n <font color=Green><u>_</u></font>             []                   <font color=Red>=</font> []+<a name="(line53)"></a>+<a name="(line54)"></a><a name="message"></a>message <font color=Red>::</font> String <font color=Red>-&gt;</font> Int <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> String <font color=Red>-&gt;</font> String+<a name="(line55)"></a>message <font color=Magenta>"\"\""</font> n p c <font color=Red>=</font> <font color=Magenta>"Line "</font><font color=Cyan>++</font>show n<font color=Cyan>++</font><font color=Magenta>": "</font><font color=Cyan>++</font>p<font color=Cyan>++</font> <font color=Magenta>" line before "</font><font color=Cyan>++</font>c<font color=Cyan>++</font><font color=Magenta>" line.\n"</font>+<a name="(line56)"></a>message []     n p c <font color=Red>=</font> <font color=Magenta>"Line "</font><font color=Cyan>++</font>show n<font color=Cyan>++</font><font color=Magenta>": "</font><font color=Cyan>++</font>p<font color=Cyan>++</font> <font color=Magenta>" line before "</font><font color=Cyan>++</font>c<font color=Cyan>++</font><font color=Magenta>" line.\n"</font>+<a name="(line57)"></a>message file   n p c <font color=Red>=</font> <font color=Magenta>"In file "</font> <font color=Cyan>++</font> file <font color=Cyan>++</font> <font color=Magenta>" at line "</font><font color=Cyan>++</font>show n<font color=Cyan>++</font><font color=Magenta>": "</font><font color=Cyan>++</font>p<font color=Cyan>++</font> <font color=Magenta>" line before "</font><font color=Cyan>++</font>c<font color=Cyan>++</font><font color=Magenta>" line.\n"</font>+<a name="(line58)"></a>+<a name="(line59)"></a>+<a name="(line60)"></a><a name="inlines"></a><font color=Blue>-- Re-implementation of 'lines', for better efficiency (but decreased laziness).</font>+<a name="(line61)"></a><font color=Blue>-- Also, importantly, accepts non-standard DOS and Mac line ending characters.</font>+<a name="(line62)"></a>inlines <font color=Red>::</font> String <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font>+<a name="(line63)"></a>inlines s <font color=Red>=</font> lines' s id+<a name="(line64)"></a>  <font color=Green><u>where</u></font>+<a name="(line65)"></a>  lines' []             acc <font color=Red>=</font> <font color=Red>[</font>acc []<font color=Red>]</font>+<a name="(line66)"></a>  lines' <font color=Cyan>(</font><font color=Magenta>'\^M'</font><font color=Red><b>:</b></font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> acc <font color=Red>=</font> acc [] <font color=Red><b>:</b></font> lines' s id	<font color=Blue>-- DOS</font>+<a name="(line67)"></a>  lines' <font color=Cyan>(</font><font color=Magenta>'\^M'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font>      acc <font color=Red>=</font> acc [] <font color=Red><b>:</b></font> lines' s id	<font color=Blue>-- MacOS</font>+<a name="(line68)"></a>  lines' <font color=Cyan>(</font><font color=Magenta>'\n'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font>       acc <font color=Red>=</font> acc [] <font color=Red><b>:</b></font> lines' s id	<font color=Blue>-- Unix</font>+<a name="(line69)"></a>  lines' <font color=Cyan>(</font>c<font color=Red><b>:</b></font>s<font color=Cyan>)</font>          acc <font color=Red>=</font> lines' s <font color=Cyan>(</font>acc <font color=Cyan>.</font> <font color=Cyan>(</font>c<font color=Red><b>:</b></font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line70)"></a> </pre>+</html>
docs/cpphs/Text/ParserCombinators/HuttonMeijer.html view
@@ -1,219 +1,222 @@-<pre><font color=Blue>-----------------------------------------------------------------------------</font>-<font color=Blue>-- |</font>-<font color=Blue>-- Module      :  ParseLib</font>-<font color=Blue>-- Copyright   :  ...</font>-<font color=Blue>-- Copyright   :  Graham Hutton (University of Nottingham), Erik Meijer (University of Utrecht)</font>-<font color=Blue>-- </font>-<font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>-<font color=Blue>-- Stability   :  Stable</font>-<font color=Blue>-- Portability :  All</font>-<font color=Blue>--</font>-<font color=Blue>--                  A LIBRARY OF MONADIC PARSER COMBINATORS</font>-<font color=Blue>-- </font>-<font color=Blue>--                               29th July 1996</font>-<font color=Blue>-- </font>-<font color=Blue>--                  Graham Hutton               Erik Meijer</font>-<font color=Blue>--             University of Nottingham    University of Utrecht</font>-<font color=Blue>-- </font>-<font color=Blue>-- This Haskell script defines a library of parser combinators, and is</font>-<font color=Blue>-- taken from sections 1-6 of our article "Monadic Parser Combinators".</font>-<font color=Blue>-- Some changes to the library have been made in the move from Gofer</font>-<font color=Blue>-- to Haskell:</font>-<font color=Blue>-- </font>-<font color=Blue>--    * Do notation is used in place of monad comprehension notation;</font>-<font color=Blue>-- </font>-<font color=Blue>--    * The parser datatype is defined using "newtype", to avoid the overhead</font>-<font color=Blue>--      of tagging and untagging parsers with the P constructor.</font>-<font color=Blue>-----------------------------------------------------------------------------</font>---<font color=Green><u>module</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>HuttonMeijer-   <font color=Cyan>(</font>Parser<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> item<font color=Cyan>,</font> first<font color=Cyan>,</font> papply<font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>+++</font><font color=Cyan>)</font><font color=Cyan>,</font> sat<font color=Cyan>,</font> <font color=Blue>{-tok,-}</font> many<font color=Cyan>,</font> many1<font color=Cyan>,</font>-    sepby<font color=Cyan>,</font> sepby1<font color=Cyan>,</font> chainl<font color=Cyan>,</font>-    chainl1<font color=Cyan>,</font> chainr<font color=Cyan>,</font> chainr1<font color=Cyan>,</font> ops<font color=Cyan>,</font> bracket<font color=Cyan>,</font> char<font color=Cyan>,</font> digit<font color=Cyan>,</font> lower<font color=Cyan>,</font> upper<font color=Cyan>,</font>-    letter<font color=Cyan>,</font> alphanum<font color=Cyan>,</font> string<font color=Cyan>,</font> ident<font color=Cyan>,</font> nat<font color=Cyan>,</font> int<font color=Cyan>,</font> spaces<font color=Cyan>,</font> comment<font color=Cyan>,</font> junk<font color=Cyan>,</font>-    skip<font color=Cyan>,</font> token<font color=Cyan>,</font> natural<font color=Cyan>,</font> integer<font color=Cyan>,</font> symbol<font color=Cyan>,</font> identifier<font color=Cyan>)</font> <font color=Green><u>where</u></font>--<font color=Green><u>import</u></font> Char-<font color=Green><u>import</u></font> Monad--<font color=Green><u>infixr</u></font> <font color=Magenta>5</font> <font color=Cyan>+++</font>--<a name="Token"></a><font color=Green><u>type</u></font> Token <font color=Red>=</font> Char--<font color=Blue>---------------------------------------------------------</font>-<font color=Blue>-- | The parser monad</font>--<font color=Green><u>newtype</u></font> Parser a   <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>[</font>Token<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font><font color=Red>[</font>Token<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>--<font color=Green><u>instance</u></font> Functor Parser <font color=Green><u>where</u></font>-   <font color=Blue>-- map         :: (a -&gt; b) -&gt; (Parser a -&gt; Parser b)</font>-   fmap f <font color=Cyan>(</font>P p<font color=Cyan>)</font>    <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>f v<font color=Cyan>,</font> out<font color=Cyan>)</font> <font color=Red>|</font> <font color=Cyan>(</font>v<font color=Cyan>,</font>out<font color=Cyan>)</font> <font color=Red>&lt;-</font> p inp<font color=Red>]</font><font color=Cyan>)</font>--<font color=Green><u>instance</u></font> Monad Parser <font color=Green><u>where</u></font>-   <font color=Blue>-- return      :: a -&gt; Parser a</font>-   return v        <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>v<font color=Cyan>,</font>inp<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>--   <font color=Blue>-- &gt;&gt;=         :: Parser a -&gt; (a -&gt; Parser b) -&gt; Parser b</font>-   <font color=Cyan>(</font>P p<font color=Cyan>)</font> <font color=Cyan>&gt;&gt;=</font> f     <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> concat <font color=Red>[</font>papply <font color=Cyan>(</font>f v<font color=Cyan>)</font> out <font color=Red>|</font> <font color=Cyan>(</font>v<font color=Cyan>,</font>out<font color=Cyan>)</font> <font color=Red>&lt;-</font> p inp<font color=Red>]</font><font color=Cyan>)</font>--   <font color=Blue>-- fail        :: String -&gt; Parser a</font>-   fail <font color=Green><u>_</u></font>          <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font><font color=Green><u>_</u></font> <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Red>]</font><font color=Cyan>)</font>--<font color=Green><u>instance</u></font> MonadPlus Parser <font color=Green><u>where</u></font>-   <font color=Blue>-- mzero       :: Parser a</font>-   mzero           <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font><font color=Green><u>_</u></font> <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Red>]</font><font color=Cyan>)</font>--   <font color=Blue>-- mplus       :: Parser a -&gt; Parser a -&gt; Parser a</font>-   <font color=Cyan>(</font>P p<font color=Cyan>)</font> <font color=Cyan>`mplus`</font> <font color=Cyan>(</font>P q<font color=Cyan>)</font>  <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> <font color=Cyan>(</font>p inp <font color=Cyan>++</font> q inp<font color=Cyan>)</font><font color=Cyan>)</font>--<font color=Blue>-- ------------------------------------------------------------</font>-<font color=Blue>-- * Other primitive parser combinators</font>-<font color=Blue>-- ------------------------------------------------------------</font>--item               <font color=Red>::</font> Parser Token-<a name="item"></a>item                <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> <font color=Green><u>case</u></font> inp <font color=Green><u>of</u></font>-                                   <font color=Red>[</font><font color=Red>]</font>     <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Red>]</font>-                                   <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>x<font color=Cyan>,</font>xs<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>--first             <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser a-<a name="first"></a>first <font color=Cyan>(</font>P p<font color=Cyan>)</font>        <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> <font color=Green><u>case</u></font> p inp <font color=Green><u>of</u></font>-                                   <font color=Red>[</font><font color=Red>]</font>    <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Red>]</font>-                                   <font color=Cyan>(</font>x<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-&gt;</font> <font color=Red>[</font>x<font color=Red>]</font><font color=Cyan>)</font>--papply            <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> <font color=Red>[</font>Token<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font><font color=Red>[</font>Token<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font>-<a name="papply"></a>papply <font color=Cyan>(</font>P p<font color=Cyan>)</font> inp   <font color=Red>=</font> p inp--<font color=Blue>-- ------------------------------------------------------------</font>-<font color=Blue>-- * Derived combinators</font>-<font color=Blue>-- ------------------------------------------------------------</font>--<a name="+++"></a><font color=Cyan>(</font><font color=Cyan>+++</font><font color=Cyan>)</font>             <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser a <font color=Red>-&gt;</font> Parser a-<a name="p"></a>p <font color=Cyan>+++</font> q            <font color=Red>=</font> first <font color=Cyan>(</font>p <font color=Cyan>`mplus`</font> q<font color=Cyan>)</font>--sat               <font color=Red>::</font> <font color=Cyan>(</font>Token <font color=Red>-&gt;</font> Bool<font color=Cyan>)</font> <font color=Red>-&gt;</font> Parser Token-<a name="sat"></a>sat p              <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> item<font color=Cyan>;</font> <font color=Green><u>if</u></font> p x <font color=Green><u>then</u></font> return x <font color=Green><u>else</u></font> mzero<font color=Cyan>}</font>--<font color=Blue>--tok               :: Token -&gt; Parser Token</font>-<font color=Blue>--tok t              = do {x &lt;- item; if t==snd x then return t else mzero}</font>--many              <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Red>[</font>a<font color=Red>]</font>-<a name="many"></a>many p             <font color=Red>=</font> many1 p <font color=Cyan>+++</font> return <font color=Red>[</font><font color=Red>]</font>-<font color=Blue>--many p           = force (many1 p +++ return [])</font>--many1             <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Red>[</font>a<font color=Red>]</font>-<a name="many1"></a>many1 p            <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> p<font color=Cyan>;</font> xs <font color=Red>&lt;-</font> many p<font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font><font color=Cyan>}</font>--sepby             <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser b <font color=Red>-&gt;</font> Parser <font color=Red>[</font>a<font color=Red>]</font>-<a name="sepby"></a>p <font color=Cyan>`sepby`</font> sep      <font color=Red>=</font> <font color=Cyan>(</font>p <font color=Cyan>`sepby1`</font> sep<font color=Cyan>)</font> <font color=Cyan>+++</font> return <font color=Red>[</font><font color=Red>]</font>--sepby1            <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser b <font color=Red>-&gt;</font> Parser <font color=Red>[</font>a<font color=Red>]</font>-<a name="sepby1"></a>p <font color=Cyan>`sepby1`</font> sep     <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> p<font color=Cyan>;</font> xs <font color=Red>&lt;-</font> many <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Cyan>{</font>sep<font color=Cyan>;</font> p<font color=Cyan>}</font><font color=Cyan>)</font><font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font><font color=Cyan>}</font>--chainl            <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Cyan>(</font>a <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> a<font color=Cyan>)</font> <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> Parser a-<a name="chainl"></a>chainl p op v      <font color=Red>=</font> <font color=Cyan>(</font>p <font color=Cyan>`chainl1`</font> op<font color=Cyan>)</font> <font color=Cyan>+++</font> return v--chainl1           <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Cyan>(</font>a <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> a<font color=Cyan>)</font> <font color=Red>-&gt;</font> Parser a-<a name="chainl1"></a>p <font color=Cyan>`chainl1`</font> op     <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> p<font color=Cyan>;</font> rest x<font color=Cyan>}</font>-                     <font color=Green><u>where</u></font>-                        rest x <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>f <font color=Red>&lt;-</font> op<font color=Cyan>;</font> y <font color=Red>&lt;-</font> p<font color=Cyan>;</font> rest <font color=Cyan>(</font>f x y<font color=Cyan>)</font><font color=Cyan>}</font>-                                 <font color=Cyan>+++</font> return x--chainr            <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Cyan>(</font>a <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> a<font color=Cyan>)</font> <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> Parser a-<a name="chainr"></a>chainr p op v      <font color=Red>=</font> <font color=Cyan>(</font>p <font color=Cyan>`chainr1`</font> op<font color=Cyan>)</font> <font color=Cyan>+++</font> return v--chainr1           <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Cyan>(</font>a <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> a<font color=Cyan>)</font> <font color=Red>-&gt;</font> Parser a-<a name="chainr1"></a>p <font color=Cyan>`chainr1`</font> op     <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> p<font color=Cyan>;</font> rest x<font color=Cyan>}</font>-                     <font color=Green><u>where</u></font>-                        rest x <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>f <font color=Red>&lt;-</font> op<font color=Cyan>;</font> y <font color=Red>&lt;-</font> p <font color=Cyan>`chainr1`</font> op<font color=Cyan>;</font> return <font color=Cyan>(</font>f x y<font color=Cyan>)</font><font color=Cyan>}</font>-                                 <font color=Cyan>+++</font> return x--ops               <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>Parser a<font color=Cyan>,</font> b<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-&gt;</font> Parser b-<a name="ops"></a>ops xs             <font color=Red>=</font> foldr1 <font color=Cyan>(</font><font color=Cyan>+++</font><font color=Cyan>)</font> <font color=Red>[</font><font color=Green><u>do</u></font> <font color=Cyan>{</font>p<font color=Cyan>;</font> return op<font color=Cyan>}</font> <font color=Red>|</font> <font color=Cyan>(</font>p<font color=Cyan>,</font>op<font color=Cyan>)</font> <font color=Red>&lt;-</font> xs<font color=Red>]</font>--bracket           <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser b <font color=Red>-&gt;</font> Parser c <font color=Red>-&gt;</font> Parser b-<a name="bracket"></a>bracket open p close <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>open<font color=Cyan>;</font> x <font color=Red>&lt;-</font> p<font color=Cyan>;</font> close<font color=Cyan>;</font> return x<font color=Cyan>}</font>--<font color=Blue>-- ------------------------------------------------------------</font>-<font color=Blue>-- * Useful parsers</font>-<font color=Blue>-- ------------------------------------------------------------</font>--char              <font color=Red>::</font> Char <font color=Red>-&gt;</font> Parser Char-<a name="char"></a>char x             <font color=Red>=</font> sat <font color=Cyan>(</font><font color=Red>\</font>y <font color=Red>-&gt;</font> x <font color=Cyan>==</font> y<font color=Cyan>)</font>--digit             <font color=Red>::</font> Parser Char-<a name="digit"></a>digit              <font color=Red>=</font> sat isDigit--lower             <font color=Red>::</font> Parser Char-<a name="lower"></a>lower              <font color=Red>=</font> sat isLower--upper             <font color=Red>::</font> Parser Char-<a name="upper"></a>upper              <font color=Red>=</font> sat isUpper--letter            <font color=Red>::</font> Parser Char-<a name="letter"></a>letter             <font color=Red>=</font> sat isAlpha--alphanum          <font color=Red>::</font> Parser Char-<a name="alphanum"></a>alphanum           <font color=Red>=</font> sat isAlphaNum <font color=Cyan>+++</font> char <font color=Magenta>'_'</font>--string            <font color=Red>::</font> String <font color=Red>-&gt;</font> Parser String-<a name="string"></a>string <font color=Magenta>""</font>          <font color=Red>=</font> return <font color=Magenta>""</font>-string <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>      <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>char x<font color=Cyan>;</font> string xs<font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font><font color=Cyan>}</font>--ident             <font color=Red>::</font> Parser String-<a name="ident"></a>ident              <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> lower<font color=Cyan>;</font> xs <font color=Red>&lt;-</font> many alphanum<font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font><font color=Cyan>}</font>--nat               <font color=Red>::</font> Parser Int-<a name="nat"></a>nat                <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> digit<font color=Cyan>;</font> return <font color=Cyan>(</font>fromEnum x <font color=Blue>-</font> fromEnum <font color=Magenta>'0'</font><font color=Cyan>)</font><font color=Cyan>}</font> <font color=Cyan>`chainl1`</font> return op-                     <font color=Green><u>where</u></font>-                        m <font color=Cyan>`op`</font> n <font color=Red>=</font> <font color=Magenta>10</font><font color=Cyan>*</font>m <font color=Cyan>+</font> n--int               <font color=Red>::</font> Parser Int-<a name="int"></a>int                <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>char <font color=Magenta>'-'</font><font color=Cyan>;</font> n <font color=Red>&lt;-</font> nat<font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Blue>-</font>n<font color=Cyan>)</font><font color=Cyan>}</font> <font color=Cyan>+++</font> nat--<font color=Blue>-- ------------------------------------------------------------</font>-<font color=Blue>-- * Lexical combinators</font>-<font color=Blue>-- ------------------------------------------------------------</font>--spaces            <font color=Red>::</font> Parser <font color=Cyan>(</font><font color=Cyan>)</font>-<a name="spaces"></a>spaces             <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>many1 <font color=Cyan>(</font>sat isSpace<font color=Cyan>)</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>)</font><font color=Cyan>}</font>--comment           <font color=Red>::</font> Parser <font color=Cyan>(</font><font color=Cyan>)</font>-<font color=Blue>--comment            = do {string "--"; many (sat (\x -&gt; x /= '\n')); return ()}</font>-<font color=Blue>--comment            = do </font>-<font color=Blue>--                       _ &lt;- string "--"</font>-<font color=Blue>--                       _ &lt;- many (sat (\x -&gt; x /= '\n'))</font>-<font color=Blue>--                       return ()</font>-<a name="comment"></a>comment            <font color=Red>=</font> <font color=Green><u>do</u></font>-                       bracket <font color=Cyan>(</font>string <font color=Magenta>"/*"</font><font color=Cyan>)</font> <font color=Cyan>(</font>many item<font color=Cyan>)</font> <font color=Cyan>(</font>string <font color=Magenta>"*/"</font><font color=Cyan>)</font>-                       return <font color=Cyan>(</font><font color=Cyan>)</font>--junk              <font color=Red>::</font> Parser <font color=Cyan>(</font><font color=Cyan>)</font>-<a name="junk"></a>junk               <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>many <font color=Cyan>(</font>spaces <font color=Cyan>+++</font> comment<font color=Cyan>)</font><font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Cyan>)</font><font color=Cyan>}</font>--skip              <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser a-<a name="skip"></a>skip p             <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>junk<font color=Cyan>;</font> p<font color=Cyan>}</font>--token             <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser a-<a name="token"></a>token p            <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>v <font color=Red>&lt;-</font> p<font color=Cyan>;</font> junk<font color=Cyan>;</font> return v<font color=Cyan>}</font>--<font color=Blue>-- ------------------------------------------------------------</font>-<font color=Blue>-- * Token parsers</font>-<font color=Blue>-- ------------------------------------------------------------</font>--natural           <font color=Red>::</font> Parser Int-<a name="natural"></a>natural            <font color=Red>=</font> token nat--integer           <font color=Red>::</font> Parser Int-<a name="integer"></a>integer            <font color=Red>=</font> token int--symbol            <font color=Red>::</font> String <font color=Red>-&gt;</font> Parser String-<a name="symbol"></a>symbol xs          <font color=Red>=</font> token <font color=Cyan>(</font>string xs<font color=Cyan>)</font>--identifier        <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> Parser String-<a name="identifier"></a>identifier ks      <font color=Red>=</font> token <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> ident<font color=Cyan>;</font>-                                <font color=Green><u>if</u></font> not <font color=Cyan>(</font>elem x ks<font color=Cyan>)</font> <font color=Green><u>then</u></font> return x-                                <font color=Green><u>else</u></font> return mzero<font color=Cyan>}</font><font color=Cyan>)</font>--<font color=Blue>------------------------------------------------------------------------------</font>+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">+<html>+<pre><a name="(line1)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line2)"></a><font color=Blue>-- |</font>+<a name="(line3)"></a><font color=Blue>-- Module      :  ParseLib</font>+<a name="(line4)"></a><font color=Blue>-- Copyright   :  ...</font>+<a name="(line5)"></a><font color=Blue>-- Copyright   :  Graham Hutton (University of Nottingham), Erik Meijer (University of Utrecht)</font>+<a name="(line6)"></a><font color=Blue>-- </font>+<a name="(line7)"></a><font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>+<a name="(line8)"></a><font color=Blue>-- Stability   :  Stable</font>+<a name="(line9)"></a><font color=Blue>-- Portability :  All</font>+<a name="(line10)"></a><font color=Blue>--</font>+<a name="(line11)"></a><font color=Blue>--                  A LIBRARY OF MONADIC PARSER COMBINATORS</font>+<a name="(line12)"></a><font color=Blue>-- </font>+<a name="(line13)"></a><font color=Blue>--                               29th July 1996</font>+<a name="(line14)"></a><font color=Blue>-- </font>+<a name="(line15)"></a><font color=Blue>--                  Graham Hutton               Erik Meijer</font>+<a name="(line16)"></a><font color=Blue>--             University of Nottingham    University of Utrecht</font>+<a name="(line17)"></a><font color=Blue>-- </font>+<a name="(line18)"></a><font color=Blue>-- This Haskell script defines a library of parser combinators, and is</font>+<a name="(line19)"></a><font color=Blue>-- taken from sections 1-6 of our article "Monadic Parser Combinators".</font>+<a name="(line20)"></a><font color=Blue>-- Some changes to the library have been made in the move from Gofer</font>+<a name="(line21)"></a><font color=Blue>-- to Haskell:</font>+<a name="(line22)"></a><font color=Blue>-- </font>+<a name="(line23)"></a><font color=Blue>--    * Do notation is used in place of monad comprehension notation;</font>+<a name="(line24)"></a><font color=Blue>-- </font>+<a name="(line25)"></a><font color=Blue>--    * The parser datatype is defined using "newtype", to avoid the overhead</font>+<a name="(line26)"></a><font color=Blue>--      of tagging and untagging parsers with the P constructor.</font>+<a name="(line27)"></a><font color=Blue>-----------------------------------------------------------------------------</font>+<a name="(line28)"></a>+<a name="(line29)"></a>+<a name="(line30)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>HuttonMeijer+<a name="(line31)"></a>   <font color=Cyan>(</font>Parser<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> item<font color=Cyan>,</font> first<font color=Cyan>,</font> papply<font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>+++</font><font color=Cyan>)</font><font color=Cyan>,</font> sat<font color=Cyan>,</font> <font color=Blue>{-tok,-}</font> many<font color=Cyan>,</font> many1<font color=Cyan>,</font>+<a name="(line32)"></a>    sepby<font color=Cyan>,</font> sepby1<font color=Cyan>,</font> chainl<font color=Cyan>,</font>+<a name="(line33)"></a>    chainl1<font color=Cyan>,</font> chainr<font color=Cyan>,</font> chainr1<font color=Cyan>,</font> ops<font color=Cyan>,</font> bracket<font color=Cyan>,</font> char<font color=Cyan>,</font> digit<font color=Cyan>,</font> lower<font color=Cyan>,</font> upper<font color=Cyan>,</font>+<a name="(line34)"></a>    letter<font color=Cyan>,</font> alphanum<font color=Cyan>,</font> string<font color=Cyan>,</font> ident<font color=Cyan>,</font> nat<font color=Cyan>,</font> int<font color=Cyan>,</font> spaces<font color=Cyan>,</font> comment<font color=Cyan>,</font> junk<font color=Cyan>,</font>+<a name="(line35)"></a>    skip<font color=Cyan>,</font> token<font color=Cyan>,</font> natural<font color=Cyan>,</font> integer<font color=Cyan>,</font> symbol<font color=Cyan>,</font> identifier<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="(line36)"></a>+<a name="(line37)"></a><font color=Green><u>import</u></font> Char+<a name="(line38)"></a><font color=Green><u>import</u></font> Monad+<a name="(line39)"></a>+<a name="(line40)"></a><font color=Green><u>infixr</u></font> <font color=Magenta>5</font> <font color=Cyan>+++</font>+<a name="(line41)"></a>+<a name="(line42)"></a><a name="Token"></a><font color=Green><u>type</u></font> Token <font color=Red>=</font> Char+<a name="(line43)"></a>+<a name="(line44)"></a><font color=Blue>---------------------------------------------------------</font>+<a name="(line45)"></a><font color=Blue>-- | The parser monad</font>+<a name="(line46)"></a>+<a name="(line47)"></a><a name="Parser"></a><font color=Green><u>newtype</u></font> Parser a   <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>[</font>Token<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font><font color=Red>[</font>Token<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="(line48)"></a>+<a name="(line49)"></a><font color=Green><u>instance</u></font> Functor Parser <font color=Green><u>where</u></font>+<a name="(line50)"></a>   <font color=Blue>-- map         :: (a -&gt; b) -&gt; (Parser a -&gt; Parser b)</font>+<a name="(line51)"></a>   fmap f <font color=Cyan>(</font>P p<font color=Cyan>)</font>    <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>f v<font color=Cyan>,</font> out<font color=Cyan>)</font> <font color=Red>|</font> <font color=Cyan>(</font>v<font color=Cyan>,</font>out<font color=Cyan>)</font> <font color=Red>&lt;-</font> p inp<font color=Red>]</font><font color=Cyan>)</font>+<a name="(line52)"></a>+<a name="(line53)"></a><font color=Green><u>instance</u></font> Monad Parser <font color=Green><u>where</u></font>+<a name="(line54)"></a>   <font color=Blue>-- return      :: a -&gt; Parser a</font>+<a name="(line55)"></a>   return v        <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>v<font color=Cyan>,</font>inp<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="(line56)"></a>+<a name="(line57)"></a>   <font color=Blue>-- &gt;&gt;=         :: Parser a -&gt; (a -&gt; Parser b) -&gt; Parser b</font>+<a name="(line58)"></a>   <font color=Cyan>(</font>P p<font color=Cyan>)</font> <font color=Cyan>&gt;&gt;=</font> f     <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> concat <font color=Red>[</font>papply <font color=Cyan>(</font>f v<font color=Cyan>)</font> out <font color=Red>|</font> <font color=Cyan>(</font>v<font color=Cyan>,</font>out<font color=Cyan>)</font> <font color=Red>&lt;-</font> p inp<font color=Red>]</font><font color=Cyan>)</font>+<a name="(line59)"></a>+<a name="(line60)"></a>   <font color=Blue>-- fail        :: String -&gt; Parser a</font>+<a name="(line61)"></a>   fail <font color=Green><u>_</u></font>          <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font><font color=Green><u>_</u></font> <font color=Red>-&gt;</font> []<font color=Cyan>)</font>+<a name="(line62)"></a>+<a name="(line63)"></a><font color=Green><u>instance</u></font> MonadPlus Parser <font color=Green><u>where</u></font>+<a name="(line64)"></a>   <font color=Blue>-- mzero       :: Parser a</font>+<a name="(line65)"></a>   mzero           <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font><font color=Green><u>_</u></font> <font color=Red>-&gt;</font> []<font color=Cyan>)</font>+<a name="(line66)"></a>+<a name="(line67)"></a>   <font color=Blue>-- mplus       :: Parser a -&gt; Parser a -&gt; Parser a</font>+<a name="(line68)"></a>   <font color=Cyan>(</font>P p<font color=Cyan>)</font> <font color=Cyan>`mplus`</font> <font color=Cyan>(</font>P q<font color=Cyan>)</font>  <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> <font color=Cyan>(</font>p inp <font color=Cyan>++</font> q inp<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line69)"></a>+<a name="(line70)"></a><font color=Blue>-- ------------------------------------------------------------</font>+<a name="(line71)"></a><font color=Blue>-- * Other primitive parser combinators</font>+<a name="(line72)"></a><font color=Blue>-- ------------------------------------------------------------</font>+<a name="(line73)"></a>+<a name="(line74)"></a><a name="item"></a>item               <font color=Red>::</font> Parser Token+<a name="(line75)"></a>item                <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> <font color=Green><u>case</u></font> inp <font color=Green><u>of</u></font>+<a name="(line76)"></a>                                   []     <font color=Red>-&gt;</font> []+<a name="(line77)"></a>                                   <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>x<font color=Cyan>,</font>xs<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>+<a name="(line78)"></a>+<a name="(line79)"></a><a name="first"></a>first             <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser a+<a name="(line80)"></a>first <font color=Cyan>(</font>P p<font color=Cyan>)</font>        <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> <font color=Green><u>case</u></font> p inp <font color=Green><u>of</u></font>+<a name="(line81)"></a>                                   []    <font color=Red>-&gt;</font> []+<a name="(line82)"></a>                                   <font color=Cyan>(</font>x<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-&gt;</font> <font color=Red>[</font>x<font color=Red>]</font><font color=Cyan>)</font>+<a name="(line83)"></a>+<a name="(line84)"></a><a name="papply"></a>papply            <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> <font color=Red>[</font>Token<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font><font color=Red>[</font>Token<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font>+<a name="(line85)"></a>papply <font color=Cyan>(</font>P p<font color=Cyan>)</font> inp   <font color=Red>=</font> p inp+<a name="(line86)"></a>+<a name="(line87)"></a><font color=Blue>-- ------------------------------------------------------------</font>+<a name="(line88)"></a><font color=Blue>-- * Derived combinators</font>+<a name="(line89)"></a><font color=Blue>-- ------------------------------------------------------------</font>+<a name="(line90)"></a>+<a name="(line91)"></a><a name="+++"></a><font color=Cyan>(</font><font color=Cyan>+++</font><font color=Cyan>)</font>             <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser a <font color=Red>-&gt;</font> Parser a+<a name="(line92)"></a><a name="p"></a>p <font color=Cyan>+++</font> q            <font color=Red>=</font> first <font color=Cyan>(</font>p <font color=Cyan>`mplus`</font> q<font color=Cyan>)</font>+<a name="(line93)"></a>+<a name="(line94)"></a><a name="sat"></a>sat               <font color=Red>::</font> <font color=Cyan>(</font>Token <font color=Red>-&gt;</font> Bool<font color=Cyan>)</font> <font color=Red>-&gt;</font> Parser Token+<a name="(line95)"></a>sat p              <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> item<font color=Cyan>;</font> <font color=Green><u>if</u></font> p x <font color=Green><u>then</u></font> return x <font color=Green><u>else</u></font> mzero<font color=Cyan>}</font>+<a name="(line96)"></a>+<a name="(line97)"></a><font color=Blue>--tok               :: Token -&gt; Parser Token</font>+<a name="(line98)"></a><font color=Blue>--tok t              = do {x &lt;- item; if t==snd x then return t else mzero}</font>+<a name="(line99)"></a>+<a name="(line100)"></a><a name="many"></a>many              <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Red>[</font>a<font color=Red>]</font>+<a name="(line101)"></a>many p             <font color=Red>=</font> many1 p <font color=Cyan>+++</font> return []+<a name="(line102)"></a><font color=Blue>--many p           = force (many1 p +++ return [])</font>+<a name="(line103)"></a>+<a name="(line104)"></a><a name="many1"></a>many1             <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Red>[</font>a<font color=Red>]</font>+<a name="(line105)"></a>many1 p            <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> p<font color=Cyan>;</font> xs <font color=Red>&lt;-</font> many p<font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font><font color=Cyan>}</font>+<a name="(line106)"></a>+<a name="(line107)"></a><a name="sepby"></a>sepby             <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser b <font color=Red>-&gt;</font> Parser <font color=Red>[</font>a<font color=Red>]</font>+<a name="(line108)"></a><a name="sepby"></a>p <font color=Cyan>`sepby`</font> sep      <font color=Red>=</font> <font color=Cyan>(</font>p <font color=Cyan>`sepby1`</font> sep<font color=Cyan>)</font> <font color=Cyan>+++</font> return []+<a name="(line109)"></a>+<a name="(line110)"></a><a name="sepby1"></a>sepby1            <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser b <font color=Red>-&gt;</font> Parser <font color=Red>[</font>a<font color=Red>]</font>+<a name="(line111)"></a><a name="sepby1"></a>p <font color=Cyan>`sepby1`</font> sep     <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> p<font color=Cyan>;</font> xs <font color=Red>&lt;-</font> many <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Cyan>{</font>sep<font color=Cyan>;</font> p<font color=Cyan>}</font><font color=Cyan>)</font><font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font><font color=Cyan>}</font>+<a name="(line112)"></a>+<a name="(line113)"></a><a name="chainl"></a>chainl            <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Cyan>(</font>a <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> a<font color=Cyan>)</font> <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> Parser a+<a name="(line114)"></a>chainl p op v      <font color=Red>=</font> <font color=Cyan>(</font>p <font color=Cyan>`chainl1`</font> op<font color=Cyan>)</font> <font color=Cyan>+++</font> return v+<a name="(line115)"></a>+<a name="(line116)"></a><a name="chainl1"></a>chainl1           <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Cyan>(</font>a <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> a<font color=Cyan>)</font> <font color=Red>-&gt;</font> Parser a+<a name="(line117)"></a><a name="chainl1"></a>p <font color=Cyan>`chainl1`</font> op     <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> p<font color=Cyan>;</font> rest x<font color=Cyan>}</font>+<a name="(line118)"></a>                     <font color=Green><u>where</u></font>+<a name="(line119)"></a>                        rest x <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>f <font color=Red>&lt;-</font> op<font color=Cyan>;</font> y <font color=Red>&lt;-</font> p<font color=Cyan>;</font> rest <font color=Cyan>(</font>f x y<font color=Cyan>)</font><font color=Cyan>}</font>+<a name="(line120)"></a>                                 <font color=Cyan>+++</font> return x+<a name="(line121)"></a>+<a name="(line122)"></a><a name="chainr"></a>chainr            <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Cyan>(</font>a <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> a<font color=Cyan>)</font> <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> Parser a+<a name="(line123)"></a>chainr p op v      <font color=Red>=</font> <font color=Cyan>(</font>p <font color=Cyan>`chainr1`</font> op<font color=Cyan>)</font> <font color=Cyan>+++</font> return v+<a name="(line124)"></a>+<a name="(line125)"></a><a name="chainr1"></a>chainr1           <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Cyan>(</font>a <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> a<font color=Cyan>)</font> <font color=Red>-&gt;</font> Parser a+<a name="(line126)"></a><a name="chainr1"></a>p <font color=Cyan>`chainr1`</font> op     <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> p<font color=Cyan>;</font> rest x<font color=Cyan>}</font>+<a name="(line127)"></a>                     <font color=Green><u>where</u></font>+<a name="(line128)"></a>                        rest x <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>f <font color=Red>&lt;-</font> op<font color=Cyan>;</font> y <font color=Red>&lt;-</font> p <font color=Cyan>`chainr1`</font> op<font color=Cyan>;</font> return <font color=Cyan>(</font>f x y<font color=Cyan>)</font><font color=Cyan>}</font>+<a name="(line129)"></a>                                 <font color=Cyan>+++</font> return x+<a name="(line130)"></a>+<a name="(line131)"></a><a name="ops"></a>ops               <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>Parser a<font color=Cyan>,</font> b<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-&gt;</font> Parser b+<a name="(line132)"></a>ops xs             <font color=Red>=</font> foldr1 <font color=Cyan>(</font><font color=Cyan>+++</font><font color=Cyan>)</font> <font color=Red>[</font><font color=Green><u>do</u></font> <font color=Cyan>{</font>p<font color=Cyan>;</font> return op<font color=Cyan>}</font> <font color=Red>|</font> <font color=Cyan>(</font>p<font color=Cyan>,</font>op<font color=Cyan>)</font> <font color=Red>&lt;-</font> xs<font color=Red>]</font>+<a name="(line133)"></a>+<a name="(line134)"></a><a name="bracket"></a>bracket           <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser b <font color=Red>-&gt;</font> Parser c <font color=Red>-&gt;</font> Parser b+<a name="(line135)"></a>bracket open p close <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>open<font color=Cyan>;</font> x <font color=Red>&lt;-</font> p<font color=Cyan>;</font> close<font color=Cyan>;</font> return x<font color=Cyan>}</font>+<a name="(line136)"></a>+<a name="(line137)"></a><font color=Blue>-- ------------------------------------------------------------</font>+<a name="(line138)"></a><font color=Blue>-- * Useful parsers</font>+<a name="(line139)"></a><font color=Blue>-- ------------------------------------------------------------</font>+<a name="(line140)"></a>+<a name="(line141)"></a><a name="char"></a>char              <font color=Red>::</font> Char <font color=Red>-&gt;</font> Parser Char+<a name="(line142)"></a>char x             <font color=Red>=</font> sat <font color=Cyan>(</font><font color=Red>\</font>y <font color=Red>-&gt;</font> x <font color=Cyan>==</font> y<font color=Cyan>)</font>+<a name="(line143)"></a>+<a name="(line144)"></a><a name="digit"></a>digit             <font color=Red>::</font> Parser Char+<a name="(line145)"></a>digit              <font color=Red>=</font> sat isDigit+<a name="(line146)"></a>+<a name="(line147)"></a><a name="lower"></a>lower             <font color=Red>::</font> Parser Char+<a name="(line148)"></a>lower              <font color=Red>=</font> sat isLower+<a name="(line149)"></a>+<a name="(line150)"></a><a name="upper"></a>upper             <font color=Red>::</font> Parser Char+<a name="(line151)"></a>upper              <font color=Red>=</font> sat isUpper+<a name="(line152)"></a>+<a name="(line153)"></a><a name="letter"></a>letter            <font color=Red>::</font> Parser Char+<a name="(line154)"></a>letter             <font color=Red>=</font> sat isAlpha+<a name="(line155)"></a>+<a name="(line156)"></a><a name="alphanum"></a>alphanum          <font color=Red>::</font> Parser Char+<a name="(line157)"></a>alphanum           <font color=Red>=</font> sat isAlphaNum <font color=Cyan>+++</font> char <font color=Magenta>'_'</font>+<a name="(line158)"></a>+<a name="(line159)"></a><a name="string"></a>string            <font color=Red>::</font> String <font color=Red>-&gt;</font> Parser String+<a name="(line160)"></a>string <font color=Magenta>""</font>          <font color=Red>=</font> return <font color=Magenta>""</font>+<a name="(line161)"></a>string <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>      <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>char x<font color=Cyan>;</font> string xs<font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font><font color=Cyan>}</font>+<a name="(line162)"></a>+<a name="(line163)"></a><a name="ident"></a>ident             <font color=Red>::</font> Parser String+<a name="(line164)"></a>ident              <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> lower<font color=Cyan>;</font> xs <font color=Red>&lt;-</font> many alphanum<font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font><font color=Cyan>}</font>+<a name="(line165)"></a>+<a name="(line166)"></a><a name="nat"></a>nat               <font color=Red>::</font> Parser Int+<a name="(line167)"></a>nat                <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> digit<font color=Cyan>;</font> return <font color=Cyan>(</font>fromEnum x <font color=Blue>-</font> fromEnum <font color=Magenta>'0'</font><font color=Cyan>)</font><font color=Cyan>}</font> <font color=Cyan>`chainl1`</font> return op+<a name="(line168)"></a>                     <font color=Green><u>where</u></font>+<a name="(line169)"></a>                        m <font color=Cyan>`op`</font> n <font color=Red>=</font> <font color=Magenta>10</font><font color=Cyan>*</font>m <font color=Cyan>+</font> n+<a name="(line170)"></a>+<a name="(line171)"></a><a name="int"></a>int               <font color=Red>::</font> Parser Int+<a name="(line172)"></a>int                <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>char <font color=Magenta>'-'</font><font color=Cyan>;</font> n <font color=Red>&lt;-</font> nat<font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Blue>-</font>n<font color=Cyan>)</font><font color=Cyan>}</font> <font color=Cyan>+++</font> nat+<a name="(line173)"></a>+<a name="(line174)"></a><font color=Blue>-- ------------------------------------------------------------</font>+<a name="(line175)"></a><font color=Blue>-- * Lexical combinators</font>+<a name="(line176)"></a><font color=Blue>-- ------------------------------------------------------------</font>+<a name="(line177)"></a>+<a name="(line178)"></a><a name="spaces"></a>spaces            <font color=Red>::</font> Parser ()+<a name="(line179)"></a>spaces             <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>many1 <font color=Cyan>(</font>sat isSpace<font color=Cyan>)</font><font color=Cyan>;</font> return ()<font color=Cyan>}</font>+<a name="(line180)"></a>+<a name="(line181)"></a><a name="comment"></a>comment           <font color=Red>::</font> Parser ()+<a name="(line182)"></a><font color=Blue>--comment            = do {string "--"; many (sat (\x -&gt; x /= '\n')); return ()}</font>+<a name="(line183)"></a><font color=Blue>--comment            = do </font>+<a name="(line184)"></a><font color=Blue>--                       _ &lt;- string "--"</font>+<a name="(line185)"></a><font color=Blue>--                       _ &lt;- many (sat (\x -&gt; x /= '\n'))</font>+<a name="(line186)"></a><font color=Blue>--                       return ()</font>+<a name="(line187)"></a>comment            <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="(line188)"></a>                       bracket <font color=Cyan>(</font>string <font color=Magenta>"/*"</font><font color=Cyan>)</font> <font color=Cyan>(</font>many item<font color=Cyan>)</font> <font color=Cyan>(</font>string <font color=Magenta>"*/"</font><font color=Cyan>)</font>+<a name="(line189)"></a>                       return ()+<a name="(line190)"></a>+<a name="(line191)"></a><a name="junk"></a>junk              <font color=Red>::</font> Parser ()+<a name="(line192)"></a>junk               <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>many <font color=Cyan>(</font>spaces <font color=Cyan>+++</font> comment<font color=Cyan>)</font><font color=Cyan>;</font> return ()<font color=Cyan>}</font>+<a name="(line193)"></a>+<a name="(line194)"></a><a name="skip"></a>skip              <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser a+<a name="(line195)"></a>skip p             <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>junk<font color=Cyan>;</font> p<font color=Cyan>}</font>+<a name="(line196)"></a>+<a name="(line197)"></a><a name="token"></a>token             <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser a+<a name="(line198)"></a>token p            <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>v <font color=Red>&lt;-</font> p<font color=Cyan>;</font> junk<font color=Cyan>;</font> return v<font color=Cyan>}</font>+<a name="(line199)"></a>+<a name="(line200)"></a><font color=Blue>-- ------------------------------------------------------------</font>+<a name="(line201)"></a><font color=Blue>-- * Token parsers</font>+<a name="(line202)"></a><font color=Blue>-- ------------------------------------------------------------</font>+<a name="(line203)"></a>+<a name="(line204)"></a><a name="natural"></a>natural           <font color=Red>::</font> Parser Int+<a name="(line205)"></a>natural            <font color=Red>=</font> token nat+<a name="(line206)"></a>+<a name="(line207)"></a><a name="integer"></a>integer           <font color=Red>::</font> Parser Int+<a name="(line208)"></a>integer            <font color=Red>=</font> token int+<a name="(line209)"></a>+<a name="(line210)"></a><a name="symbol"></a>symbol            <font color=Red>::</font> String <font color=Red>-&gt;</font> Parser String+<a name="(line211)"></a>symbol xs          <font color=Red>=</font> token <font color=Cyan>(</font>string xs<font color=Cyan>)</font>+<a name="(line212)"></a>+<a name="(line213)"></a><a name="identifier"></a>identifier        <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> Parser String+<a name="(line214)"></a>identifier ks      <font color=Red>=</font> token <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> ident<font color=Cyan>;</font>+<a name="(line215)"></a>                                <font color=Green><u>if</u></font> not <font color=Cyan>(</font>elem x ks<font color=Cyan>)</font> <font color=Green><u>then</u></font> return x+<a name="(line216)"></a>                                <font color=Green><u>else</u></font> return mzero<font color=Cyan>}</font><font color=Cyan>)</font>+<a name="(line217)"></a>+<a name="(line218)"></a><font color=Blue>------------------------------------------------------------------------------</font> </pre>+</html>
docs/cpphs/cpphs.html view
@@ -1,109 +1,113 @@-<pre><font color=Blue>{---- The main program wrapper for cpphs, a simple C pre-processor--- written in Haskell.---- Author: Malcolm Wallace, 2004--- This file is licensed under the GPL.  Note however, that all other--- modules used by it are either distributed under the LGPL, or are Haskell'98.------ Thus, when compiled as a standalone executable, this program will fall--- under the GPL.--}</font>-<font color=Green><u>module</u></font> Main <font color=Green><u>where</u></font>--<font color=Green><u>import</u></font> System <font color=Cyan>(</font> getArgs<font color=Cyan>,</font> getProgName<font color=Cyan>,</font> exitWith<font color=Cyan>,</font> ExitCode<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font> <font color=Cyan>)</font>-<font color=Green><u>import</u></font> Maybe-<font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs <font color=Cyan>(</font> runCpphs<font color=Cyan>,</font> CpphsOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> parseOptions <font color=Cyan>)</font>-<font color=Green><u>import</u></font> IO     <font color=Cyan>(</font> stdout<font color=Cyan>,</font> IOMode<font color=Cyan>(</font>WriteMode<font color=Cyan>)</font><font color=Cyan>,</font> openFile<font color=Cyan>,</font> hPutStr<font color=Cyan>,</font> hFlush<font color=Cyan>,</font> hClose <font color=Cyan>)</font>-<font color=Green><u>import</u></font> Monad  <font color=Cyan>(</font> when <font color=Cyan>)</font>-<font color=Green><u>import</u></font> List   <font color=Cyan>(</font> isPrefixOf <font color=Cyan>)</font>--version <font color=Red>::</font> String-<a name="version"></a>version <font color=Red>=</font> <font color=Magenta>"1.5"</font>--main <font color=Red>::</font> IO <font color=Cyan>(</font><font color=Cyan>)</font>-<a name="main"></a>main <font color=Red>=</font> <font color=Green><u>do</u></font>-  args <font color=Red>&lt;-</font> getArgs-  args <font color=Red>&lt;-</font> return <font color=Cyan>$</font> <font color=Green><u>if</u></font> <font color=Magenta>"--cpp"</font> <font color=Cyan>`elem`</font> args <font color=Green><u>then</u></font> convertArgs args <font color=Green><u>else</u></font> args-  -  prog <font color=Red>&lt;-</font> getProgName-  when <font color=Cyan>(</font><font color=Magenta>"--version"</font> <font color=Cyan>`elem`</font> args<font color=Cyan>)</font>-       <font color=Cyan>(</font><font color=Green><u>do</u></font> putStrLn <font color=Cyan>(</font>prog<font color=Cyan>++</font><font color=Magenta>" "</font><font color=Cyan>++</font>version<font color=Cyan>)</font>-           exitWith ExitSuccess<font color=Cyan>)</font>-  when <font color=Cyan>(</font><font color=Magenta>"--help"</font> <font color=Cyan>`elem`</font> args<font color=Cyan>)</font>-       <font color=Cyan>(</font><font color=Green><u>do</u></font> putStrLn <font color=Cyan>(</font><font color=Magenta>"Usage: "</font><font color=Cyan>++</font>prog-                <font color=Cyan>++</font><font color=Magenta>" [file ...] [ -Dsym | -Dsym=val | -Ipath ]*  [-Ofile]\n"</font>-                <font color=Cyan>++</font><font color=Magenta>"\t\t[--nomacro] [--noline] [--pragma] [--text]\n"</font>-                <font color=Cyan>++</font><font color=Magenta>"\t\t[--strip] [--hashes] [--layout] [--unlit]\n"</font>-                <font color=Cyan>++</font><font color=Magenta>"\t\t[ --cpp std-cpp-options ]"</font><font color=Cyan>)</font>-           exitWith ExitSuccess<font color=Cyan>)</font>--  <font color=Green><u>let</u></font> parsedArgs <font color=Red>=</font> parseOptions args-      options <font color=Red>=</font> fromRight parsedArgs-      ins  <font color=Red>=</font> infiles  options-      outs <font color=Red>=</font> outfiles options-      out <font color=Red>=</font> listToMaybe outs-  -  when <font color=Cyan>(</font>isLeft parsedArgs<font color=Cyan>)</font>-       <font color=Cyan>(</font><font color=Green><u>do</u></font> putStrLn <font color=Cyan>$</font> <font color=Magenta>"Unknown option "</font><font color=Cyan>++</font>fromLeft parsedArgs-                      <font color=Cyan>++</font><font color=Magenta>", for valid options try "</font><font color=Cyan>++</font>prog<font color=Cyan>++</font><font color=Magenta>" --help\n"</font>-           exitWith <font color=Cyan>(</font>ExitFailure <font color=Magenta>1</font><font color=Cyan>)</font><font color=Cyan>)</font>-  when <font color=Cyan>(</font>length outs <font color=Cyan>&gt;</font> <font color=Magenta>1</font><font color=Cyan>)</font>-       <font color=Cyan>(</font><font color=Green><u>do</u></font> putStrLn <font color=Cyan>$</font> <font color=Magenta>"At most one output file (-O) can be specified"</font>-           exitWith <font color=Cyan>(</font>ExitFailure <font color=Magenta>2</font><font color=Cyan>)</font><font color=Cyan>)</font>-  <font color=Green><u>if</u></font> null ins <font color=Green><u>then</u></font> execute options out Nothing-              <font color=Green><u>else</u></font> mapM_ <font color=Cyan>(</font>execute options out<font color=Cyan>)</font> <font color=Cyan>(</font>map Just ins<font color=Cyan>)</font>--<font color=Blue>-- | Execute the preprocessor.</font>-<font color=Blue>--   If the filepath is Nothing then default to stdout\/stdin as appropriate.</font>-execute <font color=Red>::</font> CpphsOptions <font color=Red>-&gt;</font> Maybe FilePath <font color=Red>-&gt;</font> Maybe FilePath <font color=Red>-&gt;</font> IO <font color=Cyan>(</font><font color=Cyan>)</font>-<a name="execute"></a>execute opts ofile infile <font color=Red>=</font>-  <font color=Green><u>let</u></font> <font color=Cyan>(</font>filename<font color=Cyan>,</font> readIt<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>case</u></font> infile <font color=Green><u>of</u></font>-                             Just x  <font color=Red>-&gt;</font> <font color=Cyan>(</font>x<font color=Cyan>,</font>       readFile x<font color=Cyan>)</font>-                             Nothing <font color=Red>-&gt;</font> <font color=Cyan>(</font><font color=Magenta>"stdin"</font><font color=Cyan>,</font> getContents<font color=Cyan>)</font>-      output Nothing x  <font color=Red>=</font> <font color=Green><u>do</u></font> putStr x<font color=Cyan>;</font> hFlush stdout-      output <font color=Cyan>(</font>Just f<font color=Cyan>)</font> x <font color=Red>=</font> writeFile f x-  <font color=Green><u>in</u></font> <font color=Green><u>do</u></font> contents <font color=Red>&lt;-</font> readIt-        output ofile <font color=Cyan>(</font>runCpphs opts filename contents<font color=Cyan>)</font>--<a name="isLeft"></a>isLeft <font color=Cyan>(</font>Left <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True-isLeft <font color=Green><u>_</u></font> <font color=Red>=</font> False--<a name="fromLeft"></a>fromLeft  <font color=Cyan>(</font>Left x<font color=Cyan>)</font>  <font color=Red>=</font> x-<a name="fromRight"></a>fromRight <font color=Cyan>(</font>Right x<font color=Cyan>)</font> <font color=Red>=</font> x--<font color=Blue>-- | Convert commandline options to remain compatible with cpp.</font>-<font color=Blue>--   Based on a shell script cpphs.compat</font>-<a name="ConvertArgs"></a><font color=Green><u>data</u></font> ConvertArgs <font color=Red>=</font> ConvertArgs <font color=Cyan>{</font> traditional<font color=Cyan>,</font> strip <font color=Red>::</font> Bool-                               <font color=Cyan>,</font> infile<font color=Cyan>,</font> outfile    <font color=Red>::</font> String <font color=Cyan>}</font>--convertArgs <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font>-<a name="convertArgs"></a>convertArgs xs <font color=Red>=</font> f <font color=Cyan>(</font>ConvertArgs False True <font color=Magenta>"-"</font> <font color=Magenta>"-"</font><font color=Cyan>)</font> xs-    <font color=Green><u>where</u></font>-        flg <font color=Red>=</font> <font color=Magenta>"DUI"</font>-    -        f e <font color=Cyan>(</font><font color=Red>[</font><font color=Magenta>'-'</font><font color=Cyan>,</font>r<font color=Red>]</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> r <font color=Cyan>`elem`</font> flg <font color=Red>=</font> <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font>r<font color=Red><b>:</b></font>x<font color=Cyan>)</font> <font color=Red><b>:</b></font> f e xs-        f e <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font>r<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> r <font color=Cyan>`elem`</font> flg <font color=Red>=</font> x <font color=Red><b>:</b></font> f e xs-        f e <font color=Cyan>(</font><font color=Magenta>"-o"</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'O'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font> <font color=Red><b>:</b></font> f e xs-        f e <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'o'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'O'</font><font color=Red><b>:</b></font>drop <font color=Magenta>2</font> x<font color=Cyan>)</font> <font color=Red><b>:</b></font> f e xs-        f e <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> <font color=Magenta>"ansi"</font> <font color=Cyan>`isPrefixOf`</font> x <font color=Red>=</font> f e<font color=Cyan>{</font>traditional<font color=Red>=</font>False<font color=Cyan>}</font> xs-                         <font color=Red>|</font> <font color=Magenta>"traditional"</font> <font color=Cyan>`isPrefixOf`</font> x <font color=Red>=</font> f e<font color=Cyan>{</font>traditional<font color=Red>=</font>True<font color=Cyan>}</font> xs-                         <font color=Red>|</font> <font color=Magenta>"std"</font> <font color=Cyan>`isPrefixOf`</font> x <font color=Red>=</font> f e xs <font color=Blue>-- ignore language spec</font>-        f e <font color=Cyan>(</font><font color=Magenta>"-x"</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> f e xs <font color=Blue>-- ignore langauge spec</font>-        f e <font color=Cyan>(</font><font color=Magenta>"-include"</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> x <font color=Red><b>:</b></font> f e xs-        f e <font color=Cyan>(</font><font color=Magenta>"-P"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"--noline"</font> <font color=Red><b>:</b></font> f e xs-        f e <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> x <font color=Cyan>==</font> <font color=Magenta>"-C"</font> <font color=Cyan>||</font> x <font color=Cyan>==</font> <font color=Magenta>"-CC"</font> <font color=Red>=</font> f e<font color=Cyan>{</font>strip<font color=Red>=</font>False<font color=Cyan>}</font> xs-        f e <font color=Cyan>(</font><font color=Magenta>"-A"</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> f e xs <font color=Blue>-- strip assertions</font>-        f e <font color=Cyan>(</font><font color=Magenta>"--help"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"--help"</font> <font color=Red><b>:</b></font> f e xs-        f e <font color=Cyan>(</font><font color=Magenta>"--version"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"--version"</font> <font color=Red><b>:</b></font> f e xs-        f e <font color=Cyan>(</font><font color=Magenta>"-version"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"--version"</font> <font color=Red><b>:</b></font> f e xs-        f e <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> f e xs <font color=Blue>-- strip all other flags</font>-        f e <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> f <font color=Cyan>(</font><font color=Green><u>if</u></font> infile e <font color=Cyan>==</font> <font color=Magenta>"-"</font> <font color=Green><u>then</u></font> e<font color=Cyan>{</font>infile<font color=Red>=</font>x<font color=Cyan>}</font> <font color=Green><u>else</u></font> e<font color=Cyan>{</font>outfile<font color=Red>=</font>x<font color=Cyan>}</font><font color=Cyan>)</font> xs-        -        f e <font color=Red>[</font><font color=Red>]</font> <font color=Red>=</font> <font color=Red>[</font><font color=Magenta>"--hashes"</font> <font color=Red>|</font> not <font color=Cyan>(</font>traditional e<font color=Cyan>)</font><font color=Red>]</font> <font color=Cyan>++</font>-                 <font color=Red>[</font><font color=Magenta>"--strip"</font> <font color=Red>|</font> strip e<font color=Red>]</font> <font color=Cyan>++</font>-                 <font color=Red>[</font>infile e<font color=Red>]</font> <font color=Cyan>++</font>-                 <font color=Red>[</font><font color=Magenta>"-O"</font> <font color=Cyan>++</font> outfile e <font color=Red>|</font> outfile e <font color=Cyan>/=</font> <font color=Magenta>"-"</font><font color=Red>]</font>--+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">+<html>+<pre><a name="(line1)"></a><font color=Blue>{-+<a name="(line2)"></a>-- The main program wrapper for cpphs, a simple C pre-processor+<a name="(line3)"></a>-- written in Haskell.+<a name="(line4)"></a>+<a name="(line5)"></a>-- Author: Malcolm Wallace, 2004+<a name="(line6)"></a>-- This file is licensed under the GPL.  Note however, that all other+<a name="(line7)"></a>-- modules used by it are either distributed under the LGPL, or are Haskell'98.+<a name="(line8)"></a>--+<a name="(line9)"></a>-- Thus, when compiled as a standalone executable, this program will fall+<a name="(line10)"></a>-- under the GPL.+<a name="(line11)"></a>-}</font>+<a name="(line12)"></a><font color=Green><u>module</u></font> Main <font color=Green><u>where</u></font>+<a name="(line13)"></a>+<a name="(line14)"></a><font color=Green><u>import</u></font> System <font color=Cyan>(</font> getArgs<font color=Cyan>,</font> getProgName<font color=Cyan>,</font> exitWith<font color=Cyan>,</font> ExitCode<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font> <font color=Cyan>)</font>+<a name="(line15)"></a><font color=Green><u>import</u></font> Maybe+<a name="(line16)"></a><font color=Green><u>import</u></font> Language<font color=Cyan>.</font>Preprocessor<font color=Cyan>.</font>Cpphs <font color=Cyan>(</font> runCpphs<font color=Cyan>,</font> CpphsOptions<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> parseOptions <font color=Cyan>)</font>+<a name="(line17)"></a><font color=Green><u>import</u></font> IO     <font color=Cyan>(</font> stdout<font color=Cyan>,</font> IOMode<font color=Cyan>(</font>WriteMode<font color=Cyan>)</font><font color=Cyan>,</font> openFile<font color=Cyan>,</font> hPutStr<font color=Cyan>,</font> hFlush<font color=Cyan>,</font> hClose <font color=Cyan>)</font>+<a name="(line18)"></a><font color=Green><u>import</u></font> Monad  <font color=Cyan>(</font> when <font color=Cyan>)</font>+<a name="(line19)"></a><font color=Green><u>import</u></font> List   <font color=Cyan>(</font> isPrefixOf <font color=Cyan>)</font>+<a name="(line20)"></a>+<a name="(line21)"></a><a name="version"></a>version <font color=Red>::</font> String+<a name="(line22)"></a>version <font color=Red>=</font> <font color=Magenta>"1.6"</font>+<a name="(line23)"></a>+<a name="(line24)"></a><a name="main"></a>main <font color=Red>::</font> IO ()+<a name="(line25)"></a>main <font color=Red>=</font> <font color=Green><u>do</u></font>+<a name="(line26)"></a>  args <font color=Red>&lt;-</font> getArgs+<a name="(line27)"></a>  args <font color=Red>&lt;-</font> return <font color=Cyan>$</font> <font color=Green><u>if</u></font> <font color=Magenta>"--cpp"</font> <font color=Cyan>`elem`</font> args <font color=Green><u>then</u></font> convertArgs args <font color=Green><u>else</u></font> args+<a name="(line28)"></a>  +<a name="(line29)"></a>  prog <font color=Red>&lt;-</font> getProgName+<a name="(line30)"></a>  when <font color=Cyan>(</font><font color=Magenta>"--version"</font> <font color=Cyan>`elem`</font> args<font color=Cyan>)</font>+<a name="(line31)"></a>       <font color=Cyan>(</font><font color=Green><u>do</u></font> putStrLn <font color=Cyan>(</font>prog<font color=Cyan>++</font><font color=Magenta>" "</font><font color=Cyan>++</font>version<font color=Cyan>)</font>+<a name="(line32)"></a>           exitWith ExitSuccess<font color=Cyan>)</font>+<a name="(line33)"></a>  when <font color=Cyan>(</font><font color=Magenta>"--help"</font> <font color=Cyan>`elem`</font> args<font color=Cyan>)</font>+<a name="(line34)"></a>       <font color=Cyan>(</font><font color=Green><u>do</u></font> putStrLn <font color=Cyan>(</font><font color=Magenta>"Usage: "</font><font color=Cyan>++</font>prog+<a name="(line35)"></a>              <font color=Cyan>++</font><font color=Magenta>" [file ...] [ -Dsym | -Dsym=val | -Ipath ]*  [-Ofile]\n"</font>+<a name="(line36)"></a>              <font color=Cyan>++</font><font color=Magenta>"\t\t[--nomacro] [--noline] [--pragma] [--text]\n"</font>+<a name="(line37)"></a>              <font color=Cyan>++</font><font color=Magenta>"\t\t[--strip] [--strip-eol] [--hashes] [--layout] [--unlit]\n"</font>+<a name="(line38)"></a>              <font color=Cyan>++</font><font color=Magenta>"\t\t[ --cpp std-cpp-options ] [--include=filename]"</font><font color=Cyan>)</font>+<a name="(line39)"></a>           exitWith ExitSuccess<font color=Cyan>)</font>+<a name="(line40)"></a>+<a name="(line41)"></a>  <font color=Green><u>let</u></font> parsedArgs <font color=Red>=</font> parseOptions args+<a name="(line42)"></a>      options <font color=Red>=</font> fromRight parsedArgs+<a name="(line43)"></a>      ins  <font color=Red>=</font> infiles  options+<a name="(line44)"></a>      outs <font color=Red>=</font> outfiles options+<a name="(line45)"></a>      out <font color=Red>=</font> listToMaybe outs+<a name="(line46)"></a>  +<a name="(line47)"></a>  when <font color=Cyan>(</font>isLeft parsedArgs<font color=Cyan>)</font>+<a name="(line48)"></a>       <font color=Cyan>(</font><font color=Green><u>do</u></font> putStrLn <font color=Cyan>$</font> <font color=Magenta>"Unknown option "</font><font color=Cyan>++</font>fromLeft parsedArgs+<a name="(line49)"></a>                      <font color=Cyan>++</font><font color=Magenta>", for valid options try "</font><font color=Cyan>++</font>prog<font color=Cyan>++</font><font color=Magenta>" --help\n"</font>+<a name="(line50)"></a>           exitWith <font color=Cyan>(</font>ExitFailure <font color=Magenta>1</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line51)"></a>  when <font color=Cyan>(</font>length outs <font color=Cyan>&gt;</font> <font color=Magenta>1</font><font color=Cyan>)</font>+<a name="(line52)"></a>       <font color=Cyan>(</font><font color=Green><u>do</u></font> putStrLn <font color=Cyan>$</font> <font color=Magenta>"At most one output file (-O) can be specified"</font>+<a name="(line53)"></a>           exitWith <font color=Cyan>(</font>ExitFailure <font color=Magenta>2</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="(line54)"></a>  <font color=Green><u>if</u></font> null ins <font color=Green><u>then</u></font> execute options out Nothing+<a name="(line55)"></a>              <font color=Green><u>else</u></font> mapM_ <font color=Cyan>(</font>execute options out<font color=Cyan>)</font> <font color=Cyan>(</font>map Just ins<font color=Cyan>)</font>+<a name="(line56)"></a>+<a name="(line57)"></a><a name="execute"></a><font color=Blue>-- | Execute the preprocessor.</font>+<a name="(line58)"></a><font color=Blue>--   If the filepath is Nothing then default to stdout\/stdin as appropriate.</font>+<a name="(line59)"></a>execute <font color=Red>::</font> CpphsOptions <font color=Red>-&gt;</font> Maybe FilePath <font color=Red>-&gt;</font> Maybe FilePath <font color=Red>-&gt;</font> IO ()+<a name="(line60)"></a>execute opts ofile infile <font color=Red>=</font>+<a name="(line61)"></a>  <font color=Green><u>let</u></font> <font color=Cyan>(</font>filename<font color=Cyan>,</font> readIt<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>case</u></font> infile <font color=Green><u>of</u></font>+<a name="(line62)"></a>                             Just x  <font color=Red>-&gt;</font> <font color=Cyan>(</font>x<font color=Cyan>,</font>       readFile x<font color=Cyan>)</font>+<a name="(line63)"></a>                             Nothing <font color=Red>-&gt;</font> <font color=Cyan>(</font><font color=Magenta>"stdin"</font><font color=Cyan>,</font> getContents<font color=Cyan>)</font>+<a name="(line64)"></a>      output Nothing x  <font color=Red>=</font> <font color=Green><u>do</u></font> putStr x<font color=Cyan>;</font> hFlush stdout+<a name="(line65)"></a>      output <font color=Cyan>(</font>Just f<font color=Cyan>)</font> x <font color=Red>=</font> writeFile f x+<a name="(line66)"></a>  <font color=Green><u>in</u></font> <font color=Green><u>do</u></font> contents <font color=Red>&lt;-</font> readIt+<a name="(line67)"></a>        output ofile <font color=Cyan>(</font>runCpphs opts filename contents<font color=Cyan>)</font>+<a name="(line68)"></a>+<a name="(line69)"></a><a name="isLeft"></a>isLeft <font color=Cyan>(</font>Left <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> True+<a name="(line70)"></a>isLeft <font color=Green><u>_</u></font> <font color=Red>=</font> False+<a name="(line71)"></a>+<a name="(line72)"></a><a name="fromLeft"></a>fromLeft  <font color=Cyan>(</font>Left x<font color=Cyan>)</font>  <font color=Red>=</font> x+<a name="(line73)"></a><a name="fromRight"></a>fromRight <font color=Cyan>(</font>Right x<font color=Cyan>)</font> <font color=Red>=</font> x+<a name="(line74)"></a>+<a name="(line75)"></a><a name="ConvertArgs"></a><font color=Blue>-- | Convert commandline options to remain compatible with cpp.</font>+<a name="(line76)"></a><a name="ConvertArgs"></a><font color=Blue>--   Based on a shell script cpphs.compat</font>+<a name="(line77)"></a><a name="ConvertArgs"></a><font color=Green><u>data</u></font> ConvertArgs <font color=Red>=</font> ConvertArgs <font color=Cyan>{</font> traditional<font color=Cyan>,</font> strip <font color=Red>::</font> Bool+<a name="(line78)"></a>                               <font color=Cyan>,</font> infile<font color=Cyan>,</font> outfile    <font color=Red>::</font> String <font color=Cyan>}</font>+<a name="(line79)"></a>+<a name="(line80)"></a><a name="convertArgs"></a>convertArgs <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font>String<font color=Red>]</font>+<a name="(line81)"></a>convertArgs xs <font color=Red>=</font> f <font color=Cyan>(</font>ConvertArgs False True <font color=Magenta>"-"</font> <font color=Magenta>"-"</font><font color=Cyan>)</font> xs+<a name="(line82)"></a>    <font color=Green><u>where</u></font>+<a name="(line83)"></a>        flg <font color=Red>=</font> <font color=Magenta>"DUI"</font>+<a name="(line84)"></a>    +<a name="(line85)"></a>        f e <font color=Cyan>(</font><font color=Red>[</font><font color=Magenta>'-'</font><font color=Cyan>,</font>r<font color=Red>]</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> r <font color=Cyan>`elem`</font> flg <font color=Red>=</font> <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font>r<font color=Red><b>:</b></font>x<font color=Cyan>)</font> <font color=Red><b>:</b></font> f e xs+<a name="(line86)"></a>        f e <font color=Cyan>(</font>x<font color=Red>@</font><font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font>r<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> r <font color=Cyan>`elem`</font> flg <font color=Red>=</font> x <font color=Red><b>:</b></font> f e xs+<a name="(line87)"></a>        f e <font color=Cyan>(</font><font color=Magenta>"-o"</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'O'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font> <font color=Red><b>:</b></font> f e xs+<a name="(line88)"></a>        f e <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'o'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font><font color=Magenta>'O'</font><font color=Red><b>:</b></font>drop <font color=Magenta>2</font> x<font color=Cyan>)</font> <font color=Red><b>:</b></font> f e xs+<a name="(line89)"></a>        f e <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> <font color=Magenta>"ansi"</font> <font color=Cyan>`isPrefixOf`</font> x <font color=Red>=</font> f e<font color=Cyan>{</font>traditional<font color=Red>=</font>False<font color=Cyan>}</font> xs+<a name="(line90)"></a>                         <font color=Red>|</font> <font color=Magenta>"traditional"</font> <font color=Cyan>`isPrefixOf`</font> x <font color=Red>=</font> f e<font color=Cyan>{</font>traditional<font color=Red>=</font>True<font color=Cyan>}</font> xs+<a name="(line91)"></a>                         <font color=Red>|</font> <font color=Magenta>"std"</font> <font color=Cyan>`isPrefixOf`</font> x <font color=Red>=</font> f e xs <font color=Blue>-- ignore language spec</font>+<a name="(line92)"></a>        f e <font color=Cyan>(</font><font color=Magenta>"-x"</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> f e xs <font color=Blue>-- ignore language spec</font>+<a name="(line93)"></a>        f e <font color=Cyan>(</font><font color=Magenta>"-include"</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font><font color=Magenta>"--include="</font><font color=Cyan>++</font>x<font color=Cyan>)</font> <font color=Red><b>:</b></font> f e xs+<a name="(line94)"></a>        f e <font color=Cyan>(</font><font color=Magenta>"-P"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"--noline"</font> <font color=Red><b>:</b></font> f e xs+<a name="(line95)"></a>        f e <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>|</font> x <font color=Cyan>==</font> <font color=Magenta>"-C"</font> <font color=Cyan>||</font> x <font color=Cyan>==</font> <font color=Magenta>"-CC"</font> <font color=Red>=</font> f e<font color=Cyan>{</font>strip<font color=Red>=</font>False<font color=Cyan>}</font> xs+<a name="(line96)"></a>        f e <font color=Cyan>(</font><font color=Magenta>"-A"</font><font color=Red><b>:</b></font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> f e xs <font color=Blue>-- strip assertions</font>+<a name="(line97)"></a>        f e <font color=Cyan>(</font><font color=Magenta>"--help"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"--help"</font> <font color=Red><b>:</b></font> f e xs+<a name="(line98)"></a>        f e <font color=Cyan>(</font><font color=Magenta>"--version"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"--version"</font> <font color=Red><b>:</b></font> f e xs+<a name="(line99)"></a>        f e <font color=Cyan>(</font><font color=Magenta>"-version"</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Magenta>"--version"</font> <font color=Red><b>:</b></font> f e xs+<a name="(line100)"></a>        f e <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>'-'</font><font color=Red><b>:</b></font>x<font color=Cyan>)</font><font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> f e xs <font color=Blue>-- strip all other flags</font>+<a name="(line101)"></a>        f e <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>=</font> f <font color=Cyan>(</font><font color=Green><u>if</u></font> infile e <font color=Cyan>==</font> <font color=Magenta>"-"</font> <font color=Green><u>then</u></font> e<font color=Cyan>{</font>infile<font color=Red>=</font>x<font color=Cyan>}</font> <font color=Green><u>else</u></font> e<font color=Cyan>{</font>outfile<font color=Red>=</font>x<font color=Cyan>}</font><font color=Cyan>)</font> xs+<a name="(line102)"></a>        +<a name="(line103)"></a>        f e [] <font color=Red>=</font> <font color=Red>[</font><font color=Magenta>"--hashes"</font> <font color=Red>|</font> not <font color=Cyan>(</font>traditional e<font color=Cyan>)</font><font color=Red>]</font> <font color=Cyan>++</font>+<a name="(line104)"></a>                 <font color=Red>[</font><font color=Magenta>"--strip"</font> <font color=Red>|</font> traditional e <font color=Cyan>&amp;&amp;</font> strip e<font color=Red>]</font> <font color=Cyan>++</font>+<a name="(line105)"></a>                 <font color=Red>[</font><font color=Magenta>"--strip-eol"</font> <font color=Red>|</font> not <font color=Cyan>(</font>traditional e<font color=Cyan>)</font> <font color=Cyan>&amp;&amp;</font> strip e<font color=Red>]</font> <font color=Cyan>++</font>+<a name="(line106)"></a>                 <font color=Red>[</font>infile e<font color=Red>]</font> <font color=Cyan>++</font>+<a name="(line107)"></a>                 <font color=Red>[</font><font color=Magenta>"-O"</font> <font color=Cyan>++</font> outfile e <font color=Red>|</font> outfile e <font color=Cyan>/=</font> <font color=Magenta>"-"</font><font color=Red>]</font>+<a name="(line108)"></a>+<a name="(line109)"></a> </pre>+</html>
docs/cpphs/doc-index-P.html view
@@ -221,6 +221,16 @@ >Language.Preprocessor.Cpphs.MacroPass</A ></TD ></TR+><TR+><TD CLASS="indexentry"+>preInclude</TD+><TD CLASS="indexlinks"+><A HREF="Language-Preprocessor-Cpphs-Options.html#v%3ApreInclude"+>Language.Preprocessor.Cpphs.Options</A+>, <A HREF="Language-Preprocessor-Cpphs.html#v%3ApreInclude"+>Language.Preprocessor.Cpphs</A+></TD+></TR ></TABLE ></TD ></TR
docs/cpphs/doc-index-S.html view
@@ -202,25 +202,31 @@ ></TD ></TR ><TR-><TD CLASS="indexentry" COLSPAN="2"+><TD CLASS="indexentry" >strip</TD+><TD CLASS="indexlinks"+><A HREF="Main.html#v%3Astrip"+>Main</A+></TD ></TR ><TR-><TD CLASS="indexannot"->1 (Function)</TD+><TD CLASS="indexentry"+>stripC89</TD ><TD CLASS="indexlinks"-><A HREF="Language-Preprocessor-Cpphs-Options.html#v%3Astrip"+><A HREF="Language-Preprocessor-Cpphs-Options.html#v%3AstripC89" >Language.Preprocessor.Cpphs.Options</A->, <A HREF="Language-Preprocessor-Cpphs.html#v%3Astrip"+>, <A HREF="Language-Preprocessor-Cpphs.html#v%3AstripC89" >Language.Preprocessor.Cpphs</A ></TD ></TR ><TR-><TD CLASS="indexannot"->2 (Function)</TD+><TD CLASS="indexentry"+>stripEol</TD ><TD CLASS="indexlinks"-><A HREF="Main.html#v%3Astrip"->Main</A+><A HREF="Language-Preprocessor-Cpphs-Options.html#v%3AstripEol"+>Language.Preprocessor.Cpphs.Options</A+>, <A HREF="Language-Preprocessor-Cpphs.html#v%3AstripEol"+>Language.Preprocessor.Cpphs</A ></TD ></TR ><TR
docs/index.html view
@@ -113,7 +113,8 @@ <p> <center><pre> Usage: cpphs  [ filename | -Dsym | -Dsym=val | -Ipath ]+  [-Ofile]-              [--nomacro] [--noline] [--nowarn] [--pragma] [--strip]+              [--nomacro] [--noline] [--nowarn] [--pragma]+              [--strip] [--strip-eol]               [--text] [--hashes] [--layout] [--unlit]               [ --cpp compatopts ]        cpphs --version                                             @@ -124,6 +125,13 @@ carry over into the next.)  If no filename is given, cpphs reads from standard input. +<p> <em>Note:</em> if you wish to use cpphs as a replacement for gcc's+cpp in conjunction with the ghc compiler then the extra options you need+to give to ghc are these:+<pre>+  -cpp  -pgmPcpphs  -optP--cpp+</pre>+ <p> Options: <table border=0 align=center>@@ -146,8 +154,11 @@ <tr><td>--pragma</td>     <td>retain #pragma in the output (normally removed)</td></tr> <tr><td>--strip</td>-    <td>convert C-style comments to whitespace, even outside-                      cpp directives</td></tr>+    <td>convert traditional C-style comments (not eol //) to whitespace,+                      even outside cpp directives</td></tr>+<tr><td>--strip-eol</td>+    <td>convert modern C-style comments (including /**/ and //) to whitespace,+                      even outside cpp directives</td></tr> <tr><td>--hashes</td>     <td>recognise the ANSI # stringise operator, and ## for                       token catenation, within macros</td></tr>@@ -180,19 +191,21 @@ <b>Current stable version:</b>  <p>-cpphs-1.5, release date 2007.06.05<br>+cpphs-1.6, release date 2008.10.09<br> By HTTP:-<a href="http://www.cs.york.ac.uk/fp/cpphs/cpphs-1.5.tar.gz">.tar.gz</a>,-<a href="http://www.cs.york.ac.uk/fp/cpphs/cpphs-1.5.zip">.zip</a>.-<a href="http://www.cs.york.ac.uk/fp/cpphs-1.5-win32.zip">Windows binary</a>,+<a href="http://www.cs.york.ac.uk/fp/cpphs/cpphs-1.6.tar.gz">.tar.gz</a>,+<a href="http://www.cs.york.ac.uk/fp/cpphs/cpphs-1.6.zip">.zip</a>. <a href="http://www.haskell.org/fedora/">Fedora package</a>, <a href="http://packages.gentoo.org/packages/?category=dev-haskell;name=cpphs">Gentoo package</a>, <a href="http://www.freshports.org/devel/hs-cpphs/">FreeBSD port</a>, <a href="http://www.openbsd.org/cgi-bin/cvsweb/ports/devel/cpphs/">OpenBSD port</a>. <ul>-<li> Fixed some more obscure corner cases, involving parameterised macro-     expansion within conditionals e.g. #if FOO(BAR,QUUX)-<li> Internal refactoring, affecting parts of the library API.+<li> New option <tt>--include=filename</tt>, compatible with cpp's+     <tt>-include filename</tt>.+<li> New option <tt>--strip-eol</tt> now strips C eol <tt>//</tt> comments+     in addition to <tt>/**/</tt>.+<li> Line pragmas can now have filenames containing spaces.+<li> Bugfix for cpp directives within <tt>{- -}</tt> Haskell comments. </ul>  <p>@@ -207,10 +220,26 @@ <tt>--partial</tt> flag.)  The source tree and version history can be browsed on-line through <a href="http://www.cs.york.ac.uk/fp/darcs/">darcsweb</a>.+What's new, over and above the latest stable release?+<ul>+<li> Nothing since last release.+</ul>  <p> <b>Older versions:</b> <p>+cpphs-1.5, release date 2007.06.05<br>+By HTTP:+<a href="http://www.cs.york.ac.uk/fp/cpphs/cpphs-1.5.tar.gz">.tar.gz</a>,+<a href="http://www.cs.york.ac.uk/fp/cpphs/cpphs-1.5.zip">.zip</a>.+<a href="http://www.cs.york.ac.uk/fp/cpphs-1.5-win32.zip">Windows binary</a>,+<ul>+<li> Fixed some more obscure corner cases, involving parameterised macro+     expansion within conditionals e.g. #if FOO(BAR,QUUX)+<li> Internal refactoring, affecting parts of the library API.+</ul>++<p> cpphs-1.4, release date 2007.04.17<br> By HTTP: <a href="http://www.cs.york.ac.uk/fp/cpphs/cpphs-1.4.tar.gz">.tar.gz</a>,@@ -496,7 +525,7 @@         Malcolm.Wallace@cs.york.ac.uk</a>  </ul> -<p><b>Copyright:</b> &copy; 2004-2007 Malcolm Wallace,+<p><b>Copyright:</b> &copy; 2004-2008 Malcolm Wallace, except for ParseLib (Copyright &copy; 1995 Graham Hutton and Erik Meijer)  <p><b>License:</b> The library modules in cpphs are distributed under
+ tests/comments view
@@ -0,0 +1,3 @@+here is an ordinary C comment:			/* comment here */+and here is a C++-style end-of-line comment:	// comment here+this line has no comments
+ tests/delete-me view
@@ -0,0 +1,6 @@+#line 1 "parens"+++++yes
tests/expect19 view
@@ -2,4 +2,5 @@   + yes
tests/expect31 view
@@ -1,5 +1,6 @@ #line 1 "elif" + import System.IO.Unsafe (unsafePerformIO)  
+ tests/expect44 view
@@ -0,0 +1,4 @@+#line 1 "comments"+here is an ordinary C comment:			                  +and here is a C++-style end-of-line comment:	// comment here+this line has no comments
+ tests/expect44a view
@@ -0,0 +1,4 @@+#line 1 "comments"+here is an ordinary C comment:			                  +and here is a C++-style end-of-line comment:	               +this line has no comments
+ tests/expect45 view
@@ -0,0 +1,8 @@+#line 1 "nestcomment"+{-++foo++++-}
+ tests/expect46 view
@@ -0,0 +1,6 @@+#line 1 "preinclude"+#line 1 "./inclusion"+hello world, this is an inclusion++#line 2 "preinclude"+something arbitrary
+ tests/nestcomment view
@@ -0,0 +1,7 @@+{-+#if 1+foo+#else+bar+#endif+-}
+ tests/preinclude view
@@ -0,0 +1,1 @@+something arbitrary
tests/runtests view
@@ -60,4 +60,8 @@ runtest "$CPPHS --hashes hashjoin" expect41 runtest "$CPPHS wrongline" expect42 runtest "$CPPHS --hashes param" expect43+runtest "$CPPHS --strip comments" expect44+runtest "$CPPHS --strip-eol comments" expect44a+runtest "$CPPHS nestcomment" expect45+runtest "$CPPHS --include=inclusion preinclude" expect46 exit $FAIL