X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Ftokenizer.cpp;h=4064d805e732dc8adaf5dbb912df1ce0824909bb;hp=057aa34219873970412e578a0bc7ae2dc36a4793;hb=38712d8ecc57d043a2419ffbaeeb57f7a6586f14;hpb=cee8080379ea2719345245eb69fc1b1cec585462 diff --git a/source/glsl/tokenizer.cpp b/source/glsl/tokenizer.cpp index 057aa342..4064d805 100644 --- a/source/glsl/tokenizer.cpp +++ b/source/glsl/tokenizer.cpp @@ -10,16 +10,14 @@ namespace Msp { namespace GL { namespace SL { -Tokenizer::Tokenizer(): - allow_preprocess(true), - suppress_line_advance(false) +Tokenizer::Tokenizer() { static string empty; iter = empty.begin(); 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(); @@ -95,7 +93,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); @@ -136,7 +134,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=='+')) @@ -152,11 +152,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;