Blame examples/colorizeProgs/ColorizeSourceCode.hs

Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
{- |
Packit 5b08af
   Module     : ColorizeSourceCode
Packit 5b08af
   Copyright  : Copyright (C) 2009 Uwe Schmidt
Packit 5b08af
   License    : BSD3
Packit 5b08af
Packit 5b08af
   Maintainer : Uwe Schmidt (uwe@fh-wedel.de)
Packit 5b08af
   Portability: portable
Packit 5b08af
Packit 5b08af
   Colorize Source Code
Packit 5b08af
Packit 5b08af
   Supports Java and Haskell
Packit 5b08af
Packit 5b08af
-}
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
module Main
Packit 5b08af
where
Packit 5b08af
Packit 5b08af
import Control.Arrow
Packit 5b08af
Packit 5b08af
import Data.List
Packit 5b08af
Packit 5b08af
import System.Environment
Packit 5b08af
import System.IO                        -- import the IO and commandline option stuff
Packit 5b08af
import System.Console.GetOpt
Packit 5b08af
import System.Exit
Packit 5b08af
Packit 5b08af
import Text.Regex.XMLSchema.Generic
Packit 5b08af
import Text.XML.HXT.Core
Packit 5b08af
import Text.XML.HXT.Parser.XhtmlEntities
Packit 5b08af
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
data Process            = P { inFilter    :: String -> String
Packit 5b08af
                            , tokenRE     :: Regex
Packit 5b08af
                            , markupRE    :: Regex -> Regex
Packit 5b08af
                            , formatToken :: (String, String) -> String
Packit 5b08af
                            , formatDoc   :: [String] -> String
Packit 5b08af
                            , outFilter   :: String -> String
Packit 5b08af
                            , input       :: Handle
Packit 5b08af
                            , output      :: Handle
Packit 5b08af
                            , inputFile   :: String
Packit 5b08af
                            }
Packit 5b08af
Packit 5b08af
defaultProcess          :: Process
Packit 5b08af
defaultProcess          = P { inFilter    = id
Packit 5b08af
                            , tokenRE     = plainRE
Packit 5b08af
                            , markupRE    = id
Packit 5b08af
                            , formatToken = uncurry (++)
Packit 5b08af
                            , formatDoc   = unlines
Packit 5b08af
                            , outFilter   = id
Packit 5b08af
                            , input       = stdin
Packit 5b08af
                            , output      = stdout
Packit 5b08af
                            , inputFile   = " "
Packit 5b08af
                            }
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
main                    :: IO ()
Packit 5b08af
main                    = do
Packit 5b08af
                          argv <- getArgs
Packit 5b08af
                          p    <- evalArgs (getOpt Permute options argv)
Packit 5b08af
                          s <- hGetContents (input p)
Packit 5b08af
                          hPutStr (output p) (process p s)
Packit 5b08af
                          hFlush (output p)
Packit 5b08af
                          hClose (output p)
Packit 5b08af
                          exitWith ExitSuccess
Packit 5b08af
Packit 5b08af
options                 :: [OptDescr (String, String)]
Packit 5b08af
options                 = [ Option "h?" ["help"]    (NoArg ("help",    "1"))    "this message"
Packit 5b08af
                          , Option ""   ["plain"]   (NoArg ("plain",   "1"))    "don't colorize lines"
Packit 5b08af
                          , Option ""   ["haskell"] (NoArg ("haskell", "1"))    "colorize haskell"
Packit 5b08af
                          , Option ""   ["java"]    (NoArg ("java",    "1"))    "colorize java"
Packit 5b08af
                          , Option ""   ["cpp"]     (NoArg ("cpp",     "1"))    "colorize C or C++"
Packit 5b08af
                          , Option ""   ["sh"]      (NoArg ("sh",      "1"))    "colorize sh or bash"
Packit 5b08af
                          , Option ""   ["ruby"]    (NoArg ("ruby",    "1"))    "colorize ruby"
Packit 5b08af
                          , Option ""   ["bnf"]     (NoArg ("bnf",     "1"))    "colorize extended BNF grammar rules"
Packit 5b08af
                          , Option ""   ["ppl"]     (NoArg ("ppl",     "1"))    "colorize ppl"
Packit 5b08af
                          , Option ""   ["pplass"]  (NoArg ("pplass",  "1"))    "colorize ppl assembler"
Packit 5b08af
                          , Option "n"  ["number"]  (NoArg ("number",  "1"))    "with line numbers"
Packit 5b08af
                          , Option "t"  ["tabs"]    (NoArg ("tabs",    "1"))    "substitute tabs by blanks"
Packit 5b08af
                          , Option "m"  ["markup"]  (NoArg ("markup",  "1"))    "text contains embedded markup"
Packit 5b08af
                          , Option "e"  ["erefs"]   (NoArg ("erefs",   "1"))    "resolve HTML entity refs before processing"
Packit 5b08af
                          , Option "o"  ["output"]  (ReqArg ((,) "output")      "FILE") "output file, \"-\" stands for stdout"
Packit 5b08af
                          , Option "s"  ["scan"]    (NoArg ("scan",    "1"))    "just scan input, for testing"
Packit 5b08af
                          , Option "x"  ["html"]    (NoArg ("html",    "1"))    "html output"
Packit 5b08af
                          , Option "f"  ["full"]    (NoArg ("full",    "1"))    "full HTML document with header and css"
Packit 5b08af
                          ]
Packit 5b08af
Packit 5b08af
exitErr                 :: String -> IO a
Packit 5b08af
exitErr msg             = do
Packit 5b08af
                          hPutStrLn stderr msg
Packit 5b08af
                          usage
Packit 5b08af
                          exitWith (ExitFailure 1)
Packit 5b08af
Packit 5b08af
evalArgs                :: ([(String, String)], [FilePath], [String]) -> IO Process
Packit 5b08af
evalArgs (opts, files, errs)
Packit 5b08af
    | not (null errs)           = exitErr ("illegal arguments " ++ show errs)
Packit 5b08af
    | null files                = evalOpts opts defaultProcess
Packit 5b08af
    | not (null fns)            = exitErr ("only one input file allowed")
Packit 5b08af
    | otherwise                 = do
Packit 5b08af
                                  inp <- openFile fn ReadMode
Packit 5b08af
                                  evalOpts opts (defaultProcess { input = inp
Packit 5b08af
                                                                , inputFile = fn
Packit 5b08af
                                                                }
Packit 5b08af
                                                )
Packit 5b08af
    where
Packit 5b08af
    (fn:fns)                    = files
Packit 5b08af
Packit 5b08af
evalOpts                        :: [(String, String)] -> Process -> IO Process
Packit 5b08af
evalOpts [] res                 = return res
Packit 5b08af
evalOpts (o:os) res             = do
Packit 5b08af
                                  res' <- evalOpt o res
Packit 5b08af
                                  evalOpts os res'
Packit 5b08af
Packit 5b08af
evalOpt                         :: (String, String) -> Process -> IO Process
Packit 5b08af
evalOpt ("help","1") _          = do
Packit 5b08af
                                  usage
Packit 5b08af
                                  exitWith ExitSuccess
Packit 5b08af
Packit 5b08af
evalOpt ("output", "-") p       = return $ p {output = stdout}
Packit 5b08af
Packit 5b08af
evalOpt ("output", fn)  p       = do
Packit 5b08af
                                  outp <- openFile fn WriteMode
Packit 5b08af
                                  return $ p {output = outp}
Packit 5b08af
Packit 5b08af
evalOpt ("haskell","1") p       = return $ p { tokenRE     = haskellRE }
Packit 5b08af
evalOpt ("java",   "1") p       = return $ p { tokenRE     = javaRE    }
Packit 5b08af
evalOpt ("cpp",    "1") p       = return $ p { tokenRE     = cppRE     }
Packit 5b08af
evalOpt ("sh",     "1") p       = return $ p { tokenRE     = shRE      }
Packit 5b08af
evalOpt ("ruby",   "1") p       = return $ p { tokenRE     = rubyRE    }
Packit 5b08af
evalOpt ("bnf",    "1") p       = return $ p { tokenRE     = bnfRE     }
Packit 5b08af
evalOpt ("ppl",    "1") p       = return $ p { tokenRE     = pplRE     }
Packit 5b08af
evalOpt ("pplass", "1") p       = return $ p { tokenRE     = pplassRE  }
Packit 5b08af
evalOpt ("plain",  "1") p       = return $ p { tokenRE     = plainRE   }
Packit 5b08af
evalOpt ("scan",   "1") p       = return $ p { tokenRE     = plainRE
Packit 5b08af
                                             , formatToken = uncurry formatTok
Packit 5b08af
                                             , formatDoc   = formatHList                        }
Packit 5b08af
evalOpt ("number", "1") p       = return $ p { formatDoc   = numberLines >>> formatDoc p        }
Packit 5b08af
evalOpt ("tabs",   "1") p       = return $ p { inFilter    = inFilter p >>> substTabs           }
Packit 5b08af
evalOpt ("erefs",  "1") p       = return $ p { inFilter    = resolveHtmlEntities >>> inFilter p }
Packit 5b08af
evalOpt ("markup", "1") p       = return $ p { markupRE    = addMarkup                          }
Packit 5b08af
evalOpt ("html",   "1") p       = return $ p { formatToken = formatHtmlTok
Packit 5b08af
                                             , formatDoc   = formatHtmlDoc                      }
Packit 5b08af
evalOpt ("full",   "1") p       = return $ p { outFilter   = outFilter p >>> fullHtml (inputFile p)     }
Packit 5b08af
evalOpt (opt,      _v ) p       = exitErr ("illegal option " ++ show opt) >> return p
Packit 5b08af
Packit 5b08af
usage                   :: IO ()
Packit 5b08af
usage                   = hPutStrLn stderr use
Packit 5b08af
                          where
Packit 5b08af
                          use = usageInfo header options
Packit 5b08af
                          header = "colorizeSourceCode - colorize source code with HTML, version 0.1.1"
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
process         :: Process -> String -> String
Packit 5b08af
process p       = inFilter p
Packit 5b08af
                  >>> tokenizeSubexRE (markupRE p (tokenRE p))
Packit 5b08af
                  >>> map (formatToken p)
Packit 5b08af
                  >>> concat
Packit 5b08af
                  >>> lines
Packit 5b08af
                  >>> formatDoc p
Packit 5b08af
                  >>> outFilter p
Packit 5b08af
Packit 5b08af
addMarkup       :: Regex -> Regex
Packit 5b08af
addMarkup       = mkElse (parseRegexExt . mkLE $ markupT)
Packit 5b08af
Packit 5b08af
tokenizeLines   :: String -> [(String, String)]
Packit 5b08af
tokenizeLines   = map (\ l -> ("",l ++ "\n")) . lines
Packit 5b08af
Packit 5b08af
numberLines     :: [String] -> [String]
Packit 5b08af
numberLines     = zipWith addNum [(1::Int)..]
Packit 5b08af
                  where
Packit 5b08af
                  addNum i l = "" ++ fmt 4 i ++ "" ++ l
Packit 5b08af
                  fmt l = sed (const " ") " "
Packit 5b08af
                          . reverse
Packit 5b08af
                          . take l
Packit 5b08af
                          . reverse
Packit 5b08af
                          . (replicate l ' ' ++)
Packit 5b08af
                          . show
Packit 5b08af
Packit 5b08af
substTabs       :: String -> String
Packit 5b08af
substTabs       = subs 0
Packit 5b08af
Packit 5b08af
subs            :: Int -> String -> String
Packit 5b08af
subs _ ""       = ""
Packit 5b08af
subs i (x:xs)
Packit 5b08af
    | x == '\t' = replicate (8 - (i `mod` 8)) ' ' ++ subs 0 xs
Packit 5b08af
    | x == '\n' = x : subs 0 xs
Packit 5b08af
    | otherwise = x : subs (i+1) xs
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
resolveHtmlEntities     :: String -> String
Packit 5b08af
resolveHtmlEntities     = sed (replaceEntity . drop 1 . init) "&\\i\\c*;"
Packit 5b08af
                          where
Packit 5b08af
                          replaceEntity e = maybe ("&" ++ e ++ ";") ((:[]) . toEnum)
Packit 5b08af
                                            . lookup e $ xhtmlEntities
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
formatHList     :: [String] -> String
Packit 5b08af
formatHList     = ("[" ++) . (++ "\n]") . intercalate "\n, "
Packit 5b08af
Packit 5b08af
formatTok       :: String -> String -> String
Packit 5b08af
formatTok kw tok = " (" ++ show kw ++ ",\t" ++ show tok ++ "\t)\n"
Packit 5b08af
Packit 5b08af
formatHtmlDoc   :: [String] -> String
Packit 5b08af
formatHtmlDoc   = map (("
" ++) . (++ "
") . preserveEmptyLines)
Packit 5b08af
                  >>> ("
" :)
Packit 5b08af
                  >>> (++ [""])
Packit 5b08af
                  >>> unlines
Packit 5b08af
                  where
Packit 5b08af
                  preserveEmptyLines "" = " "
Packit 5b08af
                  preserveEmptyLines l  = l
Packit 5b08af
Packit 5b08af
formatHtmlTok   :: (String, String) -> String
Packit 5b08af
formatHtmlTok ("markup", t@(x:_))
Packit 5b08af
    | x `elem` "<&"     = t
Packit 5b08af
formatHtmlTok (m, t)
Packit 5b08af
    | otherwise         = colorizeTokens m (escapeText >>> sed (const " ") " " $ t)
Packit 5b08af
Packit 5b08af
escapeText      :: String -> String
Packit 5b08af
escapeText      = foldr cquote ""
Packit 5b08af
    where
Packit 5b08af
      cquote    = fst escapeHtmlRefs
Packit 5b08af
Packit 5b08af
-- escapeText      = concat . runLA (xshowEscapeXml mkText)
Packit 5b08af
Packit 5b08af
Packit 5b08af
fullHtml        :: String -> String -> String
Packit 5b08af
fullHtml fn s   = unlines
Packit 5b08af
                  [ "<html>"
Packit 5b08af
                  , "<head>"
Packit 5b08af
                  , "<title>" ++ fn ++ "</title>"
Packit 5b08af
                  , "<style>"
Packit 5b08af
                  , css
Packit 5b08af
                  , "</style>"
Packit 5b08af
                  , "</head>"
Packit 5b08af
                  , "<body>"
Packit 5b08af
                  , s
Packit 5b08af
                  , "</body>"
Packit 5b08af
                  , "</html>"
Packit 5b08af
                  ]
Packit 5b08af
Packit 5b08af
css             :: String
Packit 5b08af
css             = unlines
Packit 5b08af
                  [ ".typename          { color: #0000dd; }"
Packit 5b08af
                  , ".varname           { color: #000000; }"
Packit 5b08af
                  , ".opname            { color: #770000; }"
Packit 5b08af
                  , ".operator          { color: #770000; /* font-weight:bold; */ }"
Packit 5b08af
                  , ".keyglyph          { color: #3070A0; /* font-weight:bold; */ }"
Packit 5b08af
                  , ".par               {  }"
Packit 5b08af
                  , ""
Packit 5b08af
                  , ".keyword           { color: #3070A0; /* font-weight:bold; */ }"
Packit 5b08af
                  , ".typekeyword       { color: #3070A0; /* font-weight:bold; */ }"
Packit 5b08af
                  , ".strconst          { color: #228B22; }"
Packit 5b08af
                  , ".charconst         { color: #228B22; }"
Packit 5b08af
                  , ".labelname         { color: #FF00FF; font-weight:bold; }"
Packit 5b08af
                  , ".cppcommand        { color: #0000CD; }"
Packit 5b08af
                  , ".specialword       { color: #c80000; }"
Packit 5b08af
                  , ".classname         { color: #8B2323; }"
Packit 5b08af
                  , ".comment           { color: #00008B; }"
Packit 5b08af
                  , ".bnfnt             { color: #0000CD; }"
Packit 5b08af
                  , ".bnfmeta           { color: #ff0000; font-weight:bold; }"
Packit 5b08af
                  , ".bnfterminal       { color: #008800; font-weight:bold; }"
Packit 5b08af
                  , ".tclproc           { color: #FF6000; }"
Packit 5b08af
                  , ".tclvar            { color: #0000CD; }"
Packit 5b08af
                  , ".tclcomment        { color: #c80000; }"
Packit 5b08af
                  , ""
Packit 5b08af
                  , ".linenr            { color: #909090; padding-right: 2em; }"
Packit 5b08af
                  , "div.codeline       { font-family: monospace; width: 100%; white-space: pre; border-width: 1px; border-style: solid; border-color: transparent; padding-left: 0.3em; }"
Packit 5b08af
                  , "div.codeline:hover { background-color:#ddddff; color:#c80000; border-width: 1px; border-style: solid; border-color: #c80000; }"
Packit 5b08af
Packit 5b08af
                  ]
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
colorizeTokens  :: String -> String -> String
Packit 5b08af
colorizeTokens tok
Packit 5b08af
    | tok `elem` [ "comment"
Packit 5b08af
                 , "keyword"
Packit 5b08af
                 , "keyglyph"
Packit 5b08af
                 , "typekeyword"
Packit 5b08af
                 , "varname", "typename", "labelname", "instancename", "globalname"
Packit 5b08af
                 , "opname"
Packit 5b08af
                 , "par"
Packit 5b08af
                 , "operator"
Packit 5b08af
                 , "strconst", "charconst"
Packit 5b08af
                 , "bnfnt", "bnfmeta"
Packit 5b08af
                 , "cppcommand"
Packit 5b08af
                 , "specialword"
Packit 5b08af
                 ]
Packit 5b08af
                                = wrap
Packit 5b08af
    | tok == "longcomment"      = wrap' "comment" . mlc
Packit 5b08af
    | tok == "bnfterminal"      = wrap . drop 1 . init
Packit 5b08af
    -- | tok == "markupstart"   = (("")) . drop 4 . init
Packit 5b08af
    -- | tok == "markupend"        = const ""
Packit 5b08af
    | null tok                  = const ""
Packit 5b08af
    | otherwise                 = id
Packit 5b08af
    where
Packit 5b08af
    wrap       = wrap' tok
Packit 5b08af
    wrap' tok' = (("") ++) . (++ "")
Packit 5b08af
    mlc        = sed (("" ++) . (++ "")) "(\\n\r?)"
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
buildRegex              :: [(String, String)] -> Regex
Packit 5b08af
buildRegex              = foldr1 mkElse . map (uncurry mkBr') . map (second parseRegexExt)
Packit 5b08af
                          where
Packit 5b08af
                          mkBr' ""      = id
Packit 5b08af
                          mkBr' l       = mkBr l
Packit 5b08af
Packit 5b08af
Packit 5b08af
buildKeywords           :: [String] -> String
Packit 5b08af
buildKeywords           = intercalate "|"
Packit 5b08af
Packit 5b08af
untilRE                 :: String -> String
Packit 5b08af
untilRE re              = "(\\A{" ++ "\\}\\A" ++ re ++ "\\A)" ++ re
Packit 5b08af
Packit 5b08af
mkLE                    :: (String, String) -> String
Packit 5b08af
mkLE (l, re)            = "({" ++ l ++ "}(" ++ re ++ "))"
Packit 5b08af
Packit 5b08af
ws1RE, ws1RE',ws0RE     :: String
Packit 5b08af
ws1RE                   = "\\s+"
Packit 5b08af
ws1RE'                  = "[ \t]+"
Packit 5b08af
ws0RE                   = "[ \t]*"
Packit 5b08af
Packit 5b08af
ws, ws', javacmt1, javacmt, shcmt1, strconst,
Packit 5b08af
  markupT,
Packit 5b08af
  charconst, number,
Packit 5b08af
  par, xxx              :: (String, String)
Packit 5b08af
Packit 5b08af
-- markupS                      = ("markupstart",       "<[a-zA-Z0-9]+>"        )
Packit 5b08af
-- markupE                      = ("markupend",         "</[a-zA-Z0-9]+>"       )
Packit 5b08af
markupT                 = ("markup",            ( "</?" ++ xname ++ "(" ++ xattr ++ ")*" ++ "\\s*>"
Packit 5b08af
                                                  ++ "|" ++
Packit 5b08af
                                                  "&" ++ xname ++ ";"
Packit 5b08af
                                                )
Packit 5b08af
                          )
Packit 5b08af
                          where
Packit 5b08af
                          xname = "[A-Za-z][-_:A-Za-z0-9]*"
Packit 5b08af
                          xattr = ws1RE ++ xname ++ eq ++ "(" ++ dq ++ "|" ++ sq ++ ")"
Packit 5b08af
                          eq    = "\\s*=\\s*"
Packit 5b08af
                          dq    = "\"[^\"]*\""
Packit 5b08af
                          sq    = "\'[^\']*\'"
Packit 5b08af
Packit 5b08af
ws                      = ("ws",                ws1RE           )
Packit 5b08af
ws'                     = ("ws",                ws1RE'          )
Packit 5b08af
javacmt1                = ("comment",           "//.*"          )
Packit 5b08af
javacmt                 = ("longcomment",       "/\\*" ++ untilRE "\\*/"        )
Packit 5b08af
shcmt1                  = ("comment",           "#.*"           )
Packit 5b08af
strconst                = ("strconst",          "\"([^\"\\\\\n\r]|\\\\.)*\""    )
Packit 5b08af
charconst               = ("charconst",         "\'([^\'\\\\\n\r]|\\\\.)*\'"    )
Packit 5b08af
number                  = ("number",            "[0-9]+(\\.[0-9]*([eE][-+]?[0-9]+)?)?"  )
Packit 5b08af
par                     = ("par",               "[\\(\\)\\[\\]\\{\\}]"          )
Packit 5b08af
xxx                     = ("xxx",               "."     )
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
plainRE                 :: Regex
Packit 5b08af
plainRE                 = buildRegex
Packit 5b08af
                          [ ("xxx",             "[^<&\n]+"              )
Packit 5b08af
                          , ("xxx",             "[<&\n]"                )
Packit 5b08af
                          ]
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
haskellRE               :: Regex
Packit 5b08af
haskellRE               = buildRegex
Packit 5b08af
                          [ ws
Packit 5b08af
                          , ("comment",         "(-)- .*"       )
Packit 5b08af
                          , ("longcomment",     "\\{" ++ untilRE "-\\}" )
Packit 5b08af
                          , ("keyword",         buildKeywords
Packit 5b08af
                                                [ "case", "class"
Packit 5b08af
                                                , "data", "default", "deriving", "do"
Packit 5b08af
                                                , "else"
Packit 5b08af
                                                , "forall"
Packit 5b08af
                                                , "if", "import", "in"
Packit 5b08af
                                                , "infix", "infixl", "infixr"
Packit 5b08af
                                                , "instance"
Packit 5b08af
                                                , "let"
Packit 5b08af
                                                , "module"
Packit 5b08af
                                                , "newtype"
Packit 5b08af
                                                , "of"
Packit 5b08af
                                                , "qualified"
Packit 5b08af
                                                , "then", "type"
Packit 5b08af
                                                , "where"
Packit 5b08af
                                                , "_"
Packit 5b08af
                                                , "as", "ccall", "foreign", "hiding", "proc", "safe", "unsafe"
Packit 5b08af
                                                ]
Packit 5b08af
                            )
Packit 5b08af
                          , ("keyglyph",        buildKeywords
Packit 5b08af
                                                ["\\.\\.","::","=","\\\\","\\|","<-","->","-<","@","~","=>","!",",",";"]
Packit 5b08af
                            )
Packit 5b08af
                          , ("varname"  ,       varname )
Packit 5b08af
                          , ("typename",        "[A-Z_][a-zA-Z0-9_]*[']*"       )
Packit 5b08af
                          , ("opname",          "`" ++ varname ++ "`"           )
Packit 5b08af
                          , strconst
Packit 5b08af
                          , charconst
Packit 5b08af
                          , number
Packit 5b08af
                          , par
Packit 5b08af
                          , ("operator",        "[-!#$%&\\*\\+./<=>\\?@\\\\^\\|~]+")
Packit 5b08af
                          , xxx
Packit 5b08af
                          ]
Packit 5b08af
                        where
Packit 5b08af
                        varname = "[a-z_][a-zA-Z0-9_]*[']*"
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
javaRE                  :: Regex
Packit 5b08af
javaRE                  = buildRegex
Packit 5b08af
                          [ ws
Packit 5b08af
                          , javacmt1
Packit 5b08af
                          , javacmt
Packit 5b08af
                          , ("keyword", buildKeywords
Packit 5b08af
                                        [ "abstract", "assert"
Packit 5b08af
                                        , "break"
Packit 5b08af
                                        , "case", "catch", "class", "continue"
Packit 5b08af
                                        , "default", "do"
Packit 5b08af
                                        , "else", "extends"
Packit 5b08af
                                        , "final", "finally", "for"
Packit 5b08af
                                        , "if", "implements", "import", "instanceof", "interface"
Packit 5b08af
                                        , "native", "new"
Packit 5b08af
                                        , "package", "private", "protected", "public"
Packit 5b08af
                                        , "return"
Packit 5b08af
                                        , "static", "super", "switch", "synchronized"
Packit 5b08af
                                        , "this", "throw", "throws", "transient", "try"
Packit 5b08af
                                        , "volatile"
Packit 5b08af
                                        , "while"
Packit 5b08af
                                        ]       )
Packit 5b08af
                          , ("typekeyword",
Packit 5b08af
                                        buildKeywords
Packit 5b08af
                                        [ "boolean", "byte"
Packit 5b08af
                                        , "char"
Packit 5b08af
                                        , "double"
Packit 5b08af
                                        , "false", "float"
Packit 5b08af
                                        , "int"
Packit 5b08af
                                        , "long"
Packit 5b08af
                                        , "null"
Packit 5b08af
                                        , "short"
Packit 5b08af
                                        , "true"
Packit 5b08af
                                        , "void"
Packit 5b08af
                                        ]       )
Packit 5b08af
                          , ("labelname",       "(" ++ varname ++ "{\\}default):"               )
Packit 5b08af
                          , ("",                ( mkLE ("keyword", "break|continue")
Packit 5b08af
                                                  ++ mkLE ws ++
Packit 5b08af
                                                  mkLE ("labelname", varname)
Packit 5b08af
                                                )
Packit 5b08af
                            )
Packit 5b08af
                          , ("varname",         varname                 )
Packit 5b08af
                          , ("typename",        "[A-Z][a-zA-Z0-9_]*"    )
Packit 5b08af
                          , strconst
Packit 5b08af
                          , charconst
Packit 5b08af
                          , number
Packit 5b08af
                          , par
Packit 5b08af
                          , ("delimiter",       "[.,;]"                         )
Packit 5b08af
                          , ("operator",        "[-+!%&/=\\*\\?~|<>:]+" )
Packit 5b08af
                          , xxx
Packit 5b08af
                          ]
Packit 5b08af
                          where
Packit 5b08af
                          varname = "[a-z][a-zA-Z0-9_]*"
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
bnfRE                   :: Regex
Packit 5b08af
bnfRE                   = buildRegex
Packit 5b08af
                          [ ws
Packit 5b08af
                          , ("bnfnt"            , "[A-Z][a-zA-Z0-9_]*"  )
Packit 5b08af
                          , ("bnfterminal",     "\"([^\"\\\\\n\r]|\\\\.)*\""    )
Packit 5b08af
                          , ("bnfmeta",         buildKeywords
Packit 5b08af
                                                [ "\\["
Packit 5b08af
                                                , "\\]"
Packit 5b08af
                                                , "::="
Packit 5b08af
                                                , "\\|"
Packit 5b08af
                                                , "\\{"
Packit 5b08af
                                                , "\\}"
Packit 5b08af
                                                ]
Packit 5b08af
                            )
Packit 5b08af
                          , xxx
Packit 5b08af
                          ]
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
cppRE                   :: Regex
Packit 5b08af
cppRE                   = buildRegex
Packit 5b08af
                          [ ws
Packit 5b08af
                          , javacmt1
Packit 5b08af
                          , javacmt
Packit 5b08af
                          , ("keyword", buildKeywords
Packit 5b08af
                                        [ "asm" , "auto"
Packit 5b08af
                                        , "break"
Packit 5b08af
                                        , "case" , "catch" , "class" , "const" , "continue"
Packit 5b08af
                                        , "default" , "delete" , "do"
Packit 5b08af
                                        , "else" , "extern"
Packit 5b08af
                                        , "for" , "friend"
Packit 5b08af
                                        , "goto"
Packit 5b08af
                                        , "if" , "inline"
Packit 5b08af
                                        , "new"
Packit 5b08af
                                        , "operator" , "overload"
Packit 5b08af
                                        , "private" , "protected" , "public"
Packit 5b08af
                                        , "register" , "return"
Packit 5b08af
                                        , "sizeof" , "static" , "switch"
Packit 5b08af
                                        , "template" , "this" , "typedef" , "throw" , "try"
Packit 5b08af
                                        , "virtual" , "volatile"
Packit 5b08af
                                        , "while"
Packit 5b08af
                                        ]
Packit 5b08af
                            )
Packit 5b08af
                          , ("typekeyword",
Packit 5b08af
                                        buildKeywords
Packit 5b08af
                                        [ "char"
Packit 5b08af
                                        , "double"
Packit 5b08af
                                        , "enum"
Packit 5b08af
                                        , "float"
Packit 5b08af
                                        , "int"
Packit 5b08af
                                        , "long"
Packit 5b08af
                                        , "short"
Packit 5b08af
                                        , "signed"
Packit 5b08af
                                        , "struct"
Packit 5b08af
                                        , "union"
Packit 5b08af
                                        , "unsigned"
Packit 5b08af
                                        , "void"
Packit 5b08af
                                        ]
Packit 5b08af
                            )
Packit 5b08af
                          , ("cppcommand",      ( "#" ++ ws0RE ++ "("
Packit 5b08af
                                                  ++
Packit 5b08af
                                                  buildKeywords
Packit 5b08af
                                                  [ "define"
Packit 5b08af
                                                  , "else"
Packit 5b08af
                                                  , "endif"
Packit 5b08af
                                                  , "if"
Packit 5b08af
                                                  , "ifdef"
Packit 5b08af
                                                  , "ifndef"
Packit 5b08af
                                                  , "(include[ \t].*)"
Packit 5b08af
                                                  , "undef"
Packit 5b08af
                                                  ]
Packit 5b08af
                                                  ++ ")"
Packit 5b08af
                                                )
Packit 5b08af
                            )
Packit 5b08af
                          , ("specialword",     buildKeywords
Packit 5b08af
                                                [ "assert"
Packit 5b08af
                                                , "exit"
Packit 5b08af
                                                , "free"
Packit 5b08af
                                                , "main"
Packit 5b08af
                                                , "malloc"
Packit 5b08af
                                                ]
Packit 5b08af
                            )
Packit 5b08af
                          , ("varname",         varname                 )
Packit 5b08af
                          , ("typename",        "[A-Z][a-zA-Z0-9_]*"    )
Packit 5b08af
                          , strconst
Packit 5b08af
                          , charconst
Packit 5b08af
                          , number
Packit 5b08af
                          , par
Packit 5b08af
                          , ("delimiter",       "[.,;]"                         )
Packit 5b08af
                          , ("operator",        "[-+!%&/=\\*\\?~|<>:]+" )
Packit 5b08af
                          , xxx
Packit 5b08af
                          ]
Packit 5b08af
                          where
Packit 5b08af
                          varname = "[a-z][a-zA-Z0-9_]*"
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
shRE                    :: Regex
Packit 5b08af
shRE                    = buildRegex
Packit 5b08af
                          [ ws
Packit 5b08af
                          , shcmt1
Packit 5b08af
                          , ("keyword",         buildKeywords
Packit 5b08af
                                                [ "alias"
Packit 5b08af
                                                , "break" , "bg"
Packit 5b08af
                                                , "case" , "cd" , "continue"
Packit 5b08af
                                                , "declare" , "do" , "done"
Packit 5b08af
                                                , "echo" , "elif" , "else" , "env" , "esac" , "eval" , "exec" , "exit" , "export"
Packit 5b08af
                                                , "false" , "fg" , "fi" , "for" , "function"
Packit 5b08af
                                                , "if" , "in"
Packit 5b08af
                                                , "jobs"
Packit 5b08af
                                                , "kill"
Packit 5b08af
                                                , "local"
Packit 5b08af
                                                , "pwd"
Packit 5b08af
                                                , "return"
Packit 5b08af
                                                , "set" , "shift"
Packit 5b08af
                                                , "test" , "then" , "trap" , "true"
Packit 5b08af
                                                , "unalias" , "unset"
Packit 5b08af
                                                , "while" , "wait"
Packit 5b08af
                                                ]
Packit 5b08af
                            )
Packit 5b08af
                          , ("varname",         "[A-Za-z_][a-zA-Z0-9_]*"        )
Packit 5b08af
                          , ("operator",        "[-+!%&=\\\\\\*\\?~|<>:@$]+"    )
Packit 5b08af
                          , ("operator",        "[\\(\\)\\[\\]\\{\\}]+"         )
Packit 5b08af
                          , strconst
Packit 5b08af
                          , charconst
Packit 5b08af
                          , xxx
Packit 5b08af
                          ]
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
rubyRE                  :: Regex
Packit 5b08af
rubyRE                  = buildRegex
Packit 5b08af
                          [ ws
Packit 5b08af
                          , rubycmt
Packit 5b08af
                          , ("keyword",         buildKeywords
Packit 5b08af
                                                [ "begin" , "break"
Packit 5b08af
                                                , "catch" , "case" , "class"
Packit 5b08af
                                                , "def" , "do"
Packit 5b08af
                                                , "else" , "elif" , "end" , "ensure"
Packit 5b08af
                                                , "false" , "for"
Packit 5b08af
                                                , "if" , "in" , "include" , "initialize"
Packit 5b08af
                                                , "loop"
Packit 5b08af
                                                , "module"
Packit 5b08af
                                                , "new" , "nil"
Packit 5b08af
                                                , "raise" , "require" , "rescue"
Packit 5b08af
                                                , "self"
Packit 5b08af
                                                , "then" , "true" , "type"
Packit 5b08af
                                                , "until"
Packit 5b08af
                                                , "when" , "while"
Packit 5b08af
                                                , "yield"
Packit 5b08af
                                                ]
Packit 5b08af
                            )
Packit 5b08af
                          , ("typename",        "[A-Z][A-Za-z0-9]*"     )
Packit 5b08af
                          , ("varname",         "[A-Za-z_][a-zA-Z0-9_]*(!|\\?)?"        )
Packit 5b08af
                          , ("instancename",    "(@{1,2}|$)[A-Za-z_][a-zA-Z0-9_]*"      )
Packit 5b08af
                          , ("strconst",        "%[qQx]\\{.*\\}"        )
Packit 5b08af
                          , ("strconst",        "#\\{.*\\}"     )
Packit 5b08af
                          , ("strconst",        ":[a-z][A-Za-z0-9]*"    )
Packit 5b08af
                          , strconst
Packit 5b08af
                          , charconst
Packit 5b08af
                          , regex
Packit 5b08af
                          , xxx
Packit 5b08af
                          ]
Packit 5b08af
                        where
Packit 5b08af
                        rubycmt                = ("comment",    "#(.{\\}\\{)*" )
Packit 5b08af
                        regex                  = ("strconst",   "/([^/\\\\\n\r]|\\\\.)*/"    )
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
pplRE                   :: Regex
Packit 5b08af
pplRE                   = buildRegex
Packit 5b08af
                          [ ws
Packit 5b08af
                          , ("comment",         "(-)- .*"       )
Packit 5b08af
                          , ("keyword",         buildKeywords
Packit 5b08af
                                                [ "and"
Packit 5b08af
                                                , "begin"
Packit 5b08af
                                                , "div" , "do"
Packit 5b08af
                                                , "else" , "elseif" , "endif" , "endwhile" , "end"
Packit 5b08af
                                                , "function"
Packit 5b08af
                                                , "if"
Packit 5b08af
                                                , "max" , "min" , "mod"
Packit 5b08af
                                                , "not"
Packit 5b08af
                                                , "of" , "or"
Packit 5b08af
                                                , "procedure"
Packit 5b08af
                                                , "repeat"
Packit 5b08af
                                                , "return"
Packit 5b08af
                                                , "then"
Packit 5b08af
                                                , "until"
Packit 5b08af
                                                , "var"
Packit 5b08af
                                                , "while"
Packit 5b08af
                                                , "xor"
Packit 5b08af
                                                ]
Packit 5b08af
                            )
Packit 5b08af
                          , ("typekeyword",     buildKeywords
Packit 5b08af
                                                [ "boolean"
Packit 5b08af
                                                , "false" , "float"
Packit 5b08af
                                                , "int"
Packit 5b08af
                                                , "list"
Packit 5b08af
                                                , "picture"
Packit 5b08af
                                                , "string"
Packit 5b08af
                                                , "true"
Packit 5b08af
                                                ]
Packit 5b08af
                            )
Packit 5b08af
                          , ("varname",        "[A-Za-z_][a-zA-Z0-9_]*"         )
Packit 5b08af
                          , strconst
Packit 5b08af
                          , number
Packit 5b08af
                          , xxx
Packit 5b08af
                          ]
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------
Packit 5b08af
Packit 5b08af
pplassRE                :: Regex
Packit 5b08af
pplassRE                = buildRegex
Packit 5b08af
                          [ ws
Packit 5b08af
                          , ("comment",         "(-)- .*"       )
Packit 5b08af
                          , ("keyword",         buildKeywords
Packit 5b08af
                                                [ "loadi" , "loadf"
Packit 5b08af
                                                , "loads" , "emptyl"
Packit 5b08af
                                                , "undef" , "load"
Packit 5b08af
                                                ]
Packit 5b08af
                            )
Packit 5b08af
                          , ("typename",        buildKeywords
Packit 5b08af
                                                [ "store"
Packit 5b08af
                                                , "pop"
Packit 5b08af
                                                ]
Packit 5b08af
                            )
Packit 5b08af
                          , ("typekeyword",     buildKeywords
Packit 5b08af
                                                [ "jmp"
Packit 5b08af
                                                , "brfalse"
Packit 5b08af
                                                , "brtrue"
Packit 5b08af
                                                , "pushj"
Packit 5b08af
                                                , "popj"
Packit 5b08af
                                                , "svc"
Packit 5b08af
                                                ]
Packit 5b08af
                            )
Packit 5b08af
                          , ("labelname",       "(l[0-9]+:?)|([se]?_[A-Za-z0-9]*:?)"    )
Packit 5b08af
                          , ("varname",        "[A-Za-z_][a-zA-Z0-9_]*"         )
Packit 5b08af
                          , strconst
Packit 5b08af
                          , xxx
Packit 5b08af
                          ]
Packit 5b08af
Packit 5b08af
-- ------------------------------------------------------------