diff options
author | Camil Staps | 2017-07-19 11:46:32 +0000 |
---|---|---|
committer | Camil Staps | 2017-07-19 11:46:32 +0000 |
commit | d722a77077e89504191728cf42f7d15ddfa209a7 (patch) | |
tree | f3f70e055e9a76dba7eecde01146c697b452f064 /Sil/Util.icl | |
parent | Working fibonacci (diff) |
Reorganise
Diffstat (limited to 'Sil/Util.icl')
-rw-r--r-- | Sil/Util.icl | 151 |
1 files changed, 0 insertions, 151 deletions
diff --git a/Sil/Util.icl b/Sil/Util.icl deleted file mode 100644 index 35b8522..0000000 --- a/Sil/Util.icl +++ /dev/null @@ -1,151 +0,0 @@ -implementation module Sil.Util - -import _SystemArray -import StdEnum -from StdFunc import id -import StdInt -import StdList -import StdOverloaded -import StdString - -from Data.Func import $ -import Data.List -import Data.Maybe -import Text - -import Sil.Parse -import Sil.Syntax - -:: PrintState = - { indent :: Int - } - -instance zero PrintState where zero = {indent=0} - -incIndent :: PrintState -> PrintState -incIndent ps = {ps & indent=inc ps.indent} - -decIndent :: PrintState -> PrintState -decIndent ps = {ps & indent=dec ps.indent} - -instance toString PrintState where toString st = {'\t' \\ _ <- [1..st.indent]} - -instance PrettyPrinter [Token] -where - print st [] = "" - print st [t] = toString t - print st [t:ts=:[t`:_]] = toString t +++ spaceBetween t t` +++ print st` ts - where - st` = {st & indent=indent`} - indent` = newIndent t t` st.indent - - spaceBetween :: Token Token -> String - spaceBetween _ TBraceClose = newline - spaceBetween TParenOpen _ = "" - spaceBetween TParenClose TBraceOpen = space - spaceBetween TParenClose _ = "" - spaceBetween TBraceOpen _ = newline - spaceBetween TBraceClose _ = newline - spaceBetween TComma _ = space - spaceBetween TSemicolon _ = newline - spaceBetween TAssign _ = space - spaceBetween (TLit _) _ = space - spaceBetween TIf _ = space - spaceBetween TWhile _ = space - spaceBetween TReturn _ = space - spaceBetween (TName _) TParenClose = "" - spaceBetween (TName _) TSemicolon = "" - spaceBetween (TName _) _ = space - - newline = "\r\n" +++ {'\t' \\ _ <- [1..indent`]} - space = " " - - newIndent :: Token Token -> Int -> Int - newIndent TBraceOpen _ = inc - newIndent _ TBraceClose = dec - newIndent _ _ = id - -instance PrettyPrinter Program -where - print st prog = p st prog.p_funs - where - p :: PrintState [Function] -> String - p _ [] = "" - p st [f] = print st f - p st [f:fs] = print st f <+ "\r\n\r\n" <+ p st fs - -instance PrettyPrinter Function -where - print st f = st <+ f.f_type <+ " " <+ f.f_name - <+ "(" <+ printersperse ", " f.f_args <+ ") {\r\n" - <+ print {st & indent=st.indent+1} f.f_code <+ "\r\n" <+ st <+ "}" - -instance PrettyPrinter CodeBlock -where - print st cb = concat $ intersperse "\r\n" $ - [print st x \\ x <- cb.cb_init] ++ [print st x \\ x <- cb.cb_content] - -instance PrettyPrinter Initialisation -where - print st init = st <+ init.init_type <+ " " <+ init.init_name <+ ";" - -instance PrettyPrinter Statement -where - print st (If c t Nothing) = st <+ "if (" <+ c <+ ") {\r\n" <+ - print (incIndent st) t <+ "\r\n" <+ st <+ "}" - print st (If c t (Just e)) = st <+ "if (" <+ c <+ ") {\r\n" <+ - print st` t <+ "\r\n" <+ st <+ "} else {\r\n" <+ - print st` e <+ "\r\n" <+ st <+ "}" - where st` = incIndent st - print st stm = st <+ stm - -instance toString Statement -where - toString (Declaration n a) = n <+ " " <+ TAssign <+ " " <+ a <+ ";" - toString (Application app) = toString app <+ ";" - toString (Return Nothing) = "return;" - toString (Return (Just a)) = "return " <+ a <+ ";" - toString (If c t e) = "if (" <+ c <+ ") ..." - toString (MachineStm s) = "|~" <+ s - toString _ = "<<unimplemented Statement>>" - -instance toString Type -where - toString TBool = "Bool" - toString TInt = "Int" - toString TVoid = "Void" - -instance toString Arg where toString arg = arg.arg_type <+ " " <+ arg.arg_name - -instance toString Application -where - toString (Name n) = n - toString (Literal lit) = toString lit - toString (App n args) = n <+ "(" <+ printersperse ", " args <+ ")" - toString (BuiltinApp op e) = op <+ "(" <+ e <+ ")" - toString (BuiltinApp2 e1 op e2) = "(" <+ e1 <+ ") " <+ op <+ " (" <+ e2 <+ ")" - -instance toString Op1 -where - toString Neg = "~" - -instance toString Op2 -where - toString Add = "+" - toString Sub = "-" - toString Mul = "*" - toString Div = "/" - toString Rem = "%" - toString Equals = "==" - toString LogOr = "||" - toString LogAnd = "&&" - -instance toString Literal -where - toString (BLit b) = toString b - toString (ILit i) = toString i - -printersperse :: a [b] -> String | toString a & toString b -printersperse _ [] = "" -printersperse _ [x] = toString x -printersperse g [x:xs] = x <+ g <+ printersperse g xs |