Rearrange GLSL qualifier parsing
authorMikko Rasa <tdb@tdb.fi>
Tue, 3 Jul 2018 23:22:56 +0000 (02:22 +0300)
committerMikko Rasa <tdb@tdb.fi>
Tue, 3 Jul 2018 23:22:56 +0000 (02:22 +0300)
GLSL 4.20 allows qualifiers to be in any order so there's no sense to
enforce a particular order here.  Always output them in a compatible
order though.

source/programparser.cpp

index f38f39097615c94185c0d4bf7504d70e0dc7d646..80917ba39834720b7711810b0844d3f4800e0e01 100644 (file)
@@ -449,7 +449,7 @@ RefPtr<Node> ProgramParser::parse_global_declaration()
        else if(is_interface_qualifier(token))
        {
                string next = peek_token(1);
-               if(is_type(next) || is_precision_qualifier(next))
+               if(is_type(next) || is_qualifier(next))
                        return parse_variable_declaration();
                else
                        return parse_interface_block();
@@ -718,25 +718,20 @@ RefPtr<VariableDeclaration> ProgramParser::parse_variable_declaration()
        RefPtr<VariableDeclaration> var = new VariableDeclaration;
 
        string token = peek_token();
-       if(is_sampling_qualifier(token))
+       while(is_qualifier(token))
        {
-               var->sampling = parse_token();
-               token = peek_token();
-               if(!is_interface_qualifier(token))
-                       throw runtime_error(format_syntax_error("an interface qualifier"));
-       }
-
-       if(is_interface_qualifier(token))
-               var->interface = parse_token();
-       else if(token=="const")
-       {
-               var->constant = true;
                parse_token();
+               if(is_interface_qualifier(token))
+                       var->interface = token;
+               else if(is_sampling_qualifier(token))
+                       var->sampling = token;
+               else if(is_precision_qualifier(token))
+                       var->precision = token;
+               else if(token=="const")
+                       var->constant = true;
+               token = peek_token();
        }
 
-       if(is_precision_qualifier(token))
-               var->precision = parse_token();
-
        var->type = expect_type();
        var->name = expect_identifier();