1 #ifndef MSP_GL_SL_SYNTAX_H_
2 #define MSP_GL_SL_SYNTAX_H_
9 #include <msp/core/refptr.h>
11 #include "sourcemap.h"
13 #pragma push_macro("interface")
41 static const Operator operators[];
50 Node(const Node &) { }
52 Node &operator=(const Node &);
56 virtual Node *clone() const = 0;
57 virtual void visit(NodeVisitor &) = 0;
61 class NodePtr: public RefPtr<T>
65 NodePtr(T *p): RefPtr<T>(p) { }
66 NodePtr(const NodePtr &p): RefPtr<T>(p ? p->clone() : 0) { }
67 NodePtr &operator=(const NodePtr &p) { RefPtr<T>::operator=(p); return *this; }
70 NodePtr(const RefPtr<U> &p): RefPtr<T>(p) { }
73 NodePtr(const NodePtr<U> &p): RefPtr<T>(p ? p->clone() : 0) { }
77 class NodeContainer: public C
81 NodeContainer(const NodeContainer &);
85 class NodeList: public NodeContainer<std::list<RefPtr<T> > >
89 class NodeArray: public NodeContainer<std::vector<RefPtr<T> > >
92 struct StructDeclaration;
93 struct VariableDeclaration;
94 struct InterfaceBlock;
95 struct FunctionDeclaration;
97 struct Statement: Node
104 virtual Statement *clone() const = 0;
109 NodeList<Statement> body;
111 std::map<std::string, VariableDeclaration *> variables;
115 Block(const Block &);
117 virtual Block *clone() const { return new Block(*this); }
118 virtual void visit(NodeVisitor &);
121 struct Expression: Node
123 virtual Expression *clone() const = 0;
126 struct Literal: Expression
130 virtual Literal *clone() const { return new Literal(*this); }
131 virtual void visit(NodeVisitor &);
134 struct ParenthesizedExpression: Expression
136 NodePtr<Expression> expression;
138 virtual ParenthesizedExpression *clone() const { return new ParenthesizedExpression(*this); }
139 virtual void visit(NodeVisitor &);
142 struct VariableReference: Expression
145 VariableDeclaration *declaration;
148 VariableReference(const VariableReference &);
150 virtual VariableReference *clone() const { return new VariableReference(*this); }
151 virtual void visit(NodeVisitor &);
154 struct InterfaceBlockReference: Expression
157 InterfaceBlock *declaration;
159 InterfaceBlockReference();
160 InterfaceBlockReference(const InterfaceBlockReference &);
162 virtual InterfaceBlockReference *clone() const { return new InterfaceBlockReference(*this); }
163 virtual void visit(NodeVisitor &);
166 struct MemberAccess: Expression
168 NodePtr<Expression> left;
170 VariableDeclaration *declaration;
173 MemberAccess(const MemberAccess &);
175 virtual MemberAccess *clone() const { return new MemberAccess(*this); }
176 virtual void visit(NodeVisitor &);
179 struct UnaryExpression: Expression
182 NodePtr<Expression> expression;
187 virtual UnaryExpression *clone() const { return new UnaryExpression(*this); }
188 virtual void visit(NodeVisitor &);
191 struct BinaryExpression: Expression
193 NodePtr<Expression> left;
195 NodePtr<Expression> right;
198 virtual BinaryExpression *clone() const { return new BinaryExpression(*this); }
199 virtual void visit(NodeVisitor &);
202 struct Assignment: BinaryExpression
204 bool self_referencing;
205 VariableDeclaration *target_declaration;
208 Assignment(const Assignment &);
210 virtual Assignment *clone() const { return new Assignment(*this); }
211 virtual void visit(NodeVisitor &);
214 struct FunctionCall: Expression
217 FunctionDeclaration *declaration;
219 NodeArray<Expression> arguments;
222 FunctionCall(const FunctionCall &);
224 virtual FunctionCall *clone() const { return new FunctionCall(*this); }
225 virtual void visit(NodeVisitor &);
228 struct ExpressionStatement: Statement
230 NodePtr<Expression> expression;
232 virtual ExpressionStatement *clone() const { return new ExpressionStatement(*this); }
233 virtual void visit(NodeVisitor &);
236 struct Import: Statement
240 virtual Import *clone() const { return new Import(*this); }
241 virtual void visit(NodeVisitor &);
244 struct Precision: Statement
246 std::string precision;
249 virtual Precision *clone() const { return new Precision(*this); }
250 virtual void visit(NodeVisitor &);
262 std::vector<Qualifier> qualifiers;
264 virtual Layout *clone() const { return new Layout(*this); }
265 virtual void visit(NodeVisitor &);
268 struct InterfaceLayout: Statement
270 std::string interface;
273 virtual InterfaceLayout *clone() const { return new InterfaceLayout(*this); }
274 virtual void visit(NodeVisitor &);
277 struct StructDeclaration: Statement
284 virtual StructDeclaration *clone() const { return new StructDeclaration(*this); }
285 virtual void visit(NodeVisitor &);
288 struct VariableDeclaration: Statement
291 std::string sampling;
292 std::string interpolation;
293 std::string interface;
294 std::string precision;
296 StructDeclaration *type_declaration;
299 NodePtr<Expression> array_size;
300 NodePtr<Expression> init_expression;
301 VariableDeclaration *linked_declaration;
302 NodePtr<Layout> layout;
304 VariableDeclaration();
305 VariableDeclaration(const VariableDeclaration &);
306 ~VariableDeclaration();
308 virtual VariableDeclaration *clone() const { return new VariableDeclaration(*this); }
309 virtual void visit(NodeVisitor &);
312 struct InterfaceBlock: Statement
314 std::string interface;
317 std::string instance_name;
319 InterfaceBlock *linked_block;
322 InterfaceBlock(const InterfaceBlock &);
325 virtual InterfaceBlock *clone() const { return new InterfaceBlock(*this); }
326 virtual void visit(NodeVisitor &);
329 struct FunctionDeclaration: Statement
331 std::string return_type;
333 NodeArray<VariableDeclaration> parameters;
334 FunctionDeclaration *definition;
337 FunctionDeclaration();
338 FunctionDeclaration(const FunctionDeclaration &);
340 virtual FunctionDeclaration *clone() const { return new FunctionDeclaration(*this); }
341 virtual void visit(NodeVisitor &);
344 struct Conditional: Statement
346 NodePtr<Expression> condition;
350 virtual Conditional *clone() const { return new Conditional(*this); }
351 virtual void visit(NodeVisitor &);
354 struct Iteration: Statement
356 NodePtr<Node> init_statement;
357 NodePtr<Expression> condition;
358 NodePtr<Expression> loop_expression;
361 virtual Iteration *clone() const { return new Iteration(*this); }
362 virtual void visit(NodeVisitor &);
365 struct Passthrough: Statement
367 NodePtr<Expression> subscript;
369 virtual Passthrough *clone() const { return new Passthrough(*this); }
370 virtual void visit(NodeVisitor &);
373 struct Return: Statement
375 NodePtr<Expression> expression;
377 virtual Return *clone() const { return new Return(*this); }
378 virtual void visit(NodeVisitor &);
381 struct Jump: Statement
385 virtual Jump *clone() const { return new Jump(*this); }
386 virtual void visit(NodeVisitor &);
402 std::map<std::string, StructDeclaration *> types;
403 std::map<std::string, InterfaceBlock *> interface_blocks;
404 std::map<std::string, unsigned> locations;
405 Features required_features;
409 static const char *get_stage_name(Type);
414 SourceMap source_map;
416 std::list<Stage> stages;
425 #pragma pop_macro("interface")