1 #ifndef MSP_GL_PROGRAMSYNTAX_H_
2 #define MSP_GL_PROGRAMSYNTAX_H_
11 namespace ProgramSyntax {
18 Node &operator=(const Node &);
22 virtual Node *clone() const = 0;
23 virtual void visit(NodeVisitor &) = 0;
33 NodePtr(T *n = 0): node(n) { }
34 NodePtr(const NodePtr &p): node(clone(p.node)) { }
35 NodePtr &operator=(const NodePtr &p) { delete node; node = clone(p.node); return *this; }
36 ~NodePtr() { delete node; }
39 static T *clone(T *n) { return n ? n->clone() : 0; }
42 T *operator->() { return node; }
43 const T *operator->() const { return node; }
44 T &operator*() { return *node; }
45 const T &operator*() const { return *node; }
46 operator void *() const { return node; }
49 struct StructDeclaration;
50 struct VariableDeclaration;
54 std::list<NodePtr<Node> > body;
56 std::map<std::string, StructDeclaration *> types;
57 std::map<std::string, VariableDeclaration *> variables;
61 virtual Block *clone() const { return new Block(*this); }
62 virtual void visit(NodeVisitor &);
65 struct Expression: Node
67 virtual Expression *clone() const = 0;
70 struct Literal: Expression
74 virtual Literal *clone() const { return new Literal(*this); }
75 virtual void visit(NodeVisitor &);
78 struct ParenthesizedExpression: Expression
80 NodePtr<Expression> expression;
82 virtual ParenthesizedExpression *clone() const { return new ParenthesizedExpression(*this); }
83 virtual void visit(NodeVisitor &);
86 struct VariableReference: Expression
89 VariableDeclaration *declaration;
93 virtual VariableReference *clone() const { return new VariableReference(*this); }
94 virtual void visit(NodeVisitor &);
97 struct MemberAccess: Expression
99 NodePtr<Expression> left;
101 VariableDeclaration *declaration;
103 virtual MemberAccess *clone() const { return new MemberAccess(*this); }
104 virtual void visit(NodeVisitor &);
107 struct UnaryExpression: Expression
110 NodePtr<Expression> expression;
115 virtual UnaryExpression *clone() const { return new UnaryExpression(*this); }
116 virtual void visit(NodeVisitor &);
119 struct BinaryExpression: Expression
121 NodePtr<Expression> left;
123 NodePtr<Expression> right;
129 virtual BinaryExpression *clone() const { return new BinaryExpression(*this); }
130 virtual void visit(NodeVisitor &);
133 struct FunctionCall: Expression
137 std::vector<NodePtr<Expression> > arguments;
141 virtual FunctionCall *clone() const { return new FunctionCall(*this); }
142 virtual void visit(NodeVisitor &);
145 struct ExpressionStatement: Node
147 NodePtr<Expression> expression;
149 virtual ExpressionStatement *clone() const { return new ExpressionStatement(*this); }
150 virtual void visit(NodeVisitor &);
157 std::string identifier;
161 std::vector<Qualifier> qualifiers;
162 std::string interface;
164 virtual Layout *clone() const { return new Layout(*this); }
165 virtual void visit(NodeVisitor &);
168 struct StructDeclaration: Node
175 virtual StructDeclaration *clone() const { return new StructDeclaration(*this); }
176 virtual void visit(NodeVisitor &);
179 struct VariableDeclaration: Node
182 std::string sampling;
183 std::string interface;
185 StructDeclaration *type_declaration;
188 NodePtr<Expression> array_size;
189 NodePtr<Expression> init_expression;
191 VariableDeclaration();
193 virtual VariableDeclaration *clone() const { return new VariableDeclaration(*this); }
194 virtual void visit(NodeVisitor &);
197 struct InterfaceBlock: Node
199 std::string interface;
205 virtual InterfaceBlock *clone() const { return new InterfaceBlock(*this); }
206 virtual void visit(NodeVisitor &);
209 struct FunctionDeclaration: Node
211 std::string return_type;
213 std::vector<NodePtr<VariableDeclaration> > parameters;
217 FunctionDeclaration();
219 virtual FunctionDeclaration *clone() const { return new FunctionDeclaration(*this); }
220 virtual void visit(NodeVisitor &);
223 struct Conditional: Node
225 Expression *condition;
229 virtual Conditional *clone() const { return new Conditional(*this); }
230 virtual void visit(NodeVisitor &);
233 struct Iteration: Node
235 NodePtr<Node> init_statement;
236 NodePtr<Expression> condition;
237 NodePtr<Expression> loop_expression;
240 virtual Iteration *clone() const { return new Iteration(*this); }
241 virtual void visit(NodeVisitor &);
246 NodePtr<Expression> expression;
248 virtual Return *clone() const { return new Return(*this); }
249 virtual void visit(NodeVisitor &);
254 virtual ~NodeVisitor() { }
256 virtual void visit(Block &) { }
257 virtual void visit(Literal &) { }
258 virtual void visit(ParenthesizedExpression &) { }
259 virtual void visit(VariableReference &) { }
260 virtual void visit(MemberAccess &) { }
261 virtual void visit(UnaryExpression &) { }
262 virtual void visit(BinaryExpression &) { }
263 virtual void visit(FunctionCall &) { }
264 virtual void visit(ExpressionStatement &) { }
265 virtual void visit(Layout &) { }
266 virtual void visit(StructDeclaration &) { }
267 virtual void visit(VariableDeclaration &) { }
268 virtual void visit(InterfaceBlock &) { }
269 virtual void visit(FunctionDeclaration &) { }
270 virtual void visit(Conditional &) { }
271 virtual void visit(Iteration &) { }
272 virtual void visit(Return &) { }
275 struct TraversingVisitor: NodeVisitor
277 virtual void visit(Block &);
278 virtual void visit(ParenthesizedExpression &);
279 virtual void visit(MemberAccess &);
280 virtual void visit(UnaryExpression &);
281 virtual void visit(BinaryExpression &);
282 virtual void visit(FunctionCall &);
283 virtual void visit(ExpressionStatement &);
284 virtual void visit(StructDeclaration &);
285 virtual void visit(VariableDeclaration &);
286 virtual void visit(InterfaceBlock &);
287 virtual void visit(FunctionDeclaration &);
288 virtual void visit(Conditional &);
289 virtual void visit(Iteration &);
290 virtual void visit(Return &);
305 ProgramSyntax::Block content;
307 Context(ContextType);
312 Context global_context;
313 Context vertex_context;
314 Context geometry_context;
315 Context fragment_context;
320 } // namespace ProgramSyntax