Node *ProgramParser::parse_global_declaration()
{
string token = peek_token();
- if(token=="layout")
+ if(token=="import")
+ return parse_import();
+ else if(token=="layout")
return parse_layout();
else if(token=="struct")
return parse_struct_declaration();
throw runtime_error(format("Syntax error at '%s': expected a statement", token));
}
+Import *ProgramParser::parse_import()
+{
+ if(cur_stage->type!=SHARED)
+ throw runtime_error("Imports are only allowed in the shared section");
+
+ expect("import");
+ RefPtr<Import> import = new Import;
+ import->module = parse_token();
+ expect(";");
+ return import.release();
+}
+
Layout *ProgramParser::parse_layout()
{
expect("layout");
expect(")");
left = parexpr;
}
+ else if(isdigit(token[0]) || token=="true" || token=="false")
+ {
+ RefPtr<Literal> literal = new Literal;
+ literal->token = parse_token();
+ left = literal;
+ }
else if(is_identifier(token))
{
RefPtr<VariableReference> var = new VariableReference;
unary->expression = parse_expression(oper->precedence);
left = unary;
}
- else if(isdigit(token[0]))
- {
- RefPtr<Literal> literal = new Literal;
- literal->token = parse_token();
- left = literal;
- }
else
throw runtime_error(format("Parse error at '%s': expected an expression", token));
}
BinaryExpression *ProgramParser::parse_binary(Expression *left, const Operator *oper)
{
- RefPtr<BinaryExpression> binary = new BinaryExpression;
+ RefPtr<BinaryExpression> binary = (oper->precedence==16 ? new Assignment : new BinaryExpression);
binary->left = left;
binary->oper = parse_token();
if(binary->oper=="[")
}
else
binary->right = parse_expression(oper->precedence+(oper->assoc==RIGHT_TO_LEFT));
- binary->assignment = (oper->precedence==16);
return binary.release();
}
string token = peek_token();
if(token=="{")
{
- func->definition = true;
+ func->definition = func.get();
parse_block(func->body, true);
}
else if(token==";")
iface->name = expect_identifier();
parse_block(iface->members, true);
- expect(";");
+ if(!check(";"))
+ {
+ iface->instance_name = expect_identifier();
+ if(check("["))
+ {
+ iface->array = true;
+ expect("]");
+ }
+ expect(";");
+ }
return iface.release();
}