]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/tokenizer.cpp
Recognize the 'f' suffix for float literals in GLSL
[libs/gl.git] / source / glsl / tokenizer.cpp
index 6ba139ff9fd92b37a459fc619e79088902d2bea2..2fa1b64ae960be301874c872c60c67c70f23cd13 100644 (file)
@@ -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_()
@@ -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=='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;