delete module;
}
-Module &Parser::parse(const string &s, const string &n, unsigned i)
+Module &Parser::parse(const string &s, const string &n, int i)
{
source = s;
parse_source(n, i);
return *module;
}
-Module &Parser::parse(IO::Base &io, const string &n, unsigned i)
+Module &Parser::parse(IO::Base &io, const string &n, int i)
{
source = string();
while(!io.eof())
return *module;
}
-void Parser::parse_source(const string &name, unsigned index)
+void Parser::parse_source(const string &name, int index)
{
delete module;
module = new Module;
cur_stage = &module->shared;
base_index = index;
source_index = index;
- source_reference(1, name);
+ if(index>=0)
+ source_reference(1, name);
tokenizer.begin(name, source);
allow_stage_change = true;
while(!tokenizer.peek_token().empty())
void Parser::source_reference(unsigned index, const string &name)
{
- if(index<1)
+ if(index<1 || base_index<0)
throw invalid_shader_source(tokenizer.get_location(), "Invalid source reference");
module->source_map.set_name(base_index+index-1, name);
{
RefPtr<MemberAccess> memacc = new MemberAccess;
memacc->left = left;
+ memacc->oper = oper;
tokenizer.parse_token();
memacc->member = expect_identifier();
left = memacc;
else if(oper && oper->type==Operator::POSTFIX)
{
RefPtr<UnaryExpression> unary = new UnaryExpression;
- unary->oper = tokenizer.parse_token();
- unary->prefix = false;
+ unary->oper = oper;
+ tokenizer.parse_token();
unary->expression = left;
left = unary;
}
else if(oper && oper->type==Operator::BINARY)
- left = parse_binary(left, oper);
+ left = parse_binary(left, *oper);
else
throw parse_error(tokenizer.get_location(), token, "an operator");
left_var = 0;
else if(oper && oper->type==Operator::PREFIX)
{
RefPtr<UnaryExpression> unary = new UnaryExpression;
- unary->oper = tokenizer.parse_token();
- unary->prefix = true;
+ unary->oper = oper;
+ tokenizer.parse_token();
unary->expression = parse_expression(oper->precedence);
left = unary;
}
}
}
-RefPtr<BinaryExpression> Parser::parse_binary(const RefPtr<Expression> &left, const Operator *oper)
+RefPtr<BinaryExpression> Parser::parse_binary(const RefPtr<Expression> &left, const Operator &oper)
{
- RefPtr<BinaryExpression> binary = (oper->precedence==16 ? new Assignment : new BinaryExpression);
+ RefPtr<BinaryExpression> binary = (oper.precedence==16 ? new Assignment : new BinaryExpression);
binary->left = left;
- binary->oper = tokenizer.parse_token();
- if(binary->oper=="[")
+ binary->oper = &oper;
+ tokenizer.expect(oper.token);
+ if(oper.token[0]=='[')
{
binary->right = parse_expression();
tokenizer.expect("]");
- binary->after = "]";
}
else
- binary->right = parse_expression(oper->precedence+(oper->assoc==Operator::RIGHT_TO_LEFT));
+ binary->right = parse_expression(oper.precedence+(oper.assoc==Operator::RIGHT_TO_LEFT));
return binary;
}
RefPtr<FunctionCall> call = new FunctionCall;
call->name = var.name;
call->constructor = is_type(call->name);
+ call->oper = &Operator::get_operator("(", Operator::POSTFIX);
tokenizer.expect("(");
while(tokenizer.peek_token()!=")")
{