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 operator void *() const { return node; }
47 struct VariableDeclaration;
51 std::list<NodePtr<Node> > body;
56 virtual Block *clone() const { return new Block(*this); }
57 virtual void visit(NodeVisitor &);
60 struct Expression: Node
62 virtual Expression *clone() const = 0;
65 struct Literal: Expression
69 virtual Literal *clone() const { return new Literal(*this); }
70 virtual void visit(NodeVisitor &);
73 struct ParenthesizedExpression: Expression
75 NodePtr<Expression> expression;
77 virtual ParenthesizedExpression *clone() const { return new ParenthesizedExpression(*this); }
78 virtual void visit(NodeVisitor &);
81 struct VariableReference: Expression
85 virtual VariableReference *clone() const { return new VariableReference(*this); }
86 virtual void visit(NodeVisitor &);
89 struct MemberAccess: Expression
91 NodePtr<Expression> left;
94 virtual MemberAccess *clone() const { return new MemberAccess(*this); }
95 virtual void visit(NodeVisitor &);
98 struct UnaryExpression: Expression
101 NodePtr<Expression> expression;
106 virtual UnaryExpression *clone() const { return new UnaryExpression(*this); }
107 virtual void visit(NodeVisitor &);
110 struct BinaryExpression: Expression
112 NodePtr<Expression> left;
114 NodePtr<Expression> right;
120 virtual BinaryExpression *clone() const { return new BinaryExpression(*this); }
121 virtual void visit(NodeVisitor &);
124 struct FunctionCall: Expression
128 std::vector<NodePtr<Expression> > arguments;
132 virtual FunctionCall *clone() const { return new FunctionCall(*this); }
133 virtual void visit(NodeVisitor &);
136 struct ExpressionStatement: Node
138 NodePtr<Expression> expression;
140 virtual ExpressionStatement *clone() const { return new ExpressionStatement(*this); }
141 virtual void visit(NodeVisitor &);
148 std::string identifier;
152 std::vector<Qualifier> qualifiers;
153 std::string interface;
155 virtual Layout *clone() const { return new Layout(*this); }
156 virtual void visit(NodeVisitor &);
159 struct StructDeclaration: Node
166 virtual StructDeclaration *clone() const { return new StructDeclaration(*this); }
167 virtual void visit(NodeVisitor &);
170 struct VariableDeclaration: Node
173 std::string sampling;
174 std::string interface;
178 NodePtr<Expression> array_size;
179 NodePtr<Expression> init_expression;
181 VariableDeclaration();
183 virtual VariableDeclaration *clone() const { return new VariableDeclaration(*this); }
184 virtual void visit(NodeVisitor &);
187 struct InterfaceBlock: Node
189 std::string interface;
195 virtual InterfaceBlock *clone() const { return new InterfaceBlock(*this); }
196 virtual void visit(NodeVisitor &);
199 struct FunctionDeclaration: Node
201 std::string return_type;
203 std::vector<NodePtr<VariableDeclaration> > parameters;
207 FunctionDeclaration();
209 virtual FunctionDeclaration *clone() const { return new FunctionDeclaration(*this); }
210 virtual void visit(NodeVisitor &);
213 struct Conditional: Node
215 Expression *condition;
219 virtual Conditional *clone() const { return new Conditional(*this); }
220 virtual void visit(NodeVisitor &);
223 struct Iteration: Node
225 NodePtr<Node> init_statement;
226 NodePtr<Expression> condition;
227 NodePtr<Expression> loop_expression;
230 virtual Iteration *clone() const { return new Iteration(*this); }
231 virtual void visit(NodeVisitor &);
236 NodePtr<Expression> expression;
238 virtual Return *clone() const { return new Return(*this); }
239 virtual void visit(NodeVisitor &);
244 virtual ~NodeVisitor() { }
246 virtual void visit(Block &) { }
247 virtual void visit(Literal &) { }
248 virtual void visit(ParenthesizedExpression &) { }
249 virtual void visit(VariableReference &) { }
250 virtual void visit(MemberAccess &) { }
251 virtual void visit(UnaryExpression &) { }
252 virtual void visit(BinaryExpression &) { }
253 virtual void visit(FunctionCall &) { }
254 virtual void visit(ExpressionStatement &) { }
255 virtual void visit(Layout &) { }
256 virtual void visit(StructDeclaration &) { }
257 virtual void visit(VariableDeclaration &) { }
258 virtual void visit(InterfaceBlock &) { }
259 virtual void visit(FunctionDeclaration &) { }
260 virtual void visit(Conditional &) { }
261 virtual void visit(Iteration &) { }
262 virtual void visit(Return &) { }
277 ProgramSyntax::Block content;
279 Context(ContextType);
284 Context global_context;
285 Context vertex_context;
286 Context geometry_context;
287 Context fragment_context;
288 std::map<std::string, StructDeclaration *> structs;
293 } // namespace ProgramSyntax