1 #ifndef MSP_GL_SL_SYNTAX_H_
2 #define MSP_GL_SL_SYNTAX_H_
9 #include <msp/core/refptr.h>
10 #include <msp/core/variant.h>
12 #include "glsl_error.h"
13 #include "sourcemap.h"
15 #pragma push_macro("interface")
44 static const Operator operators[];
46 static const Operator &get_operator(const std::string &, Type);
63 Node(): source(GENERATED_SOURCE), line(1) { }
64 Node(const Node &n): source(n.source), line(n.line) { }
66 Node &operator=(const Node &);
70 virtual Node *clone() const = 0;
71 virtual void visit(NodeVisitor &) = 0;
75 class NodePtr: public RefPtr<T>
79 NodePtr(T *p): RefPtr<T>(p) { }
80 NodePtr(const NodePtr &p): RefPtr<T>(p ? p->clone() : 0) { }
81 NodePtr &operator=(const NodePtr &p) { RefPtr<T>::operator=(p); return *this; }
84 NodePtr(const RefPtr<U> &p): RefPtr<T>(p) { }
87 NodePtr(const NodePtr<U> &p): RefPtr<T>(p ? p->clone() : 0) { }
91 class NodeContainer: public C
95 NodeContainer(const NodeContainer &);
99 class NodeList: public NodeContainer<std::list<RefPtr<T> > >
103 class NodeArray: public NodeContainer<std::vector<RefPtr<T> > >
106 struct TypeDeclaration;
107 struct VariableDeclaration;
108 struct InterfaceBlock;
109 struct FunctionDeclaration;
111 struct Statement: Node
113 virtual Statement *clone() const = 0;
118 NodeList<Statement> body;
121 std::map<std::string, VariableDeclaration *> variables;
125 Block(const Block &);
127 virtual Block *clone() const { return new Block(*this); }
128 virtual void visit(NodeVisitor &);
131 struct Expression: Node
133 const Operator *oper;
135 TypeDeclaration *type;
140 virtual Expression *clone() const = 0;
143 struct Literal: Expression
148 virtual Literal *clone() const { return new Literal(*this); }
149 virtual void visit(NodeVisitor &);
152 struct ParenthesizedExpression: Expression
154 NodePtr<Expression> expression;
156 virtual ParenthesizedExpression *clone() const { return new ParenthesizedExpression(*this); }
157 virtual void visit(NodeVisitor &);
160 struct VariableReference: Expression
164 VariableDeclaration *declaration;
167 VariableReference(const VariableReference &);
169 virtual VariableReference *clone() const { return new VariableReference(*this); }
170 virtual void visit(NodeVisitor &);
173 struct InterfaceBlockReference: Expression
177 InterfaceBlock *declaration;
179 InterfaceBlockReference();
180 InterfaceBlockReference(const InterfaceBlockReference &);
182 virtual InterfaceBlockReference *clone() const { return new InterfaceBlockReference(*this); }
183 virtual void visit(NodeVisitor &);
186 struct MemberAccess: Expression
188 NodePtr<Expression> left;
191 VariableDeclaration *declaration;
194 MemberAccess(const MemberAccess &);
196 virtual MemberAccess *clone() const { return new MemberAccess(*this); }
197 virtual void visit(NodeVisitor &);
200 struct UnaryExpression: Expression
202 NodePtr<Expression> expression;
204 virtual UnaryExpression *clone() const { return new UnaryExpression(*this); }
205 virtual void visit(NodeVisitor &);
208 struct BinaryExpression: Expression
210 NodePtr<Expression> left;
211 NodePtr<Expression> right;
213 virtual BinaryExpression *clone() const { return new BinaryExpression(*this); }
214 virtual void visit(NodeVisitor &);
217 struct Assignment: BinaryExpression
219 bool self_referencing;
221 VariableDeclaration *target_declaration;
224 Assignment(const Assignment &);
226 virtual Assignment *clone() const { return new Assignment(*this); }
227 virtual void visit(NodeVisitor &);
230 struct FunctionCall: Expression
234 NodeArray<Expression> arguments;
236 FunctionDeclaration *declaration;
239 FunctionCall(const FunctionCall &);
241 virtual FunctionCall *clone() const { return new FunctionCall(*this); }
242 virtual void visit(NodeVisitor &);
245 struct ExpressionStatement: Statement
247 NodePtr<Expression> expression;
249 virtual ExpressionStatement *clone() const { return new ExpressionStatement(*this); }
250 virtual void visit(NodeVisitor &);
253 struct Import: Statement
257 virtual Import *clone() const { return new Import(*this); }
258 virtual void visit(NodeVisitor &);
261 struct Precision: Statement
263 std::string precision;
266 virtual Precision *clone() const { return new Precision(*this); }
267 virtual void visit(NodeVisitor &);
279 std::vector<Qualifier> qualifiers;
281 virtual Layout *clone() const { return new Layout(*this); }
282 virtual void visit(NodeVisitor &);
285 struct InterfaceLayout: Statement
287 std::string interface;
290 virtual InterfaceLayout *clone() const { return new InterfaceLayout(*this); }
291 virtual void visit(NodeVisitor &);
294 struct TypeDeclaration: Statement
298 virtual TypeDeclaration *clone() const = 0;
301 struct BasicTypeDeclaration: TypeDeclaration
319 TypeDeclaration *base_type;
321 BasicTypeDeclaration();
322 BasicTypeDeclaration(const BasicTypeDeclaration &);
324 virtual BasicTypeDeclaration *clone() const { return new BasicTypeDeclaration(*this); }
325 virtual void visit(NodeVisitor &);
328 struct ImageTypeDeclaration: TypeDeclaration
338 Dimensions dimensions;
344 TypeDeclaration *base_type;
346 ImageTypeDeclaration();
348 virtual ImageTypeDeclaration *clone() const { return new ImageTypeDeclaration(*this); }
349 virtual void visit(NodeVisitor &);
352 struct StructDeclaration: TypeDeclaration
356 InterfaceBlock *interface_block;
359 StructDeclaration(const StructDeclaration &);
360 ~StructDeclaration();
362 virtual StructDeclaration *clone() const { return new StructDeclaration(*this); }
363 virtual void visit(NodeVisitor &);
366 struct VariableDeclaration: Statement
368 NodePtr<Layout> layout;
370 std::string sampling;
371 std::string interpolation;
372 std::string interface;
373 std::string precision;
377 NodePtr<Expression> array_size;
378 NodePtr<Expression> init_expression;
380 TypeDeclaration *type_declaration;
381 VariableDeclaration *linked_declaration;
383 VariableDeclaration();
384 VariableDeclaration(const VariableDeclaration &);
385 ~VariableDeclaration();
387 virtual VariableDeclaration *clone() const { return new VariableDeclaration(*this); }
388 virtual void visit(NodeVisitor &);
391 struct InterfaceBlock: Statement
393 std::string interface;
395 NodePtr<Block> members;
396 std::string instance_name;
399 /* An interface block's ultimate base type is always a struct. The
400 immediate type may be either that same struct or an array of it. */
401 TypeDeclaration *type_declaration;
402 StructDeclaration *struct_declaration;
403 InterfaceBlock *linked_block;
406 InterfaceBlock(const InterfaceBlock &);
409 virtual InterfaceBlock *clone() const { return new InterfaceBlock(*this); }
410 virtual void visit(NodeVisitor &);
413 struct FunctionDeclaration: Statement
415 std::string return_type;
417 NodeArray<VariableDeclaration> parameters;
420 FunctionDeclaration *definition;
421 TypeDeclaration *return_type_declaration;
423 FunctionDeclaration();
424 FunctionDeclaration(const FunctionDeclaration &);
426 virtual FunctionDeclaration *clone() const { return new FunctionDeclaration(*this); }
427 virtual void visit(NodeVisitor &);
430 struct Conditional: Statement
432 NodePtr<Expression> condition;
436 virtual Conditional *clone() const { return new Conditional(*this); }
437 virtual void visit(NodeVisitor &);
440 struct Iteration: Statement
442 NodePtr<Statement> init_statement;
443 NodePtr<Expression> condition;
444 NodePtr<Expression> loop_expression;
447 virtual Iteration *clone() const { return new Iteration(*this); }
448 virtual void visit(NodeVisitor &);
451 struct Passthrough: Statement
453 NodePtr<Expression> subscript;
455 virtual Passthrough *clone() const { return new Passthrough(*this); }
456 virtual void visit(NodeVisitor &);
459 struct Return: Statement
461 NodePtr<Expression> expression;
463 virtual Return *clone() const { return new Return(*this); }
464 virtual void visit(NodeVisitor &);
467 struct Jump: Statement
471 virtual Jump *clone() const { return new Jump(*this); }
472 virtual void visit(NodeVisitor &);
488 std::map<std::string, TypeDeclaration *> types;
489 std::map<std::string, InterfaceBlock *> interface_blocks;
490 std::map<std::string, FunctionDeclaration *> functions;
491 std::map<std::string, unsigned> locations;
492 Features required_features;
493 std::vector<Diagnostic> diagnostics;
497 static const char *get_stage_name(Type);
502 SourceMap source_map;
504 std::list<Stage> stages;
513 #pragma pop_macro("interface")