void Single(CYOutput &out, CYFlags flags) const;
void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
- virtual CYStatement *Collapse(CYContext &context);
virtual CYStatement *Replace(CYContext &context) = 0;
private:
throw;
}
- virtual CYStatement *Collapse(CYContext &context);
virtual CYStatement *Replace(CYContext &context);
virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYEmpty :
CYStatement
{
- virtual CYStatement *Collapse(CYContext &context);
virtual CYStatement *Replace(CYContext &context);
virtual void Output(CYOutput &out, CYFlags flags) const;
};
next_->Replace(context);
}
-CYStatement *CYEmpty::Collapse(CYContext &context) {
- return next_;
-}
-
CYStatement *CYEmpty::Replace(CYContext &context) {
return NULL;
}
-CYStatement *CYExpress::Collapse(CYContext &context) {
- if (CYExpress *express = dynamic_cast<CYExpress *>(next_)) {
- CYCompound *next(dynamic_cast<CYCompound *>(express->expression_));
- if (next == NULL)
- next = $ CYCompound(express->expression_);
- next->AddPrev(expression_);
- expression_ = next;
+CYStatement *CYExpress::Replace(CYContext &context) {
+ while (CYExpress *express = dynamic_cast<CYExpress *>(next_)) {
+ CYCompound *compound(dynamic_cast<CYCompound *>(express->expression_));
+ if (compound == NULL)
+ compound = $ CYCompound(express->expression_);
+ compound->AddPrev(expression_);
+ expression_ = compound;
SetNext(express->next_);
}
- return this;
-}
-
-CYStatement *CYExpress::Replace(CYContext &context) {
context.Replace(expression_);
if (expression_ == NULL)
return $ CYEmpty();
+
return this;
}
}
}
-CYStatement *CYStatement::Collapse(CYContext &context) {
- return this;
-}
-
CYString *CYString::Concat(CYContext &context, CYString *rhs) const {
size_t size(size_ + rhs->size_);
char *value($ char[size + 1]);