implementation module Sil.Syntax import StdOverloaded import StdString import Data.Maybe import Text import Sil.Util.Printer instance toString Statement where toString (Declaration n a) = n <+ " := " <+ a <+ ";" toString (Application e) = toString e <+ ";" toString (Return Nothing) = "return;" toString (Return (Just a)) = "return " <+ a <+ ";" toString (If bs e) = "if ..." toString (MachineStm s) = "|~" <+ s toString _ = "<>" 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 Expression 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 = "~" toString Not = "!" 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