CYOptions options;
CYContext context(options);
- // XXX: this could be replaced with a CYStatement::Primitive()
- if (CYExpress *express = dynamic_cast<CYExpress *>(driver.program_->statements_))
- return express->expression_->Primitive(context);
+ CYStatement *statement(driver.program_->statements_);
+ _assert(statement != NULL);
+ _assert(statement->next_ == NULL);
- return NULL;
+ CYExpress *express(dynamic_cast<CYExpress *>(driver.program_->statements_));
+ _assert(express != NULL);
+
+ return express->expression_;
}
static int client_;
if (result == NULL)
return NULL;
- CYArray *array(dynamic_cast<CYArray *>(result));
-
+ CYArray *array(dynamic_cast<CYArray *>(result->Primitive(context)));
if (array == NULL) {
*out_ << '\n';
Output(false, json, out_);
}
void CYCompound::Output(CYOutput &out, CYFlags flags) const {
- if (CYExpression *expression = expressions_)
- if (CYExpression *next = expression->next_) {
- expression->Output(out, CYLeft(flags));
- CYFlags center(CYCenter(flags));
- while (next != NULL) {
- expression = next;
- out << ',' << ' ';
- next = expression->next_;
- CYFlags right(next != NULL ? center : CYRight(flags));
- expression->Output(out, right);
- }
- } else
- expression->Output(out, flags);
+ if (next_ == NULL)
+ expression_->Output(out, flags);
+ else {
+ expression_->Output(out, CYLeft(flags));
+ out << ',' << ' ';
+ next_->Output(out, CYRight(flags));
+ }
}
void CYCondition::Output(CYOutput &out, CYFlags flags) const {
struct CYString;
struct CYExpression :
- CYNext<CYExpression>,
CYForInitialiser,
CYForInInitialiser,
CYClassName,
virtual CYAssignment *Assignment(CYContext &context);
virtual CYExpression *Primitive(CYContext &context) {
- return this;
+ return NULL;
}
virtual CYNumber *Number(CYContext &context) {
struct CYCompound :
CYExpression
{
- CYExpression *expressions_;
+ CYExpression *expression_;
+ CYExpression *next_;
- CYCompound(CYExpression *expressions = NULL) :
- expressions_(expressions)
+ CYCompound(CYExpression *expression, CYExpression *next = NULL) :
+ expression_(expression),
+ next_(next)
{
- }
-
- void AddPrev(CYExpression *expression) {
- CYSetLast(expression) = expressions_;
- expressions_ = expression;
+ if (expression_ == NULL)
+ throw;
+ _assert(expression_ != NULL);
}
CYPrecedence(17)
{
CYPrecedence(0)
CYRightHand(false)
+
+ virtual CYExpression *Primitive(CYContext &context) {
+ return this;
+ }
};
struct CYTrivial :
CYExpress(CYExpression *expression) :
expression_(expression)
{
- if (expression == NULL)
+ if (expression_ == NULL)
throw;
}
CYExpression *CYAdd::Replace(CYContext &context) {
CYInfix::Replace(context);
- CYExpression *lhp(lhs_->Primitive(context));
- CYExpression *rhp(rhs_->Primitive(context));
-
- CYString *lhs(dynamic_cast<CYString *>(lhp));
- CYString *rhs(dynamic_cast<CYString *>(rhp));
+ CYString *lhs(dynamic_cast<CYString *>(lhs_));
+ CYString *rhs(dynamic_cast<CYString *>(rhs_));
if (lhs != NULL || rhs != NULL) {
if (lhs == NULL) {
- lhs = lhp->String(context);
+ lhs = lhs_->String(context);
if (lhs == NULL)
return this;
} else if (rhs == NULL) {
- rhs = rhp->String(context);
+ rhs = rhs_->String(context);
if (rhs == NULL)
return this;
}
return lhs->Concat(context, rhs);
}
- if (CYNumber *lhn = lhp->Number(context))
- if (CYNumber *rhn = rhp->Number(context))
+ if (CYNumber *lhn = lhs_->Number(context))
+ if (CYNumber *rhn = rhs_->Number(context))
return $D(lhn->Value() + rhn->Value());
return this;
}
CYExpression *CYCompound::Replace(CYContext &context) {
- context.ReplaceAll(expressions_);
- if (expressions_ == NULL)
- return NULL;
+ if (next_ == NULL)
+ return expression_;
+
+ context.Replace(expression_);
+ context.Replace(next_);
+
+ if (CYCompound *compound = dynamic_cast<CYCompound *>(expression_)) {
+ expression_ = compound->expression_;
+ compound->expression_ = compound->next_;
+ compound->next_ = next_;
+ next_ = compound;
+ }
+
return this;
}
CYExpression *CYCompound::Primitive(CYContext &context) {
- CYExpression *expression(expressions_);
- if (expression == NULL)
+ CYExpression *expression(expression_);
+ if (expression == NULL || next_ != NULL)
return NULL;
- while (expression->next_ != NULL)
- expression = expression->next_;
return expression->Primitive(context);
}
}
CYCompound *CYDeclarations::Compound(CYContext &context) { $T(NULL)
- CYCompound *compound(next_->Compound(context) ?: $ CYCompound());
+ CYCompound *compound(next_->Compound(context));
if (CYAssignment *assignment = declaration_->Assignment(context))
- compound->AddPrev(assignment);
+ compound = $ CYCompound(assignment, compound);
return compound;
}
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;
+ expression_ = $ CYCompound(expression_, express->expression_);
SetNext(express->next_);
}
CYExpression *CYMultiply::Replace(CYContext &context) {
CYInfix::Replace(context);
- CYExpression *lhp(lhs_->Primitive(context));
- CYExpression *rhp(rhs_->Primitive(context));
-
- if (CYNumber *lhn = lhp->Number(context))
- if (CYNumber *rhn = rhp->Number(context))
+ if (CYNumber *lhn = lhs_->Number(context))
+ if (CYNumber *rhn = rhs_->Number(context))
return $D(lhn->Value() * rhn->Value());
return this;
CYStatement *CYVar::Replace(CYContext &context) {
declarations_->Replace(context);
- return $E(declarations_->Compound(context));
+ if (CYCompound *compound = declarations_->Compound(context))
+ return $E(compound);
+ return $ CYEmpty();
}
CYExpression *CYVariable::Replace(CYContext &context) {