#include <msp/strings/regex.h>
#include "programparser.h"
+#undef interface
+
using namespace std;
namespace Msp {
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);
}
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();
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")
expect("import");
RefPtr<Import> import = new Import;
- import->module = parse_token();
+ import->module = expect_identifier();
expect(";");
return import;
}
return cond;
}
-RefPtr<Iteration> ProgramParser::parse_iteration()
+RefPtr<Iteration> ProgramParser::parse_for()
{
expect("for");
expect("(");
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);