1 #ifndef MSP_GL_SL_SYNTAX_H_
2 #define MSP_GL_SL_SYNTAX_H_
8 #include <msp/core/refptr.h>
10 #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 FunctionDeclaration;
96 struct Statement: Node
103 virtual Statement *clone() const = 0;
108 NodeList<Statement> body;
110 std::map<std::string, StructDeclaration *> types;
111 std::map<std::string, VariableDeclaration *> variables;
115 virtual Block *clone() const { return new Block(*this); }
116 virtual void visit(NodeVisitor &);
119 struct Expression: Node
121 virtual Expression *clone() const = 0;
124 struct Literal: Expression
128 virtual Literal *clone() const { return new Literal(*this); }
129 virtual void visit(NodeVisitor &);
132 struct ParenthesizedExpression: Expression
134 NodePtr<Expression> expression;
136 virtual ParenthesizedExpression *clone() const { return new ParenthesizedExpression(*this); }
137 virtual void visit(NodeVisitor &);
140 struct VariableReference: Expression
143 VariableDeclaration *declaration;
146 VariableReference(const VariableReference &);
148 virtual VariableReference *clone() const { return new VariableReference(*this); }
149 virtual void visit(NodeVisitor &);
152 struct MemberAccess: Expression
154 NodePtr<Expression> left;
156 VariableDeclaration *declaration;
159 MemberAccess(const MemberAccess &);
161 virtual MemberAccess *clone() const { return new MemberAccess(*this); }
162 virtual void visit(NodeVisitor &);
165 struct UnaryExpression: Expression
168 NodePtr<Expression> expression;
173 virtual UnaryExpression *clone() const { return new UnaryExpression(*this); }
174 virtual void visit(NodeVisitor &);
177 struct BinaryExpression: Expression
179 NodePtr<Expression> left;
181 NodePtr<Expression> right;
184 virtual BinaryExpression *clone() const { return new BinaryExpression(*this); }
185 virtual void visit(NodeVisitor &);
188 struct Assignment: BinaryExpression
190 bool self_referencing;
191 VariableDeclaration *target_declaration;
194 Assignment(const Assignment &);
196 virtual Assignment *clone() const { return new Assignment(*this); }
197 virtual void visit(NodeVisitor &);
200 struct FunctionCall: Expression
203 FunctionDeclaration *declaration;
205 NodeArray<Expression> arguments;
208 FunctionCall(const FunctionCall &);
210 virtual FunctionCall *clone() const { return new FunctionCall(*this); }
211 virtual void visit(NodeVisitor &);
214 struct ExpressionStatement: Statement
216 NodePtr<Expression> expression;
218 virtual ExpressionStatement *clone() const { return new ExpressionStatement(*this); }
219 virtual void visit(NodeVisitor &);
222 struct Import: Statement
226 virtual Import *clone() const { return new Import(*this); }
227 virtual void visit(NodeVisitor &);
230 struct Precision: Statement
232 std::string precision;
235 virtual Precision *clone() const { return new Precision(*this); }
236 virtual void visit(NodeVisitor &);
243 // TODO the standard calls this name, not identifier
244 std::string identifier;
248 std::vector<Qualifier> qualifiers;
250 virtual Layout *clone() const { return new Layout(*this); }
251 virtual void visit(NodeVisitor &);
254 struct InterfaceLayout: Statement
256 std::string interface;
259 virtual InterfaceLayout *clone() const { return new InterfaceLayout(*this); }
260 virtual void visit(NodeVisitor &);
263 struct StructDeclaration: Statement
270 virtual StructDeclaration *clone() const { return new StructDeclaration(*this); }
271 virtual void visit(NodeVisitor &);
274 struct VariableDeclaration: Statement
277 std::string sampling;
278 std::string interpolation;
279 std::string interface;
280 std::string precision;
282 StructDeclaration *type_declaration;
285 NodePtr<Expression> array_size;
286 NodePtr<Expression> init_expression;
287 VariableDeclaration *linked_declaration;
288 NodePtr<Layout> layout;
290 VariableDeclaration();
291 VariableDeclaration(const VariableDeclaration &);
293 virtual VariableDeclaration *clone() const { return new VariableDeclaration(*this); }
294 virtual void visit(NodeVisitor &);
297 struct InterfaceBlock: Statement
299 std::string interface;
302 std::string instance_name;
307 virtual InterfaceBlock *clone() const { return new InterfaceBlock(*this); }
308 virtual void visit(NodeVisitor &);
311 struct FunctionDeclaration: Statement
313 std::string return_type;
315 NodeArray<VariableDeclaration> parameters;
316 FunctionDeclaration *definition;
319 FunctionDeclaration();
320 FunctionDeclaration(const FunctionDeclaration &);
322 virtual FunctionDeclaration *clone() const { return new FunctionDeclaration(*this); }
323 virtual void visit(NodeVisitor &);
326 struct Conditional: Statement
328 NodePtr<Expression> condition;
332 virtual Conditional *clone() const { return new Conditional(*this); }
333 virtual void visit(NodeVisitor &);
336 struct Iteration: Statement
338 NodePtr<Node> init_statement;
339 NodePtr<Expression> condition;
340 NodePtr<Expression> loop_expression;
343 virtual Iteration *clone() const { return new Iteration(*this); }
344 virtual void visit(NodeVisitor &);
347 struct Passthrough: Statement
349 NodePtr<Expression> subscript;
351 virtual Passthrough *clone() const { return new Passthrough(*this); }
352 virtual void visit(NodeVisitor &);
355 struct Return: Statement
357 NodePtr<Expression> expression;
359 virtual Return *clone() const { return new Return(*this); }
360 virtual void visit(NodeVisitor &);
363 struct Jump: Statement
367 virtual Jump *clone() const { return new Jump(*this); }
368 virtual void visit(NodeVisitor &);
384 std::map<std::string, VariableDeclaration *> in_variables;
385 std::map<std::string, VariableDeclaration *> out_variables;
386 std::map<std::string, unsigned> locations;
387 Version required_version;
388 std::vector<const Extension *> required_extensions;
392 static const char *get_stage_name(Type);
397 SourceMap source_map;
399 std::list<Stage> stages;
408 #pragma pop_macro("interface")