definition module Sil.Syntax from StdOverloaded import class toString from Data.Maybe import :: Maybe from Sil.Types import :: Type from Sil.Util.Parser import :: ParsePosition, class getPos :: Program = { p_funs :: [Function] , p_globals :: [Initialisation] } :: Function = { f_type :: Type , f_name :: Name , f_args :: [Arg] , f_code :: CodeBlock , f_pos :: ParsePosition } :: CodeBlock = { cb_init :: [Initialisation] , cb_content :: [Statement] } :: Arg = { arg_type :: Type , arg_name :: Name } :: Initialisation = { init_type :: Type , init_name :: Name , init_value :: Maybe Expression , init_pos :: ParsePosition } :: Statement = Declaration ParsePosition Name Expression | Application ParsePosition Expression | Return ParsePosition (Maybe Expression) | If ParsePosition [(Expression, CodeBlock)] (Maybe CodeBlock) | While ParsePosition Expression CodeBlock | MachineStm ParsePosition String :: Expression = Name ParsePosition Name | Literal ParsePosition Literal | App ParsePosition Name [Expression] | BuiltinApp ParsePosition Op1 Expression | BuiltinApp2 ParsePosition Expression Op2 Expression | Field ParsePosition Name Expression | Tuple ParsePosition Int [Expression] | List ParsePosition (Maybe Type) [Expression] :: Op1 = Neg //* ~ | Not //* ! :: Op2 = Add //* + | Sub //* - | Mul //* * | Div //* / | Rem //* % | Equals //* == | Unequals //* <> | CmpLe //* <= | CmpGe //* >= | CmpLt //* < | CmpGt //* > | LogOr //* || | LogAnd //* && | Cons //* : :: Literal = BLit Bool | ILit Int :: Name :== String instance toString Statement instance toString Arg instance toString Expression instance toString Op1 instance toString Op2 instance toString Literal instance getPos Function instance getPos Initialisation instance getPos Statement instance getPos Expression class allStatements a :: a -> [Statement] instance allStatements Program instance allStatements Function instance allStatements CodeBlock instance allStatements Statement class allCodeBlocks a :: a -> [CodeBlock] instance allCodeBlocks Function instance allCodeBlocks CodeBlock instance allCodeBlocks Statement class allLocals a :: a -> [(Type, Name)] instance allLocals Function instance allLocals CodeBlock