|
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 (("" ++) . (++ "
|
|
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 |
-- ------------------------------------------------------------
|