]> git.tdb.fi Git - libs/gl.git/blob - source/programcompiler.h
Inject the global context to the syntax tree
[libs/gl.git] / source / programcompiler.h
1 #ifndef MSP_GL_PROGRAMCOMPILER_H_
2 #define MSP_GL_PROGRAMCOMPILER_H_
3
4 #include "programparser.h"
5 #include "programsyntax.h"
6
7 namespace Msp {
8 namespace GL {
9
10 class Program;
11
12 class ProgramCompiler
13 {
14 public:
15         struct Formatter: ProgramSyntax::NodeVisitor
16         {
17                 std::string formatted;
18                 unsigned indent;
19                 bool parameter_list;
20                 bool else_if;
21
22                 Formatter();
23
24                 virtual void visit(ProgramSyntax::Block &);
25                 virtual void visit(ProgramSyntax::Literal &);
26                 virtual void visit(ProgramSyntax::ParenthesizedExpression &);
27                 virtual void visit(ProgramSyntax::VariableReference &);
28                 virtual void visit(ProgramSyntax::MemberAccess &);
29                 virtual void visit(ProgramSyntax::UnaryExpression &);
30                 virtual void visit(ProgramSyntax::BinaryExpression &);
31                 virtual void visit(ProgramSyntax::FunctionCall &);
32                 virtual void visit(ProgramSyntax::ExpressionStatement &);
33                 virtual void visit(ProgramSyntax::Layout &);
34                 virtual void visit(ProgramSyntax::StructDeclaration &);
35                 virtual void visit(ProgramSyntax::VariableDeclaration &);
36                 virtual void visit(ProgramSyntax::InterfaceBlock &);
37                 virtual void visit(ProgramSyntax::FunctionDeclaration &);
38                 virtual void visit(ProgramSyntax::Conditional &);
39                 virtual void visit(ProgramSyntax::Iteration &);
40                 virtual void visit(ProgramSyntax::Return &);
41         };
42
43 private:
44         ProgramParser parser;
45         ProgramSyntax::Module *module;
46
47 public:
48         ProgramCompiler();
49
50         void compile(const std::string &);
51         void compile(IO::Base &);
52         void add_shaders(Program &);
53
54 private:
55         void process();
56         void process(ProgramSyntax::Context &);
57         static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &);
58         std::string format_context(ProgramSyntax::Context &);
59 };
60
61 } // namespace GL
62 } // namespace Msp
63
64 #endif