DATA Program | Program blocks : BlocksTop DATA BlocksTop | Top blocks : Blocks | None TYPE Blocks = [Block] DATA Block | Itf itf : Itf | Data data : Data | Type type : Type | Section code : Code | Item name : Ident item : Item | DataSem sem : DataSem DATA Itf | Itf pos : Pos name : Ident vars : Vars visits : ItfVisits TYPE ItfVisits = [ItfVisit] DATA ItfVisit | Visit pos : Pos name : Ident cyclic : Bool vars : Vars attrs : Attrs TYPE Attrs = [Attr] DATA Attr | Inh name : Ident type : String | Syn name : Ident type : String DATA Data | Data pos : Pos name : Ident vars : Vars cons : Cons exts : Exts TYPE Vars = [Var] DATA Var | Var name : Ident TYPE Exts = [Ext] DATA Ext | Ext name : Ident TYPE Cons = [Con] DATA Con | Con pos : Pos name : Ident vars : Vars fields : Fields TYPE Fields = [Field] DATA Field | Field name : Ident type : FieldType DATA FieldType | Term type : String | Nonterm name : Ident DATA Type | Alias pos : Pos name : Ident type : AliasType vars : Vars DATA AliasType | Prod fields : {[Ident]} | List type : Ident | Maybe type : Ident DATA DataSem | Sem pos : Pos tp : Ident vars : Vars mbMonad : {Maybe String} cyclic : Bool stmts : {Stmts} clauses : ClausesTop TYPE SemCons = [SemCon] DATA SemCon | Con pos : Pos name : Ident fields : SemFields TYPE SemFields = [SemField] DATA SemField | Field pos : Pos name : Ident type : {Either Ident String} DATA Code | Code items : Items TYPE MaybeBoundCode = MAYBE BoundCode DATA BoundCode | Code bind : Bind pos : Pos code : Code TYPE Items = [Item] DATA Item | Plain pos : Pos txt : String | Attr pos : Pos child : Ident name : Ident | Sem pos : Pos name : Ident tp : Ident vars : Vars mbMonad : {Maybe String} first : SemVisit | CoSem pos : Pos name : Ident tp : Ident visit : Ident vars : Vars mbMonad : {Maybe String} first : SemVisit | DataSem sem : DataSem | Detach -- requires visits up to but not including this visit to be invoked pos : Pos visit : Ident name : Ident | Construct pos : Pos data : Ident con : Ident fields : ExprFields | Brackets pos : Pos items : Items posEnd : Pos TYPE ExprFields = [ExprField] DATA ExprField | Field name : Ident code : Code DATA SemVisit | Visit pos : Pos name : Ident cyclic : Bool attrs : VisitAttrs stmts : Stmts clauses : ClausesTop | Internal pos : Pos name : Ident cyclic : Bool stmts : Stmts clauses : ClausesTop | Impl | Prependable -- maybe prepended by other visits pos : Pos name : Ident actual : {SemVisit} | End TYPE VisitAttrs = [VisitAttr] DATA VisitAttr | Chn name : Ident type : String DATA ClausesTop | Top clauses : Clauses | Impl clauses : {Clauses} TYPE Clauses = [Clause] DATA Clause | Clause pos : Pos name : Ident stmts : Stmts next : SemVisit TYPE Stmts = [Stmt] DATA Stmt | Eval mode : Mode pat : Pat code : BoundCode | Attach pos : Pos mbVisit : {Maybe Ident} name : Ident type : Ident code : MaybeBoundCode | Invoke pos : Pos visit : Ident name : Ident code : MaybeBoundCode | Default allowEmpty : Bool pos : Pos name : Ident mbCode : MaybeBoundCode | Rename pos : Pos child : Ident subst : Renames TYPE Renames = [Rename] DATA Rename | Rename source : Ident dest : Ident DATA Mode | Match | Assert DATA Bind | Fun | Monadic TYPE Pats = [Pat] DATA Pat | Con name : Ident pats : Pats | AttrCon con : Ident name : Ident dt : Ident | Attr child : Ident name : Ident | Tup pats : Pats | List pats : Pats | Cons hd : Pat tl : Pat | Underscore pos : Pos DATA AttrTypePat | VisLocal | ProdLocal | Lhs | Child | Visit DATA AttrTypeCode | VisLocal | ProdLocal | Lhs | Child | Visit TYPE ImplStmts = [ImplStmt] DATA ImplStmt | Invoke pos : Pos child : Ident visit : Ident itf : Ident | DefaultChild pos : Pos allowEmpty : Bool child : Ident name : Ident mbCodeRef : {Maybe Int} | DefaultSyn pos : Pos allowEmpty : Bool name : Ident mbCodeRef : {Maybe Int} | DefaultVisLocal pos : Pos name : Ident