1 #ifndef MSP_GL_SL_SYNTAX_H_
2 #define MSP_GL_SL_SYNTAX_H_
9 #include <msp/core/refptr.h>
11 #include "glsl_error.h"
12 #include "sourcemap.h"
14 #pragma push_macro("interface")
43 static const Operator operators[];
45 static const Operator &get_operator(const std::string &, Type);
61 Node(): source(GENERATED_SOURCE), line(1) { }
62 Node(const Node &n): source(n.source), line(n.line) { }
64 Node &operator=(const Node &);
68 virtual Node *clone() const = 0;
69 virtual void visit(NodeVisitor &) = 0;
73 class NodePtr: public RefPtr<T>
77 NodePtr(T *p): RefPtr<T>(p) { }
78 NodePtr(const NodePtr &p): RefPtr<T>(p ? p->clone() : 0) { }
79 NodePtr &operator=(const NodePtr &p) { RefPtr<T>::operator=(p); return *this; }
82 NodePtr(const RefPtr<U> &p): RefPtr<T>(p) { }
85 NodePtr(const NodePtr<U> &p): RefPtr<T>(p ? p->clone() : 0) { }
89 class NodeContainer: public C
93 NodeContainer(const NodeContainer &);
97 class NodeList: public NodeContainer<std::list<RefPtr<T> > >
101 class NodeArray: public NodeContainer<std::vector<RefPtr<T> > >
104 struct StructDeclaration;
105 struct VariableDeclaration;
106 struct InterfaceBlock;
107 struct FunctionDeclaration;
109 struct Statement: Node
111 virtual Statement *clone() const = 0;
116 NodeList<Statement> body;
119 std::map<std::string, VariableDeclaration *> variables;
123 Block(const Block &);
125 virtual Block *clone() const { return new Block(*this); }
126 virtual void visit(NodeVisitor &);
129 struct Expression: Node
131 const Operator *oper;
135 virtual Expression *clone() const = 0;
138 struct Literal: Expression
142 virtual Literal *clone() const { return new Literal(*this); }
143 virtual void visit(NodeVisitor &);
146 struct ParenthesizedExpression: Expression
148 NodePtr<Expression> expression;
150 virtual ParenthesizedExpression *clone() const { return new ParenthesizedExpression(*this); }
151 virtual void visit(NodeVisitor &);
154 struct VariableReference: Expression
158 VariableDeclaration *declaration;
161 VariableReference(const VariableReference &);
163 virtual VariableReference *clone() const { return new VariableReference(*this); }
164 virtual void visit(NodeVisitor &);
167 struct InterfaceBlockReference: Expression
171 InterfaceBlock *declaration;
173 InterfaceBlockReference();
174 InterfaceBlockReference(const InterfaceBlockReference &);
176 virtual InterfaceBlockReference *clone() const { return new InterfaceBlockReference(*this); }
177 virtual void visit(NodeVisitor &);
180 struct MemberAccess: Expression
182 NodePtr<Expression> left;
185 VariableDeclaration *declaration;
188 MemberAccess(const MemberAccess &);
190 virtual MemberAccess *clone() const { return new MemberAccess(*this); }
191 virtual void visit(NodeVisitor &);
194 struct UnaryExpression: Expression
196 NodePtr<Expression> expression;
198 virtual UnaryExpression *clone() const { return new UnaryExpression(*this); }
199 virtual void visit(NodeVisitor &);
202 struct BinaryExpression: Expression
204 NodePtr<Expression> left;
205 NodePtr<Expression> right;
207 virtual BinaryExpression *clone() const { return new BinaryExpression(*this); }
208 virtual void visit(NodeVisitor &);
211 struct Assignment: BinaryExpression
213 bool self_referencing;
215 VariableDeclaration *target_declaration;
218 Assignment(const Assignment &);
220 virtual Assignment *clone() const { return new Assignment(*this); }
221 virtual void visit(NodeVisitor &);
224 struct FunctionCall: Expression
228 NodeArray<Expression> arguments;
230 FunctionDeclaration *declaration;
233 FunctionCall(const FunctionCall &);
235 virtual FunctionCall *clone() const { return new FunctionCall(*this); }
236 virtual void visit(NodeVisitor &);
239 struct ExpressionStatement: Statement
241 NodePtr<Expression> expression;
243 virtual ExpressionStatement *clone() const { return new ExpressionStatement(*this); }
244 virtual void visit(NodeVisitor &);
247 struct Import: Statement
251 virtual Import *clone() const { return new Import(*this); }
252 virtual void visit(NodeVisitor &);
255 struct Precision: Statement
257 std::string precision;
260 virtual Precision *clone() const { return new Precision(*this); }
261 virtual void visit(NodeVisitor &);
273 std::vector<Qualifier> qualifiers;
275 virtual Layout *clone() const { return new Layout(*this); }
276 virtual void visit(NodeVisitor &);
279 struct InterfaceLayout: Statement
281 std::string interface;
284 virtual InterfaceLayout *clone() const { return new InterfaceLayout(*this); }
285 virtual void visit(NodeVisitor &);
288 struct StructDeclaration: Statement
295 virtual StructDeclaration *clone() const { return new StructDeclaration(*this); }
296 virtual void visit(NodeVisitor &);
299 struct VariableDeclaration: Statement
301 NodePtr<Layout> layout;
303 std::string sampling;
304 std::string interpolation;
305 std::string interface;
306 std::string precision;
310 NodePtr<Expression> array_size;
311 NodePtr<Expression> init_expression;
313 StructDeclaration *type_declaration;
314 VariableDeclaration *linked_declaration;
316 VariableDeclaration();
317 VariableDeclaration(const VariableDeclaration &);
318 ~VariableDeclaration();
320 virtual VariableDeclaration *clone() const { return new VariableDeclaration(*this); }
321 virtual void visit(NodeVisitor &);
324 struct InterfaceBlock: Statement
326 std::string interface;
329 std::string instance_name;
332 InterfaceBlock *linked_block;
335 InterfaceBlock(const InterfaceBlock &);
338 virtual InterfaceBlock *clone() const { return new InterfaceBlock(*this); }
339 virtual void visit(NodeVisitor &);
342 struct FunctionDeclaration: Statement
344 std::string return_type;
346 NodeArray<VariableDeclaration> parameters;
349 FunctionDeclaration *definition;
351 FunctionDeclaration();
352 FunctionDeclaration(const FunctionDeclaration &);
354 virtual FunctionDeclaration *clone() const { return new FunctionDeclaration(*this); }
355 virtual void visit(NodeVisitor &);
358 struct Conditional: Statement
360 NodePtr<Expression> condition;
364 virtual Conditional *clone() const { return new Conditional(*this); }
365 virtual void visit(NodeVisitor &);
368 struct Iteration: Statement
370 NodePtr<Statement> init_statement;
371 NodePtr<Expression> condition;
372 NodePtr<Expression> loop_expression;
375 virtual Iteration *clone() const { return new Iteration(*this); }
376 virtual void visit(NodeVisitor &);
379 struct Passthrough: Statement
381 NodePtr<Expression> subscript;
383 virtual Passthrough *clone() const { return new Passthrough(*this); }
384 virtual void visit(NodeVisitor &);
387 struct Return: Statement
389 NodePtr<Expression> expression;
391 virtual Return *clone() const { return new Return(*this); }
392 virtual void visit(NodeVisitor &);
395 struct Jump: Statement
399 virtual Jump *clone() const { return new Jump(*this); }
400 virtual void visit(NodeVisitor &);
416 std::map<std::string, StructDeclaration *> types;
417 std::map<std::string, InterfaceBlock *> interface_blocks;
418 std::map<std::string, FunctionDeclaration *> functions;
419 std::map<std::string, unsigned> locations;
420 Features required_features;
421 std::vector<Diagnostic> diagnostics;
425 static const char *get_stage_name(Type);
430 SourceMap source_map;
432 std::list<Stage> stages;
441 #pragma pop_macro("interface")