]> git.tdb.fi Git - libs/gl.git/blobdiff - source/programparser.cpp
Add an intermediate node type for statements
[libs/gl.git] / source / programparser.cpp
index 3b87ea7b58b1a2a16c1a09d3cd6432c53009d73f..07fa19de655e774aa0765e5bd20f3c0d14f58d48 100644 (file)
@@ -3,6 +3,8 @@
 #include <msp/strings/regex.h>
 #include "programparser.h"
 
+#undef interface
+
 using namespace std;
 
 namespace Msp {
@@ -110,7 +112,7 @@ void ProgramParser::parse_source()
        source_end = source.end();
        current_line = 1;
        allow_preprocess = true;
-       while(RefPtr<Node> statement = parse_global_declaration())
+       while(RefPtr<Statement> statement = parse_global_declaration())
                cur_stage->content.body.push_back(statement);
 }
 
@@ -424,7 +426,7 @@ void ProgramParser::preprocess_stage()
        cur_stage = &module->stages.back();
 }
 
-RefPtr<Node> ProgramParser::parse_global_declaration()
+RefPtr<Statement> ProgramParser::parse_global_declaration()
 {
        allow_stage_change = true;
        string token = peek_token();
@@ -478,13 +480,15 @@ RefPtr<Node> ProgramParser::parse_global_declaration()
                throw runtime_error(format_syntax_error("a global declaration"));
 }
 
-RefPtr<Node> ProgramParser::parse_statement()
+RefPtr<Statement> ProgramParser::parse_statement()
 {
        string token = peek_token();
        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")
@@ -843,7 +847,7 @@ RefPtr<Conditional> ProgramParser::parse_conditional()
        return cond;
 }
 
-RefPtr<Iteration> ProgramParser::parse_iteration()
+RefPtr<Iteration> ProgramParser::parse_for()
 {
        expect("for");
        expect("(");
@@ -853,14 +857,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);