]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programparser.cpp
Make animation curve creation more generic
[libs/gl.git] / source / programparser.cpp
index 80917ba39834720b7711810b0844d3f4800e0e01..c02adb325c25eaba6d4df7f31d9b8963506a5cd4 100644 (file)
@@ -263,7 +263,7 @@ void ProgramParser::skip_comment_and_whitespace()
                {
                        if(*iter=='/')
                                comment = 0;
-                       else
+                       else if(*iter!='*')
                                comment = 3;
                }
 
@@ -315,7 +315,12 @@ bool ProgramParser::is_interface_qualifier(const string &token)
 
 bool ProgramParser::is_sampling_qualifier(const string &token)
 {
-       return token=="centroid";
+       return (token=="centroid" || token=="sample");
+}
+
+bool ProgramParser::is_interpolation_qualifier(const string &token)
+{
+       return (token=="smooth" || token=="flat" || token=="noperspective");
 }
 
 bool ProgramParser::is_precision_qualifier(const string &token)
@@ -325,7 +330,11 @@ bool ProgramParser::is_precision_qualifier(const string &token)
 
 bool ProgramParser::is_qualifier(const string &token)
 {
-       return (token=="const" || is_interface_qualifier(token) || is_sampling_qualifier(token) || is_precision_qualifier(token));
+       return (token=="const" ||
+               is_interface_qualifier(token) ||
+               is_sampling_qualifier(token) ||
+               is_interpolation_qualifier(token) ||
+               is_precision_qualifier(token));
 }
 
 bool ProgramParser::is_builtin_type(const string &token)
@@ -475,7 +484,9 @@ RefPtr<Node> ProgramParser::parse_statement()
        if(token=="if")
                return parse_conditional();
        else if(token=="for")
-               return parse_iteration();
+               return parse_for();
+       else if(token=="while")
+               return parse_while();
        else if(token=="passthrough")
                return parse_passthrough();
        else if(token=="return")
@@ -725,6 +736,8 @@ RefPtr<VariableDeclaration> ProgramParser::parse_variable_declaration()
                        var->interface = token;
                else if(is_sampling_qualifier(token))
                        var->sampling = token;
+               else if(is_interpolation_qualifier(token))
+                       var->interpolation = token;
                else if(is_precision_qualifier(token))
                        var->precision = token;
                else if(token=="const")
@@ -832,7 +845,7 @@ RefPtr<Conditional> ProgramParser::parse_conditional()
        return cond;
 }
 
-RefPtr<Iteration> ProgramParser::parse_iteration()
+RefPtr<Iteration> ProgramParser::parse_for()
 {
        expect("for");
        expect("(");
@@ -842,14 +855,32 @@ RefPtr<Iteration> ProgramParser::parse_iteration()
                loop->init_statement = parse_statement();
        else
        {
-               RefPtr<ExpressionStatement> expr = new ExpressionStatement;
-               expr->expression = parse_expression();
+               if(token!=";")
+               {
+                       RefPtr<ExpressionStatement> expr = new ExpressionStatement;
+                       expr->expression = parse_expression();
+                       loop->init_statement = expr;
+               }
                expect(";");
-               loop->init_statement = expr;
        }
-       loop->condition = parse_expression();
+       if(peek_token()!=";")
+               loop->condition = parse_expression();
        expect(";");
-       loop->loop_expression = parse_expression();
+       if(peek_token()!=")")
+               loop->loop_expression = parse_expression();
+       expect(")");
+
+       parse_block(loop->body, false);
+
+       return loop;
+}
+
+RefPtr<Iteration> ProgramParser::parse_while()
+{
+       expect("while");
+       expect("(");
+       RefPtr<Iteration> loop = new Iteration;
+       loop->condition = parse_expression();
        expect(")");
 
        parse_block(loop->body, false);