+void CYTypedIdentifier::Output(CYOutput &out) const {
+ specifier_->Output(out);
+ modifier_->Output(out, 0, identifier_);
+}
+
+void CYEncodedType::Output(CYOutput &out, CYFlags flags) const {
+ out << "@encode(" << typed_ << ")";
+}
+
+void CYTypedParameter::Output(CYOutput &out) const {
+ out << typed_;
+ if (next_ != NULL)
+ out << ',' << ' ' << next_;
+}
+
+void CYLambda::Output(CYOutput &out, CYFlags flags) const {
+ // XXX: this is seriously wrong
+ out << "[](";
+ out << ")->";
+ out << "{";
+ out << "}";
+}
+
+void CYTypeDefinition::Output(CYOutput &out, CYFlags flags) const {
+ out << "typedef" << ' ' << *typed_;
+ out.Terminate();
+}
+
+void CYTypeExpression::Output(CYOutput &out, CYFlags flags) const {
+ out << '(' << "typedef" << ' ' << *typed_ << ')';
+}
+
+void CYLexical::Output(CYOutput &out, CYFlags flags) const {
+ out << "let" << ' ';
+ bindings_->Output(out, flags); // XXX: flags
+ out << ';';
+}
+
+void CYModule::Output(CYOutput &out) const {
+ out << part_;
+ if (next_ != NULL)
+ out << '.' << next_;
+}
+
+namespace cy {
+namespace Syntax {
+
+void New::Output(CYOutput &out, CYFlags flags) const {
+ out << "new" << ' ';
+ CYFlags jacks(CYNoCall | CYCenter(flags));
+ constructor_->Output(out, Precedence(), jacks);
+ if (arguments_ != NULL)
+ out << '(' << *arguments_ << ')';
+}
+
+} }
+
+void CYNull::Output(CYOutput &out, CYFlags flags) const {
+ out << "null";
+}
+
+void CYNumber::Output(CYOutput &out, CYFlags flags) const {
+ std::ostringstream str;
+ CYNumerify(str, Value());
+ std::string value(str.str());
+ out << value.c_str();
+ // XXX: this should probably also handle hex conversions and exponents
+ if ((flags & CYNoInteger) != 0 && value.find('.') == std::string::npos)
+ out << '.';
+}
+
+void CYNumber::PropertyName(CYOutput &out) const {
+ Output(out, CYNoFlags);
+}
+
+void CYObject::Output(CYOutput &out, CYFlags flags) const {
+ bool protect((flags & CYNoBrace) != 0);
+ if (protect)
+ out << '(';
+ out << '{' << '\n';
+ ++out.indent_;
+ out << properties_;
+ --out.indent_;
+ out << '\t' << '}';
+ if (protect)
+ out << ')';