op = OPERATOR_BITCLEAR;
imp->advance(4);
}
+ else if (imp->match_c_string(")"))
+ {
+ // Not a binary operator after all.
+ imp->advance(1);
+ return left;
+ }
else
{
go_error_at(imp->location(), "unrecognized binary operator");
return ret;
}
+// Export an array index expression.
+
+void
+Array_index_expression::do_export(Export_function_body* efb) const
+{
+ efb->write_c_string("(");
+ this->array_->export_expression(efb);
+ efb->write_c_string(")[");
+
+ Type* old_context = efb->type_context();
+ efb->set_type_context(Type::lookup_integer_type("int"));
+
+ this->start_->export_expression(efb);
+ if (this->end_ == NULL)
+ go_assert(this->cap_ == NULL);
+ else
+ {
+ efb->write_c_string(":");
+ if (!this->end_->is_nil_expression())
+ this->end_->export_expression(efb);
+ if (this->cap_ != NULL)
+ {
+ efb->write_c_string(":");
+ this->cap_->export_expression(efb);
+ }
+ }
+
+ efb->set_type_context(old_context);
+
+ efb->write_c_string("]");
+}
+
// Dump ast representation for an array index expression.
void
crash, bstrslice, loc);
}
+// Export a string index expression.
+
+void
+String_index_expression::do_export(Export_function_body* efb) const
+{
+ efb->write_c_string("(");
+ this->string_->export_expression(efb);
+ efb->write_c_string(")[");
+
+ Type* old_context = efb->type_context();
+ efb->set_type_context(Type::lookup_integer_type("int"));
+
+ this->start_->export_expression(efb);
+ if (this->end_ != NULL)
+ {
+ efb->write_c_string(":");
+ if (!this->end_->is_nil_expression())
+ this->end_->export_expression(efb);
+ }
+
+ efb->set_type_context(old_context);
+
+ efb->write_c_string("]");
+}
+
// Dump ast representation for a string index expression.
void
return this->value_pointer_;
}
+// Export a map index expression.
+
+void
+Map_index_expression::do_export(Export_function_body* efb) const
+{
+ efb->write_c_string("(");
+ this->map_->export_expression(efb);
+ efb->write_c_string(")[");
+
+ Type* old_context = efb->type_context();
+ efb->set_type_context(this->get_map_type()->key_type());
+
+ this->index_->export_expression(efb);
+
+ efb->set_type_context(old_context);
+
+ efb->write_c_string("]");
+}
+
// Dump ast representation for a map index expression
void
imp->require_c_string(")");
expr = Expression::make_call(expr, args, is_varargs, loc);
}
+ else if (imp->match_c_string("["))
+ {
+ imp->advance(1);
+ Expression* start = Expression::import_expression(imp, loc);
+ Expression* end = NULL;
+ Expression* cap = NULL;
+ if (imp->match_c_string(":"))
+ {
+ imp->advance(1);
+ int c = imp->peek_char();
+ if (c == ':' || c == ']')
+ end = Expression::make_nil(loc);
+ else
+ end = Expression::import_expression(imp, loc);
+ if (imp->match_c_string(":"))
+ {
+ imp->advance(1);
+ cap = Expression::import_expression(imp, loc);
+ }
+ }
+ imp->require_c_string("]");
+ expr = Expression::make_index(expr, start, end, cap, loc);
+ }
else
break;
}
Bexpression*
do_get_backend(Translate_context*);
+ int
+ do_inlining_cost() const
+ { return this->end_ != NULL ? 2 : 1; }
+
+ void
+ do_export(Export_function_body*) const;
+
void
do_dump_expression(Ast_dump_context*) const;
Bexpression*
do_get_backend(Translate_context*);
+ int
+ do_inlining_cost() const
+ { return this->end_ != NULL ? 2 : 1; }
+
+ void
+ do_export(Export_function_body*) const;
+
void
do_dump_expression(Ast_dump_context*) const;
Bexpression*
do_get_backend(Translate_context*);
+ int
+ do_inlining_cost() const
+ { return 5; }
+
+ void
+ do_export(Export_function_body*) const;
+
void
do_dump_expression(Ast_dump_context*) const;
{
ifb->advance(3);
init = Expression::import_expression(ifb, loc);
- Type_context context(type, false);
- init->determine_type(&context);
}
Variable* var = new Variable(type, init, false, false, false, loc);
var->set_is_used();
{
ifb->advance(3);
init = Expression::import_expression(ifb, loc);
- if (type != NULL)
- {
- Type_context context(type, false);
- init->determine_type(&context);
- }
}
if (type == NULL && init == NULL)
{
ifb->require_c_string("if ");
Expression* cond = Expression::import_expression(ifb, loc);
- Type_context context(Type::lookup_bool_type(), false);
- cond->determine_type(&context);
ifb->require_c_string(" ");
if (!ifb->match_c_string("{"))