Added the ability to print out HTML-highlighted lexed occam
This falls a bit outside the compiler's remit, but it will be the same code to print out the lexed occam without highlighting, which I plan to use for doing libraries with Tock in a bit.
This commit is contained in:
parent
733293745e
commit
09093cff12
41
Main.hs
41
Main.hs
|
@ -43,6 +43,7 @@ import Errors
|
||||||
import FlowGraph
|
import FlowGraph
|
||||||
import GenerateC
|
import GenerateC
|
||||||
import GenerateCPPCSP
|
import GenerateCPPCSP
|
||||||
|
import LexOccam
|
||||||
import Metadata
|
import Metadata
|
||||||
import ParseOccam
|
import ParseOccam
|
||||||
import ParseRain
|
import ParseRain
|
||||||
|
@ -66,7 +67,7 @@ optionsNoWarnings =
|
||||||
, Option ['f'] ["compiler-flags"] (ReqArg optCompilerFlags "FLAGS") "flags for C/C++ compiler"
|
, Option ['f'] ["compiler-flags"] (ReqArg optCompilerFlags "FLAGS") "flags for C/C++ compiler"
|
||||||
, Option [] ["run-indent"] (NoArg $ optRunIndent) "run indent on source before compilation (will full mode)"
|
, Option [] ["run-indent"] (NoArg $ optRunIndent) "run indent on source before compilation (will full mode)"
|
||||||
, Option [] ["frontend"] (ReqArg optFrontend "FRONTEND") "language frontend (options: occam, rain)"
|
, Option [] ["frontend"] (ReqArg optFrontend "FRONTEND") "language frontend (options: occam, rain)"
|
||||||
, Option [] ["mode"] (ReqArg optMode "MODE") "select mode (options: flowgraph, lex, parse, compile, post-c, full)"
|
, Option [] ["mode"] (ReqArg optMode "MODE") "select mode (options: flowgraph, lex, html, parse, compile, post-c, full)"
|
||||||
, Option ['o'] ["output"] (ReqArg optOutput "FILE") "output file (default \"-\")"
|
, Option ['o'] ["output"] (ReqArg optOutput "FILE") "output file (default \"-\")"
|
||||||
, Option [] ["sanity-check"] (ReqArg optSanityCheck "SETTING") "internal sanity check (options: on, off)"
|
, Option [] ["sanity-check"] (ReqArg optSanityCheck "SETTING") "internal sanity check (options: on, off)"
|
||||||
, Option [] ["occam2-mobility"] (ReqArg optClassicOccamMobility "SETTING") "occam2 implicit mobility (EXPERIMENTAL) (options: on, off)"
|
, Option [] ["occam2-mobility"] (ReqArg optClassicOccamMobility "SETTING") "occam2 implicit mobility (EXPERIMENTAL) (options: on, off)"
|
||||||
|
@ -91,6 +92,7 @@ optMode s ps
|
||||||
"parse" -> return ModeParse
|
"parse" -> return ModeParse
|
||||||
"post-c" -> return ModePostC
|
"post-c" -> return ModePostC
|
||||||
"lex" -> return ModeLex
|
"lex" -> return ModeLex
|
||||||
|
"html" -> return ModeHTML
|
||||||
_ -> dieIO (Nothing, "Unknown mode: " ++ s)
|
_ -> dieIO (Nothing, "Unknown mode: " ++ s)
|
||||||
return $ ps { csMode = mode }
|
return $ ps { csMode = mode }
|
||||||
|
|
||||||
|
@ -309,6 +311,41 @@ useOutputOptions func
|
||||||
func f
|
func f
|
||||||
liftIO $ hClose f
|
liftIO $ hClose f
|
||||||
|
|
||||||
|
showTokens :: Bool -> [Token] -> String
|
||||||
|
showTokens html ts = evalState (mapM showToken ts >>* spaceOut) 0
|
||||||
|
where
|
||||||
|
spaceOut = foldl join ""
|
||||||
|
join prev (Right str) = prev ++ " " ++ str
|
||||||
|
join prev (Left spacing)
|
||||||
|
| spacing >= 0 = prev ++ concat (replicate spacing space)
|
||||||
|
| spacing < 0 = foldl (.) id (replicate (length space * negate spacing) init) $ prev
|
||||||
|
|
||||||
|
showToken (Token _ tt) = showTokenType tt
|
||||||
|
|
||||||
|
showTokenType :: TokenType -> State Int (Either Int String)
|
||||||
|
showTokenType (TokReserved s) = ret $ h s
|
||||||
|
showTokenType (TokIdentifier s) = ret s
|
||||||
|
showTokenType (TokStringCont s) = ret s
|
||||||
|
showTokenType (TokStringLiteral s) = ret s
|
||||||
|
showTokenType (TokCharLiteral s) = ret s
|
||||||
|
showTokenType (TokIntLiteral s) = ret s
|
||||||
|
showTokenType (TokHexLiteral s) = ret s
|
||||||
|
showTokenType (TokRealLiteral s) = ret s
|
||||||
|
showTokenType (TokPreprocessor s) = ret $ h s
|
||||||
|
showTokenType (IncludeFile s) = ret $ h "#INCLUDE \"" ++ s ++ "\""
|
||||||
|
showTokenType (Pragma s) = ret $ h "#PRAGMA " ++ s
|
||||||
|
showTokenType (Indent) = modify (+2) >> return (Left 2)
|
||||||
|
showTokenType (Outdent) = modify (subtract 2) >> return (Left (-2))
|
||||||
|
showTokenType (EndOfLine)
|
||||||
|
= do indentation <- get
|
||||||
|
ret $ newline ++ concat (replicate indentation space)
|
||||||
|
ret :: String -> State Int (Either Int String)
|
||||||
|
ret = return . Right
|
||||||
|
|
||||||
|
(space, newline, h) = if html
|
||||||
|
then (" ", "<br/>\n", \s -> "<b>" ++ s ++ "</b>")
|
||||||
|
else (" ", "\n", id)
|
||||||
|
|
||||||
-- | Compile a file.
|
-- | Compile a file.
|
||||||
-- This is written in the PassM monad -- as are most of the things it calls --
|
-- This is written in the PassM monad -- as are most of the things it calls --
|
||||||
-- because then it's very easy to pass the state around.
|
-- because then it's very easy to pass the state around.
|
||||||
|
@ -324,6 +361,7 @@ compile mode fn outHandle
|
||||||
case mode of
|
case mode of
|
||||||
-- In lex mode, don't parse, because it will probably fail anyway:
|
-- In lex mode, don't parse, because it will probably fail anyway:
|
||||||
ModeLex -> return (A.Only emptyMeta (), lexed)
|
ModeLex -> return (A.Only emptyMeta (), lexed)
|
||||||
|
ModeHTML -> return (A.Only emptyMeta (), lexed)
|
||||||
_ -> do parsed <- parseOccamProgram lexed
|
_ -> do parsed <- parseOccamProgram lexed
|
||||||
return (parsed, lexed)
|
return (parsed, lexed)
|
||||||
FrontendRain -> do parsed <- liftIO (readFile fn) >>= parseRainProgram fn
|
FrontendRain -> do parsed <- liftIO (readFile fn) >>= parseRainProgram fn
|
||||||
|
@ -333,6 +371,7 @@ compile mode fn outHandle
|
||||||
|
|
||||||
case mode of
|
case mode of
|
||||||
ModeLex -> liftIO $ hPutStr outHandle $ pshow lexed
|
ModeLex -> liftIO $ hPutStr outHandle $ pshow lexed
|
||||||
|
ModeHTML -> liftIO $ hPutStr outHandle $ showTokens True lexed
|
||||||
ModeParse -> liftIO $ hPutStr outHandle $ pshow ast1
|
ModeParse -> liftIO $ hPutStr outHandle $ pshow ast1
|
||||||
ModeFlowGraph ->
|
ModeFlowGraph ->
|
||||||
do procs <- findAllProcesses
|
do procs <- findAllProcesses
|
||||||
|
|
|
@ -38,7 +38,7 @@ import UnifyType
|
||||||
import Utils
|
import Utils
|
||||||
|
|
||||||
-- | Modes that Tock can run in.
|
-- | Modes that Tock can run in.
|
||||||
data CompMode = ModeFlowGraph | ModeLex | ModeParse | ModeCompile | ModePostC | ModeFull
|
data CompMode = ModeFlowGraph | ModeLex | ModeHTML | ModeParse | ModeCompile | ModePostC | ModeFull
|
||||||
deriving (Show, Data, Typeable, Eq)
|
deriving (Show, Data, Typeable, Eq)
|
||||||
|
|
||||||
-- | Backends that Tock can use.
|
-- | Backends that Tock can use.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user