if(token==i->token && (!left || i->type!=Operator::PREFIX) && (left || i->type!=Operator::POSTFIX))
oper = i;
- if(token==";" || token==")" || token=="]" || token=="," || (oper && precedence && oper->precedence>=precedence))
+ bool lower_precedence = (oper && oper->type!=Operator::PREFIX && precedence && oper->precedence>=precedence);
+ if(token==";" || token==")" || token=="]" || token=="," || lower_precedence)
{
if(left)
return left;
left = parexpr;
}
else if(isdigit(token[0]) || token=="true" || token=="false")
- {
- RefPtr<Literal> literal = new Literal;
- literal->token = tokenizer.parse_token();
- left = literal;
- }
+ left = parse_literal();
else if(is_identifier(token))
{
RefPtr<VariableReference> var = create_node<VariableReference>();
}
}
+RefPtr<Literal> Parser::parse_literal()
+{
+ RefPtr<Literal> literal = create_node<Literal>();
+ literal->token = tokenizer.parse_token();
+ if(isdigit(literal->token[0]))
+ {
+ // TODO have the tokenizer return the type of the token
+ if(isnumrc(literal->token))
+ literal->value = lexical_cast<int>(literal->token);
+ else
+ literal->value = lexical_cast<float>(literal->token);
+ }
+ else if(literal->token=="true" || literal->token=="false")
+ literal->value = (literal->token=="true");
+ else
+ throw parse_error(tokenizer.get_location(), literal->token, "a literal");
+
+ return literal;
+}
+
RefPtr<BinaryExpression> Parser::parse_binary(const RefPtr<Expression> &left, const Operator &oper)
{
RefPtr<BinaryExpression> binary = (oper.precedence==16 ?
throw parse_error(tokenizer.get_location(), iface->interface, "an interface qualifier");
iface->name = expect_identifier();
- parse_block(iface->members, true, &Parser::parse_variable_declaration_with_layout);
+ iface->members = new Block;
+ parse_block(*iface->members, true, &Parser::parse_variable_declaration_with_layout);
if(!check(";"))
{
iface->instance_name = expect_identifier();