X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Ftokenizer.cpp;h=595a97abc71e28402fef288be5f7c9636bc87e28;hb=c4aeeced7b397d46772577775bd3a0d6c4706cba;hp=6ba139ff9fd92b37a459fc619e79088902d2bea2;hpb=7b73b63df12b3ace4231842aa291d6e1d7b3f948;p=libs%2Fgl.git diff --git a/source/glsl/tokenizer.cpp b/source/glsl/tokenizer.cpp index 6ba139ff..595a97ab 100644 --- a/source/glsl/tokenizer.cpp +++ b/source/glsl/tokenizer.cpp @@ -19,7 +19,7 @@ Tokenizer::Tokenizer(): source_end = empty.end(); } -void Tokenizer::begin(const string &name, const string &src) +void Tokenizer::begin(const string &src, const string &name) { iter = src.begin(); source_end = src.end(); @@ -61,6 +61,7 @@ void Tokenizer::expect(const string &token) void Tokenizer::set_location(const Location &loc) { location = loc; + suppress_line_advance = true; } string Tokenizer::parse_token_() @@ -94,7 +95,7 @@ void Tokenizer::preprocess() { SetForScope > clear_tokens(next_tokens, deque()); - string::const_iterator line_end = iter; + auto line_end = iter; for(; (line_end!=source_end && *line_end!='\n'); ++line_end) ; SetForScope stop_at_line_end(source_end, line_end); @@ -135,7 +136,9 @@ string Tokenizer::parse_number() } bool require_digit = false; - if(iter!=source_end && (*iter=='e' || *iter=='E')) + if(iter==source_end) + ; + else if(*iter=='e' || *iter=='E') { number += *iter++; if(iter!=source_end && (*iter=='-' || *iter=='+')) @@ -151,11 +154,15 @@ string Tokenizer::parse_number() else break; } + if(!require_digit && iter!=source_end && *iter=='f') + number += *iter++; } + else if(*iter=='u' || *iter=='f') + number += *iter++; if(require_digit) throw syntax_error(location, number, "Incomplete numeric literal"); - else if(isalnum(*iter) || *iter=='_') + else if(iter!=source_end && (isalnum(*iter) || *iter=='_')) throw syntax_error(location, number, "Garbage at end of numeric literal"); return number;