1 #ifndef MSP_GL_PROGRAMSYNTAX_H_
2 #define MSP_GL_PROGRAMSYNTAX_H_
10 namespace ProgramSyntax {
17 Node &operator=(const Node &);
21 virtual Node *clone() const = 0;
22 virtual void visit(NodeVisitor &) = 0;
32 NodePtr(T *n = 0): node(n) { }
33 NodePtr(const NodePtr &p): node(clone(p.node)) { }
34 NodePtr &operator=(const NodePtr &p) { delete node; node = clone(p.node); return *this; }
35 ~NodePtr() { delete node; }
38 static T *clone(T *n) { return n ? n->clone() : 0; }
41 T *operator->() { return node; }
42 const T *operator->() const { return node; }
43 operator void *() const { return node; }
46 struct VariableDeclaration;
50 std::vector<NodePtr<Node> > body;
55 virtual Block *clone() const { return new Block(*this); }
56 virtual void visit(NodeVisitor &);
59 struct Expression: Node
61 virtual Expression *clone() const = 0;
64 struct Literal: Expression
68 virtual Literal *clone() const { return new Literal(*this); }
69 virtual void visit(NodeVisitor &);
72 struct ParenthesizedExpression: Expression
74 NodePtr<Expression> expression;
76 virtual ParenthesizedExpression *clone() const { return new ParenthesizedExpression(*this); }
77 virtual void visit(NodeVisitor &);
80 struct VariableReference: Expression
84 virtual VariableReference *clone() const { return new VariableReference(*this); }
85 virtual void visit(NodeVisitor &);
88 struct MemberAccess: Expression
90 NodePtr<Expression> left;
93 virtual MemberAccess *clone() const { return new MemberAccess(*this); }
94 virtual void visit(NodeVisitor &);
97 struct UnaryExpression: Expression
100 NodePtr<Expression> expression;
105 virtual UnaryExpression *clone() const { return new UnaryExpression(*this); }
106 virtual void visit(NodeVisitor &);
109 struct BinaryExpression: Expression
111 NodePtr<Expression> left;
113 NodePtr<Expression> right;
119 virtual BinaryExpression *clone() const { return new BinaryExpression(*this); }
120 virtual void visit(NodeVisitor &);
123 struct FunctionCall: Expression
127 std::vector<NodePtr<Expression> > arguments;
131 virtual FunctionCall *clone() const { return new FunctionCall(*this); }
132 virtual void visit(NodeVisitor &);
135 struct ExpressionStatement: Node
137 NodePtr<Expression> expression;
139 virtual ExpressionStatement *clone() const { return new ExpressionStatement(*this); }
140 virtual void visit(NodeVisitor &);
147 std::string identifier;
151 std::vector<Qualifier> qualifiers;
152 std::string interface;
154 virtual Layout *clone() const { return new Layout(*this); }
155 virtual void visit(NodeVisitor &);
158 struct StructDeclaration: Node
165 virtual StructDeclaration *clone() const { return new StructDeclaration(*this); }
166 virtual void visit(NodeVisitor &);
169 struct VariableDeclaration: Node
172 std::string sampling;
173 std::string interface;
177 NodePtr<Expression> array_size;
178 NodePtr<Expression> init_expression;
180 VariableDeclaration();
182 virtual VariableDeclaration *clone() const { return new VariableDeclaration(*this); }
183 virtual void visit(NodeVisitor &);
186 struct InterfaceBlock: Node
188 std::string interface;
194 virtual InterfaceBlock *clone() const { return new InterfaceBlock(*this); }
195 virtual void visit(NodeVisitor &);
198 struct FunctionDeclaration: Node
200 std::string return_type;
202 std::vector<NodePtr<VariableDeclaration> > parameters;
206 FunctionDeclaration();
208 virtual FunctionDeclaration *clone() const { return new FunctionDeclaration(*this); }
209 virtual void visit(NodeVisitor &);
212 struct Conditional: Node
214 Expression *condition;
218 virtual Conditional *clone() const { return new Conditional(*this); }
219 virtual void visit(NodeVisitor &);
222 struct Iteration: Node
224 NodePtr<Node> init_statement;
225 NodePtr<Expression> condition;
226 NodePtr<Expression> loop_expression;
229 virtual Iteration *clone() const { return new Iteration(*this); }
230 virtual void visit(NodeVisitor &);
235 NodePtr<Expression> expression;
237 virtual Return *clone() const { return new Return(*this); }
238 virtual void visit(NodeVisitor &);
243 virtual ~NodeVisitor() { }
245 virtual void visit(Block &) { }
246 virtual void visit(Literal &) { }
247 virtual void visit(ParenthesizedExpression &) { }
248 virtual void visit(VariableReference &) { }
249 virtual void visit(MemberAccess &) { }
250 virtual void visit(UnaryExpression &) { }
251 virtual void visit(BinaryExpression &) { }
252 virtual void visit(FunctionCall &) { }
253 virtual void visit(ExpressionStatement &) { }
254 virtual void visit(Layout &) { }
255 virtual void visit(StructDeclaration &) { }
256 virtual void visit(VariableDeclaration &) { }
257 virtual void visit(InterfaceBlock &) { }
258 virtual void visit(FunctionDeclaration &) { }
259 virtual void visit(Conditional &) { }
260 virtual void visit(Iteration &) { }
261 virtual void visit(Return &) { }
276 ProgramSyntax::Block content;
278 Context(ContextType);
283 Context global_context;
284 Context vertex_context;
285 Context geometry_context;
286 Context fragment_context;
287 std::map<std::string, StructDeclaration *> structs;
292 } // namespace ProgramSyntax