1 ///////////////////////////////////////////////////////////////////////////////
3 // This file contains the abstract syntax tree definitions for the
4 // SETL-like extension language of Prop.
6 ///////////////////////////////////////////////////////////////////////////////
7 #ifndef setl_extension_abstract_syntax_tree_h
8 #define setl_extension_abstract_syntax_tree_h
13 ///////////////////////////////////////////////////////////////////////////////
15 // Forward AST declarations.
17 ///////////////////////////////////////////////////////////////////////////////
18 datatype Exp // expressions
19 and Decl // prop declarations
20 and Time // time complexity
21 and Space // space complexity
24 ///////////////////////////////////////////////////////////////////////////////
26 // AST for definitions, signatures, statements and bindings
28 ///////////////////////////////////////////////////////////////////////////////
30 ///////////////////////////////////////////////////////////////////////////////
32 // Type 'Def' represents definitions.
34 ///////////////////////////////////////////////////////////////////////////////
35 datatype Def : public Loc =
37 | VARdef { id : Id, // variable name
38 ty : Ty, // type of variable
39 init_exp : Exp = NOexp // initial value
41 | FUNCTIONdef { id : Id, // name of function
42 args : LabTys, // arguments
43 return_ty : Ty, // return type
44 local_defs : Defs, // local defintions
45 body : Stmts // body of function
47 | MODULEdef { id : Id, // name of module
48 args : LabSigs, // arguments
49 sig : Sig, // signature constraint
50 body : Defs // body of module
52 | SIGNATUREdef { id : Id, // name of signature
53 args : LabSigs, // arguments
54 sig : Sig // body of signature
56 | TYPEdef (Decl) // datatype/type definition
57 | LAMBDAdef (LabTys, Defs) // module abstraction
59 ///////////////////////////////////////////////////////////////////////////////
61 // Type 'Sig' represents signatures.
63 ///////////////////////////////////////////////////////////////////////////////
64 and Sig : public Loc =
66 | IDsig (Id) // signature name
67 | DOTsig (Sig, Id) // signature selection
68 | APPsig (Sig, Sigs) // signature application
69 | DEFsig (Defs) // definitions
70 | LAMBDAsig (LabSigs, Sig) // signature abstraction
72 ///////////////////////////////////////////////////////////////////////////////
74 // Type 'Stmt' represents statements.
76 ///////////////////////////////////////////////////////////////////////////////
77 and Stmt : public Loc =
78 NOstmt // empty statement
79 | ASSIGNstmt (Exp, Exp) // assignment
80 | BLOCKstmt (Defs, Stmts) // statement block
81 | WHILEstmt (Exp, Stmt) // while loop
82 | IFstmt (Exp, Stmt, Stmt) // if/then/else
83 | MATCHstmt (Decl) // match statement
84 | REWRITEstmt (Decl) // rewriting statement
85 | REPLACEMENTstmt (Decl) // replacement statement
86 | FORALLstmt (Generators, Stmt) // iteration
87 | RETURNstmt (Exp) // return statement
89 ///////////////////////////////////////////////////////////////////////////////
91 // Miscellaneous type abbreviations
93 ///////////////////////////////////////////////////////////////////////////////
94 where type LabSig = { id : Id, sig : Sig } // labeled signature
95 and LabSigs = List<LabSig> // labeled signature list
96 and Defs = List<Def> // list of definitions
97 and Sigs = List<Sig> // list of signatures
98 and Stmts = List<Stmt> // list of statements
99 and Generators = List<Generator> // list of generators
102 ///////////////////////////////////////////////////////////////////////////////
104 // Pretty printing routines for definitions, statements and generators
106 ///////////////////////////////////////////////////////////////////////////////
107 extern std::ostream& operator << (std::ostream&, Def);
108 extern std::ostream& operator << (std::ostream&, Defs);
109 extern std::ostream& operator << (std::ostream&, Sig);
110 extern std::ostream& operator << (std::ostream&, Sigs);
111 extern std::ostream& operator << (std::ostream&, Stmt);
112 extern std::ostream& operator << (std::ostream&, Stmts);
113 extern std::ostream& operator << (std::ostream&, LabSig);
114 extern std::ostream& operator << (std::ostream&, LabSigs);
115 extern std::ostream& operator << (std::ostream&, Generator);
116 extern std::ostream& operator << (std::ostream&, Generators);