1 #include "glsl_error.h"
2 #include "preprocessor.h"
11 Preprocessor::Preprocessor(Tokenizer &t):
15 void Preprocessor::preprocess()
17 string token = tokenizer.peek_token();
20 else if(token=="version")
22 else if(token=="define" || token=="undef" || token=="if" || token=="ifdef" || token=="ifndef" || token=="else" ||
23 token=="elif" || token=="endif" || token=="error" || token=="extension" || token=="line")
24 throw invalid_shader_source(tokenizer.get_location(), "Unsupported preprocessor directive '%s'", token);
25 else if(!token.empty())
26 throw parse_error(tokenizer.get_location(), token, "a preprocessor directive");
29 void Preprocessor::preprocess_version()
31 tokenizer.expect("version");
32 string token = tokenizer.parse_token();
33 unsigned version = lexical_cast<unsigned>(token);
34 signal_version.emit(Version(version/100, version%100));
36 token = tokenizer.parse_token();
38 throw parse_error(tokenizer.get_location(), token, "end of line");
41 void Preprocessor::preprocess_pragma()
43 tokenizer.expect("pragma");
44 string token = tokenizer.parse_token();
46 preprocess_pragma_msp();
49 void Preprocessor::preprocess_pragma_msp()
51 string token = tokenizer.peek_token();
55 throw invalid_shader_source(tokenizer.get_location(), "Unrecognized MSP pragma '%s'", token);
57 token = tokenizer.parse_token();
59 throw parse_error(tokenizer.get_location(), token, "end of line");
62 void Preprocessor::preprocess_stage()
64 tokenizer.expect("stage");
65 tokenizer.expect("(");
66 string token = tokenizer.parse_token();
67 Stage::Type stage = Stage::SHARED;
69 stage = Stage::VERTEX;
70 else if(token=="geometry")
71 stage = Stage::GEOMETRY;
72 else if(token=="fragment")
73 stage = Stage::FRAGMENT;
75 throw parse_error(tokenizer.get_location(), token, "stage identifier");
76 tokenizer.expect(")");
78 signal_stage_change.emit(stage);