1 #ifndef MSP_GL_PROGRAMSYNTAX_H_
2 #define MSP_GL_PROGRAMSYNTAX_H_
8 #include <msp/core/refptr.h>
13 namespace ProgramSyntax {
20 Node &operator=(const Node &);
24 virtual Node *clone() const = 0;
25 virtual void visit(NodeVisitor &) = 0;
28 struct StructDeclaration;
29 struct VariableDeclaration;
30 struct FunctionDeclaration;
34 std::list<RefPtr<Node> > body;
36 std::map<std::string, StructDeclaration *> types;
37 std::map<std::string, VariableDeclaration *> variables;
41 virtual Block *clone() const { return new Block(*this); }
42 virtual void visit(NodeVisitor &);
45 struct Expression: Node
47 virtual Expression *clone() const = 0;
50 struct Literal: Expression
54 virtual Literal *clone() const { return new Literal(*this); }
55 virtual void visit(NodeVisitor &);
58 struct ParenthesizedExpression: Expression
60 RefPtr<Expression> expression;
62 virtual ParenthesizedExpression *clone() const { return new ParenthesizedExpression(*this); }
63 virtual void visit(NodeVisitor &);
66 struct VariableReference: Expression
69 VariableDeclaration *declaration;
73 virtual VariableReference *clone() const { return new VariableReference(*this); }
74 virtual void visit(NodeVisitor &);
77 struct MemberAccess: Expression
79 RefPtr<Expression> left;
81 VariableDeclaration *declaration;
83 virtual MemberAccess *clone() const { return new MemberAccess(*this); }
84 virtual void visit(NodeVisitor &);
87 struct UnaryExpression: Expression
90 RefPtr<Expression> expression;
95 virtual UnaryExpression *clone() const { return new UnaryExpression(*this); }
96 virtual void visit(NodeVisitor &);
99 struct BinaryExpression: Expression
101 RefPtr<Expression> left;
103 RefPtr<Expression> right;
106 virtual BinaryExpression *clone() const { return new BinaryExpression(*this); }
107 virtual void visit(NodeVisitor &);
110 struct Assignment: BinaryExpression
112 bool self_referencing;
113 VariableDeclaration *target_declaration;
117 virtual Assignment *clone() const { return new Assignment(*this); }
118 virtual void visit(NodeVisitor &);
121 struct FunctionCall: Expression
124 FunctionDeclaration *declaration;
126 std::vector<RefPtr<Expression> > arguments;
130 virtual FunctionCall *clone() const { return new FunctionCall(*this); }
131 virtual void visit(NodeVisitor &);
134 struct ExpressionStatement: Node
136 RefPtr<Expression> expression;
138 virtual ExpressionStatement *clone() const { return new ExpressionStatement(*this); }
139 virtual void visit(NodeVisitor &);
146 virtual Import *clone() const { return new Import(*this); }
147 virtual void visit(NodeVisitor &);
154 std::string identifier;
158 std::vector<Qualifier> qualifiers;
160 virtual Layout *clone() const { return new Layout(*this); }
161 virtual void visit(NodeVisitor &);
164 struct InterfaceLayout: Node
166 std::string interface;
169 virtual InterfaceLayout *clone() const { return new InterfaceLayout(*this); }
170 virtual void visit(NodeVisitor &);
173 struct StructDeclaration: Node
180 virtual StructDeclaration *clone() const { return new StructDeclaration(*this); }
181 virtual void visit(NodeVisitor &);
184 struct VariableDeclaration: Node
187 std::string sampling;
188 std::string interface;
190 StructDeclaration *type_declaration;
193 RefPtr<Expression> array_size;
194 RefPtr<Expression> init_expression;
195 VariableDeclaration *linked_declaration;
196 RefPtr<Layout> layout;
198 VariableDeclaration();
200 virtual VariableDeclaration *clone() const { return new VariableDeclaration(*this); }
201 virtual void visit(NodeVisitor &);
204 struct InterfaceBlock: Node
206 std::string interface;
209 std::string instance_name;
214 virtual InterfaceBlock *clone() const { return new InterfaceBlock(*this); }
215 virtual void visit(NodeVisitor &);
218 struct FunctionDeclaration: Node
220 std::string return_type;
222 std::vector<RefPtr<VariableDeclaration> > parameters;
223 FunctionDeclaration *definition;
226 FunctionDeclaration();
227 FunctionDeclaration(const FunctionDeclaration &);
229 virtual FunctionDeclaration *clone() const { return new FunctionDeclaration(*this); }
230 virtual void visit(NodeVisitor &);
233 struct Conditional: Node
235 RefPtr<Expression> condition;
239 virtual Conditional *clone() const { return new Conditional(*this); }
240 virtual void visit(NodeVisitor &);
243 struct Iteration: Node
245 RefPtr<Node> init_statement;
246 RefPtr<Expression> condition;
247 RefPtr<Expression> loop_expression;
250 virtual Iteration *clone() const { return new Iteration(*this); }
251 virtual void visit(NodeVisitor &);
254 struct Passthrough: Node
256 RefPtr<Expression> subscript;
258 virtual Passthrough *clone() const { return new Passthrough(*this); }
259 virtual void visit(NodeVisitor &);
264 RefPtr<Expression> expression;
266 virtual Return *clone() const { return new Return(*this); }
267 virtual void visit(NodeVisitor &);
272 virtual ~NodeVisitor() { }
274 virtual void visit(Block &) { }
275 virtual void visit(Literal &) { }
276 virtual void visit(ParenthesizedExpression &) { }
277 virtual void visit(VariableReference &) { }
278 virtual void visit(MemberAccess &) { }
279 virtual void visit(UnaryExpression &) { }
280 virtual void visit(BinaryExpression &) { }
281 virtual void visit(Assignment &);
282 virtual void visit(FunctionCall &) { }
283 virtual void visit(ExpressionStatement &) { }
284 virtual void visit(Import &) { }
285 virtual void visit(Layout &) { }
286 virtual void visit(InterfaceLayout &) { }
287 virtual void visit(StructDeclaration &) { }
288 virtual void visit(VariableDeclaration &) { }
289 virtual void visit(InterfaceBlock &) { }
290 virtual void visit(FunctionDeclaration &) { }
291 virtual void visit(Conditional &) { }
292 virtual void visit(Iteration &) { }
293 virtual void visit(Passthrough &) { }
294 virtual void visit(Return &) { }
297 struct TraversingVisitor: NodeVisitor
299 virtual void visit(Block &);
300 virtual void visit(ParenthesizedExpression &);
301 virtual void visit(MemberAccess &);
302 virtual void visit(UnaryExpression &);
303 virtual void visit(BinaryExpression &);
304 virtual void visit(FunctionCall &);
305 virtual void visit(ExpressionStatement &);
306 virtual void visit(InterfaceLayout &);
307 virtual void visit(StructDeclaration &);
308 virtual void visit(VariableDeclaration &);
309 virtual void visit(InterfaceBlock &);
310 virtual void visit(FunctionDeclaration &);
311 virtual void visit(Conditional &);
312 virtual void visit(Iteration &);
313 virtual void visit(Passthrough &);
314 virtual void visit(Return &);
329 ProgramSyntax::Block content;
330 std::map<std::string, VariableDeclaration *> in_variables;
331 std::map<std::string, VariableDeclaration *> out_variables;
332 std::map<std::string, unsigned> locations;
333 Version required_version;
341 std::list<Stage> stages;
346 } // namespace ProgramSyntax