FreeTensor
Loading...
Searching...
No Matches
print_ast.h
Go to the documentation of this file.
1#ifndef FREE_TENSOR_PRINT_AST_H
2#define FREE_TENSOR_PRINT_AST_H
3
4#include <functional>
5#include <iostream>
6#include <unordered_set>
7
8#include <codegen/code_gen.h>
10
11namespace freetensor {
12
13class PrintVisitor : public CodeGen<CodeGenStream> {
14 bool printAllId_ = false, pretty_ = false, dtypeInLoad_ = false,
15 hexFloat_ = false, parenDespitePriority_ = false,
16 printSourceLocation_ = false;
17 const std::unordered_set<std::string> keywords = {
18 "if", "else", "for", "from", "until", "step",
19 "length", "assert", "assume", "func", "true", "false",
20 };
21
29 enum class Precedence {
30 ANY,
31 TRINARY,
32 LOR,
33 LOR_RHS,
34 LAND,
35 LAND_RHS,
36 COMP,
37 COMP_RHS,
38 ADD,
39 ADD_RHS,
40 MUL,
41 MUL_RHS,
42 UNARY_LOGIC,
43 };
44
50 Precedence precedence_ = Precedence::ANY;
51
60 void precedence_enclose(Precedence new_priority, auto inner,
61 bool parentheses = true) {
62 auto old_priority = precedence_;
63 precedence_ = new_priority;
64 if (parentheses &&
65 (parenDespitePriority_ || old_priority > precedence_))
66 os() << "(";
67 inner();
68 if (parentheses &&
69 (parenDespitePriority_ || old_priority > precedence_))
70 os() << ")";
71 precedence_ = old_priority;
72 }
73
80 void precedence_new(auto inner) {
81 precedence_enclose(Precedence::ANY, inner, false);
82 }
83
84 public:
85 PrintVisitor(bool printAllId = false, bool pretty = false,
86 bool dtypeInLoad = false, bool hexFloat = false,
87 bool compact = false, bool parenDespitePriority = false,
88 bool printSourceLocation = false)
89 : CodeGen(compact), printAllId_(printAllId), pretty_(pretty),
90 dtypeInLoad_(dtypeInLoad), hexFloat_(hexFloat),
91 parenDespitePriority_(parenDespitePriority),
92 printSourceLocation_(printSourceLocation) {
93 os() << manipNoIdSign(true)
94 << (printSourceLocation ? manipMetadataWithLocation
96 }
97
98 private:
99 void recur(const Expr &op);
100 void recur(const Stmt &op);
101 void printMetadataAndId(const Stmt &op);
102
103 std::string escape(const std::string &name);
104 std::string prettyIterName(const std::string &name);
105 std::string prettyVarDefName(const std::string &name);
106 std::string prettyFuncName(const std::string &name);
107 std::function<std::ostream &(std::ostream &)> prettyId(const ID &id);
108 std::string prettyLiteral(const std::string &lit);
109 std::string prettyKeyword(const std::string &kw);
110 std::string prettyDType(const DataType &dtype);
111
112 protected:
113 void visitStmt(const Stmt &op) override;
114
115 void visit(const Func &op) override;
116 void visit(const StmtSeq &op) override;
117 void visit(const Any &op) override;
118 void visit(const AnyExpr &op) override;
119 void visit(const VarDef &op) override;
120 void visit(const Var &op) override;
121 void visit(const Store &op) override;
122 void visit(const Alloc &op) override;
123 void visit(const Free &op) override;
124 void visit(const Load &op) override;
125 void visit(const ReduceTo &op) override;
126 void visit(const IntConst &op) override;
127 void visit(const FloatConst &op) override;
128 void visit(const BoolConst &op) override;
129 void visit(const Add &op) override;
130 void visit(const Sub &op) override;
131 void visit(const Mul &op) override;
132 void visit(const RealDiv &op) override;
133 void visit(const FloorDiv &op) override;
134 void visit(const CeilDiv &op) override;
135 void visit(const RoundTowards0Div &op) override;
136 void visit(const Mod &op) override;
137 void visit(const Remainder &op) override;
138 void visit(const Min &op) override;
139 void visit(const Max &op) override;
140 void visit(const LT &op) override;
141 void visit(const LE &op) override;
142 void visit(const GT &op) override;
143 void visit(const GE &op) override;
144 void visit(const EQ &op) override;
145 void visit(const NE &op) override;
146 void visit(const LAnd &op) override;
147 void visit(const LOr &op) override;
148 void visit(const LNot &op) override;
149 void visit(const Sqrt &op) override;
150 void visit(const Exp &op) override;
151 void visit(const Ln &op) override;
152 void visit(const Square &op) override;
153 void visit(const Sigmoid &op) override;
154 void visit(const Sin &op) override;
155 void visit(const Cos &op) override;
156 void visit(const Tan &op) override;
157 void visit(const Tanh &op) override;
158 void visit(const Abs &op) override;
159 void visit(const Floor &op) override;
160 void visit(const Ceil &op) override;
161 void visit(const Unbound &op) override;
162 void visit(const IfExpr &op) override;
163 void visit(const Cast &op) override;
164 void visit(const For &op) override;
165 void visit(const If &op) override;
166 void visit(const Assert &op) override;
167 void visit(const Assume &op) override;
168 void visit(const Intrinsic &op) override;
169 void visit(const Eval &op) override;
170 void visit(const MatMul &op) override;
171 void visit(const MarkVersion &op) override;
172 void visit(const LoadAtVersion &op) override;
173};
174
180std::string toString(const AST &op);
181std::string toString(const AST &op, bool pretty);
182std::string toString(const AST &op, bool pretty, bool printAllId);
183std::string toString(const AST &op, bool pretty, bool printAllId,
184 bool dtypeInLoad, bool hexFloat = false,
185 bool compact = false, bool parenDespitePriority = false);
186std::string toString(const AST &op, bool pretty, bool printAllId,
187 bool dtypeInLoad, bool hexFloat, bool compact,
188 bool parenDespitePriority, bool printSourceLocation);
194inline std::string dumpAST(const AST &op, bool dtypeInLoad = false,
195 bool hexFloat = true) {
196 return toString(op, false, true, dtypeInLoad, hexFloat, true, false, false);
197}
198
210extern int OSTREAM_NO_PRETTY;
211std::function<std::ostream &(std::ostream &)> manipNoPrettyAST(bool flag);
220std::ostream &operator<<(std::ostream &os, const AST &op);
221
222} // namespace freetensor
223
224#endif // FREE_TENSOR_PRINT_AST_H
Definition: code_gen.h:28
std::ostream & os()
Definition: code_gen.h:87
Definition: data_type.h:106
Definition: id.h:18
Definition: print_ast.h:13
void visitStmt(const Stmt &op) override
Definition: print_ast.cc:134
void visit(const Func &op) override
Definition: print_ast.cc:141
PrintVisitor(bool printAllId=false, bool pretty=false, bool dtypeInLoad=false, bool hexFloat=false, bool compact=false, bool parenDespitePriority=false, bool printSourceLocation=false)
Definition: print_ast.h:85
Definition: allocator.h:9
std::function< std::ostream &(std::ostream &)> manipNoIdSign(bool flag)
Definition: id.cc:8
std::function< std::ostream &(std::ostream &)> manipNoPrettyAST(bool flag)
Definition: print_ast.cc:814
std::ostream & manipMetadataSkipLocation(std::ostream &)
Definition: metadata.cc:33
std::string toString(const AST &op)
Definition: print_ast.cc:784
Ref< ASTNode > AST
Definition: ast.h:149
std::string dumpAST(const AST &op, bool dtypeInLoad=false, bool hexFloat=true)
Definition: print_ast.h:194
std::ostream & manipMetadataWithLocation(std::ostream &)
Definition: metadata.cc:37
int OSTREAM_NO_PRETTY
Definition: print_ast.cc:813
std::ostream & operator<<(std::ostream &os, const Dependence &dep)
Definition: deps.cc:1404