CYOptions options;
CYContext context(options);
- CYStatement *statement(driver.program_->statements_);
+ CYStatement *statement(driver.program_->code_);
_assert(statement != NULL);
_assert(statement->next_ == NULL);
- CYExpress *express(dynamic_cast<CYExpress *>(driver.program_->statements_));
+ CYExpress *express(dynamic_cast<CYExpress *>(driver.program_->code_));
_assert(express != NULL);
- return express->expression_;
+ CYParenthetical *parenthetical(dynamic_cast<CYParenthetical *>(express->expression_));
+ _assert(parenthetical != NULL);
+
+ return parenthetical->expression_;
}
static int client_;
cy::Syntax::Catch *catch_;
CYComment *comment_;
CYComprehension *comprehension_;
- CYCompound *compound_;
CYDeclaration *declaration_;
CYDeclarations *declarations_;
CYElement *element_;
CYModule *module_;
CYNull *null_;
CYNumber *number_;
+ CYParenthetical *parenthetical_;
CYProgram *program_;
CYProperty *property_;
CYPropertyName *propertyName_;
%type <statement_> ElseStatementOpt
%type <statement_> EmptyStatement
%type <expression_> EqualityExpression
-%type <compound_> Expression_
-%type <compound_> Expression
+%type <expression_> Expression
%type <expression_> ExpressionOpt
%type <statement_> ExpressionStatement
%type <finally_> FinallyOpt
%type <expression_> NewExpression
%type <null_> NullLiteral
%type <literal_> ObjectLiteral
-%type <compound_> Parenthetical
+%type <parenthetical_> Parenthetical
%type <expression_> PostfixExpression
%type <expression_> PrimaryExpression
%type <statement_> Program
/* 11.1 Primary Expressions {{{ */
Parenthetical
- : "(" LexPushInOff Expression ")" LexPopIn { $$ = $3; }
+ : "(" LexPushInOff Expression ")" LexPopIn { $$ = CYNew CYParenthetical($3); }
;
Variable
;
/* }}} */
/* 11.14 Comma Operator {{{ */
-Expression_
- : "," Expression { $$ = $2; }
- | { $$ = NULL; }
- ;
-
Expression
- : AssignmentExpression Expression_ { $$ = CYNew CYCompound($1, $2); }
+ : AssignmentExpression { $$ = $1; }
+ | AssignmentExpression "," Expression { $$ = CYNew CYCompound($1, $3); }
;
ExpressionOpt
ArrowParameters
: BindingIdentifier { $$ = CYNew CYFunctionParameter(CYNew CYDeclaration($1)); }
| "(" LexPushInOff LexSetRegExp ")" LexPopIn { $$ = NULL; }
- | Parenthetical { $$ = $1->Parameters(); if ($$ == NULL) error(@1, "invalid parameter list"); }
+ | Parenthetical { $$ = $1->expression_->Parameter(); if ($$ == NULL) error(@1, "invalid parameter list"); }
;
ConciseBody
cyn,
$N2($V("Functor"), $F(NULL, $P2($L("self"), $L("_cmd"), parameters_->Parameters(context)), $$->*
$ CYVar($L1($L("$cyr", $N2($V("objc_super"), self, _class))))->*
- $ CYReturn($C1($M($F(NULL, NULL, code_), $S("call")), self))
+ $ CYReturn($C1($M($F(NULL, NULL, code_.code_), $S("call")), self))
), cyt),
cyt
))
}
CYExpression *CYObjCBlock::Replace(CYContext &context) {
- return $C1($ CYEncodedType(($ CYTypedIdentifier(*typed_))->Modify($ CYTypeBlockWith(parameters_))), $ CYFunctionExpression(NULL, parameters_->Parameters(context), statements_));
+ return $C1($ CYEncodedType(($ CYTypedIdentifier(*typed_))->Modify($ CYTypeBlockWith(parameters_))), $ CYFunctionExpression(NULL, parameters_->Parameters(context), code_));
}
CYStatement *CYProtocol::Replace(CYContext &context) const { $T(NULL)
{
CYTypedIdentifier *typed_;
CYTypedParameter *parameters_;
- CYStatement *statements_;
+ CYStatement *code_;
- CYObjCBlock(CYTypedIdentifier *typed, CYTypedParameter *parameters, CYStatement *statements) :
+ CYObjCBlock(CYTypedIdentifier *typed, CYTypedParameter *parameters, CYStatement *code) :
typed_(typed),
parameters_(parameters),
- statements_(statements)
+ code_(code)
{
}
CYMessageParameter *parameters_;
CYBlock code_;
- CYMessage(bool instance, CYTypedIdentifier *type, CYMessageParameter *parameter, CYStatement *statements) :
+ CYMessage(bool instance, CYTypedIdentifier *type, CYMessageParameter *parameter, CYStatement *code) :
instance_(instance),
type_(type),
parameters_(parameter),
- code_(statements)
+ code_(code)
{
}
rhs_->Output(out, Precedence(), CYRight(flags));
}
-void CYBlock::Output(CYOutput &out) const {
+void CYBlock::Output(CYOutput &out, CYFlags flags) const {
out << '{' << '\n';
++out.indent_;
- if (statements_ != NULL)
- statements_->Multiple(out);
+ out << code_;
--out.indent_;
out << '\t' << '}';
}
-void CYBlock::Output(CYOutput &out, CYFlags flags) const {
- if (statements_ == NULL)
- out.Terminate();
- else if (statements_->next_ == NULL)
- statements_->Single(out, flags);
- else
- Output(out);
-}
-
void CYBoolean::Output(CYOutput &out, CYFlags flags) const {
out << (Value() ? "true" : "false");
}
namespace Syntax {
void Catch::Output(CYOutput &out) const {
- out << ' ' << "catch" << ' ' << '(' << *name_ << ')' << ' ' << code_;
+ out << ' ' << "catch" << ' ' << '(' << *name_ << ')' << ' ';
+ out << '{' << '\n';
+ ++out.indent_;
+ out << code_;
+ --out.indent_;
+ out << '\t' << '}';
}
} }
else
out << "default";
out << ':' << '\n';
- if (statements_ != NULL)
- statements_->Multiple(out);
+ out << code_;
out << next_;
}
}
void CYFatArrow::Output(CYOutput &out, CYFlags flags) const {
- out << '(' << parameters_ << ')' << ' ' << "=>" << ' ' << code_;
+ out << '(' << parameters_ << ')' << ' ' << "=>" << ' ' << '{' << code_ << '}';
}
void CYFinally::Output(CYOutput &out) const {
- out << ' ' << "finally" << ' ' << code_;
+ out << ' ' << "finally" << ' ';
+ out << '{' << '\n';
+ ++out.indent_;
+ out << code_;
+ --out.indent_;
+ out << '\t' << '}';
}
void CYFor::Output(CYOutput &out, CYFlags flags) const {
out << "function";
if (name_ != NULL)
out << ' ' << *name_;
- out << '(' << parameters_ << ')';
- out << ' ' << code_;
+ out << '(' << parameters_ << ')' << ' ';
+ out << '{' << '\n';
+ ++out.indent_;
+ out << code_;
+ --out.indent_;
+ out << '\t' << '}';
if (protect)
out << ')';
}
statement_->Single(out, CYRight(flags));
}
+void CYParenthetical::Output(CYOutput &out, CYFlags flags) const {
+ out << '(';
+ expression_->Output(out, CYCompound::Precedence_, CYNoFlags);
+ out << ')';
+}
+
+void CYStatement::Output(CYOutput &out) const {
+ Multiple(out);
+}
+
void CYTypeArrayOf::Output(CYOutput &out, CYIdentifier *identifier) const {
next_->Output(out, Precedence(), identifier);
out << '[';
}
void CYProgram::Output(CYOutput &out) const {
- if (statements_ != NULL)
- statements_->Multiple(out);
+ out << code_;
}
void CYProperty::Output(CYOutput &out) const {
void CYRubyProc::Output(CYOutput &out, CYFlags flags) const {
// XXX: this is not outputting the parameters
+ out << '{' << '\n';
+ ++out.indent_;
out << code_;
+ --out.indent_;
+ out << '\t' << '}';
}
void CYStatement::Multiple(CYOutput &out, CYFlags flags) const {
}
void Try::Output(CYOutput &out, CYFlags flags) const {
- out << "try" << ' ' << code_ << catch_ << finally_;
+ out << "try" << ' ';
+ out << '{' << '\n';
+ ++out.indent_;
+ out << code_;
+ --out.indent_;
+ out << '\t' << '}';
+ out << catch_ << finally_;
}
} }
}
struct CYStatement :
- CYNext<CYStatement>
+ CYNext<CYStatement>,
+ CYThing
{
virtual ~CYStatement() {
}
void Single(CYOutput &out, CYFlags flags) const;
void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
+ virtual void Output(CYOutput &out) const;
virtual CYStatement *Replace(CYContext &context) = 0;
struct CYProgram :
CYThing
{
- CYStatement *statements_;
+ CYStatement *code_;
- CYProgram(CYStatement *statements) :
- statements_(statements)
+ CYProgram(CYStatement *code) :
+ code_(code)
{
}
virtual ~CYContext() {
}
- template <typename Type_>
- void ReplaceAll(Type_ *&values) {
- Type_ **last(&values);
- CYForEach (next, values) {
- Replace(*last = next);
- if (*last != NULL)
- last = &(*last)->next_;
- }
+ void ReplaceAll(CYStatement *&statement) {
+ if (statement == NULL)
+ return;
+ CYStatement *next(statement->next_);
+
+ Replace(statement);
+ ReplaceAll(next);
+
+ if (statement == NULL)
+ statement = next;
+ else
+ statement->SetNext(next);
}
template <typename Type_>
};
struct CYBlock :
- CYStatement,
- CYThing
+ CYStatement
{
- CYStatement *statements_;
+ CYStatement *code_;
- CYBlock(CYStatement *statements) :
- statements_(statements)
+ CYBlock(CYStatement *code) :
+ code_(code)
{
}
- operator CYStatement *() const {
- return statements_;
- }
-
- void AddPrev(CYStatement *statement) {
- CYSetLast(statement) = statements_;
- statements_ = statement;
- }
-
virtual CYStatement *Replace(CYContext &context);
- virtual void Output(CYOutput &out) const;
virtual void Output(CYOutput &out, CYFlags flags) const;
};
}
virtual CYFunctionParameter *Parameter() const;
- virtual CYFunctionParameter *Parameters() const;
virtual CYNumber *Number(CYContext &context) {
return NULL;
CYExpression *expression_;
CYExpression *next_;
- CYCompound(CYExpression *expression, CYExpression *next = NULL) :
+ CYCompound(CYExpression *expression, CYExpression *next) :
expression_(expression),
next_(next)
{
- if (expression_ == NULL)
- throw;
_assert(expression_ != NULL);
+ _assert(next != NULL);
}
CYPrecedence(17)
virtual CYExpression *Replace(CYContext &context);
void Output(CYOutput &out, CYFlags flags) const;
- virtual CYExpression *Primitive(CYContext &context);
- virtual CYFunctionParameter *Parameters() const;
+ virtual CYFunctionParameter *Parameter() const;
+};
+
+struct CYParenthetical :
+ CYExpression
+{
+ CYExpression *expression_;
+
+ CYParenthetical(CYExpression *expression) :
+ expression_(expression)
+ {
+ }
+
+ CYPrecedence(0)
+
+ virtual CYExpression *Replace(CYContext &context);
+ void Output(CYOutput &out, CYFlags flags) const;
};
struct CYDeclaration;
{
}
- void Replace(CYContext &context, CYBlock &code);
+ void Replace(CYContext &context, CYStatement *&statements);
void Output(CYOutput &out) const;
};
CYNext<CYClause>
{
CYExpression *case_;
- CYStatement *statements_;
+ CYStatement *code_;
- CYClause(CYExpression *_case, CYStatement *statements) :
+ CYClause(CYExpression *_case, CYStatement *code) :
case_(_case),
- statements_(statements)
+ code_(code)
{
}
void Replace(CYContext &context);
- CYCompound *Compound(CYContext &context);
+ CYExpression *Expression(CYContext &context);
CYProperty *Property(CYContext &context);
CYArgument *Argument(CYContext &context);
CYFunctionParameter *Parameter(CYContext &context);
{
}
- virtual CYCompound *Replace(CYContext &context);
+ virtual CYExpression *Replace(CYContext &context);
virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYFunction {
CYIdentifier *name_;
CYFunctionParameter *parameters_;
- CYBlock code_;
+ CYStatement *code_;
CYNonLocal *nonlocal_;
CYThisScope this_;
- CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
+ CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
name_(name),
parameters_(parameters),
- code_(statements),
+ code_(code),
nonlocal_(NULL)
{
}
CYFunction,
CYExpression
{
- CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
- CYFunction(name, parameters, statements)
+ CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
+ CYFunction(name, parameters, code)
{
}
CYFunction,
CYExpression
{
- CYFatArrow(CYFunctionParameter *parameters, CYStatement *statements) :
- CYFunction(NULL, parameters, statements)
+ CYFatArrow(CYFunctionParameter *parameters, CYStatement *code) :
+ CYFunction(NULL, parameters, code)
{
}
struct CYRubyProc :
CYFunctionExpression
{
- CYRubyProc(CYFunctionParameter *parameters, CYStatement *statements) :
- CYFunctionExpression(NULL, parameters, statements)
+ CYRubyProc(CYFunctionParameter *parameters, CYStatement *code) :
+ CYFunctionExpression(NULL, parameters, code)
{
}
CYFunction,
CYStatement
{
- CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
- CYFunction(name, parameters, statements)
+ CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
+ CYFunction(name, parameters, code)
{
}
struct CYFinally :
CYThing
{
- CYBlock code_;
+ CYStatement *code_;
- CYFinally(CYStatement *statements) :
- code_(statements)
+ CYFinally(CYStatement *code) :
+ code_(code)
{
}
{
CYTypedIdentifier *typed_;
CYTypedParameter *parameters_;
- CYStatement *statements_;
+ CYStatement *code_;
- CYLambda(CYTypedIdentifier *typed, CYTypedParameter *parameters, CYStatement *statements) :
+ CYLambda(CYTypedIdentifier *typed, CYTypedParameter *parameters, CYStatement *code) :
typed_(typed),
parameters_(parameters),
- statements_(statements)
+ code_(code)
{
}
CYThing
{
CYIdentifier *name_;
- CYBlock code_;
+ CYStatement *code_;
- Catch(CYIdentifier *name, CYStatement *statements) :
+ Catch(CYIdentifier *name, CYStatement *code) :
name_(name),
- code_(statements)
+ code_(code)
{
}
struct Try :
CYStatement
{
- CYBlock code_;
+ CYStatement *code_;
Catch *catch_;
CYFinally *finally_;
- Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
- code_(statements),
+ Try(CYStatement *code, Catch *_catch, CYFinally *finally) :
+ code_(code),
catch_(_catch),
finally_(finally)
{
}
CYStatement *CYBlock::Replace(CYContext &context) {
- context.ReplaceAll(statements_);
- if (statements_ == NULL)
+ context.ReplaceAll(code_);
+ if (code_ == NULL)
return $ CYEmpty();
return this;
}
context.Replace(name_);
context.scope_->Declare(context, name_, CYIdentifierCatch);
- code_.Replace(context);
- scope.Close(context, code_.statements_);
+ context.ReplaceAll(code_);
+ scope.Close(context, code_);
}
} }
void CYClause::Replace(CYContext &context) { $T()
context.Replace(case_);
- context.ReplaceAll(statements_);
+ context.ReplaceAll(code_);
next_->Replace(context);
}
}
CYExpression *CYCompound::Replace(CYContext &context) {
- if (next_ == NULL)
- return expression_;
-
context.Replace(expression_);
context.Replace(next_);
return this;
}
-CYExpression *CYCompound::Primitive(CYContext &context) {
- CYExpression *expression(expression_);
- if (expression == NULL || next_ != NULL)
+CYFunctionParameter *CYCompound::Parameter() const {
+ CYFunctionParameter *next(next_->Parameter());
+ if (next == NULL)
return NULL;
- return expression->Primitive(context);
-}
-
-CYFunctionParameter *CYCompound::Parameters() const {
- CYFunctionParameter *next;
- if (next_ == NULL)
- next = NULL;
- else {
- next = next_->Parameters();
- if (next == NULL)
- return NULL;
- }
CYFunctionParameter *parameter(expression_->Parameter());
if (parameter == NULL)
$ CYReturn($M($V(cye), $S("$cyv"))))->*
$ cy::Syntax::Throw($V(cye))));
+ // XXX: I don't understand any of this
context.Replace(declare);
rescue->Replace(context);
return $ CYArgument(declaration_->initialiser_, next_->Argument(context));
}
-CYCompound *CYDeclarations::Compound(CYContext &context) { $T(NULL)
- CYCompound *compound(next_->Compound(context));
+CYExpression *CYDeclarations::Expression(CYContext &context) { $T(NULL)
+ CYExpression *compound(next_->Expression(context));
if (CYAssignment *assignment = declaration_->Assignment(context))
- compound = $ CYCompound(assignment, compound);
+ if (compound == NULL)
+ compound = assignment;
+ else
+ compound = $ CYCompound(assignment, compound);
return compound;
}
CYStatement *CYDoWhile::Replace(CYContext &context) {
context.Replace(test_);
- context.Replace(code_);
+ context.ReplaceAll(code_);
return this;
}
}
CYStatement *CYExpress::Replace(CYContext &context) {
- while (CYExpress *express = dynamic_cast<CYExpress *>(next_)) {
- expression_ = $ CYCompound(expression_, express->expression_);
- SetNext(express->next_);
- }
-
context.Replace(expression_);
- if (expression_ == NULL)
- return $ CYEmpty();
-
return this;
}
return NULL;
}
-CYFunctionParameter *CYExpression::Parameters() const {
- return NULL;
-}
-
CYStatement *CYExternal::Replace(CYContext &context) {
return $E($ CYAssign($V(typed_->identifier_), $C1(typed_->Replace(context), $C2($V("dlsym"), $V("RTLD_DEFAULT"), $S(typed_->identifier_->Word())))));
}
}
void CYFinally::Replace(CYContext &context) { $T()
- code_.Replace(context);
+ context.ReplaceAll(code_);
}
CYStatement *CYFor::Replace(CYContext &context) {
context.Replace(initialiser_);
context.Replace(test_);
context.Replace(increment_);
- context.Replace(code_);
+ context.ReplaceAll(code_);
return this;
}
-CYCompound *CYForDeclarations::Replace(CYContext &context) {
+CYExpression *CYForDeclarations::Replace(CYContext &context) {
declarations_->Replace(context);
- return declarations_->Compound(context);
+ return declarations_->Expression(context);
}
// XXX: this still feels highly suboptimal
context.Replace(initialiser_);
context.Replace(set_);
- context.Replace(code_);
+ context.ReplaceAll(code_);
return this;
}
Inject(context);
parameters_->Replace(context, code_);
- code_.Replace(context);
+ context.ReplaceAll(code_);
if (CYIdentifier *identifier = this_.identifier_)
- code_.statements_ = $$->*
+ code_ = $$->*
$ CYVar($L1($ CYDeclaration(identifier, $ CYThis())))->*
- code_.statements_;
+ code_;
if (localize)
- context.NonLocal(code_.statements_);
+ context.NonLocal(code_);
context.nextlocal_ = nextlocal;
context.nonlocal_ = nonlocal;
context.this_ = _this;
- scope.Close(context, code_.statements_);
+ scope.Close(context, code_);
}
CYExpression *CYFunctionExpression::Replace(CYContext &context) {
return this;
}
-void CYFunctionParameter::Replace(CYContext &context, CYBlock &code) { $T()
+void CYFunctionParameter::Replace(CYContext &context, CYStatement *&statements) { $T()
CYAssignment *assignment(initialiser_->Assignment(context));
context.Replace(initialiser_);
- next_->Replace(context, code);
+ next_->Replace(context, statements);
if (assignment != NULL)
- // XXX: this cast is quite incorrect
- code.AddPrev($ CYIf($ CYIdentical($ CYTypeOf(dynamic_cast<CYExpression *>(initialiser_)), $S("undefined")), $$->*
- $E(assignment)
- ));
+ statements = $$->*
+ // XXX: this cast is quite incorrect
+ $ CYIf($ CYIdentical($ CYTypeOf(dynamic_cast<CYExpression *>(initialiser_)), $S("undefined")), $$->*
+ $E(assignment)
+ )->*
+ statements;
}
CYStatement *CYFunctionStatement::Replace(CYContext &context) {
CYStatement *CYIf::Replace(CYContext &context) {
context.Replace(test_);
- context.Replace(true_);
- context.Replace(false_);
+ context.ReplaceAll(true_);
+ context.ReplaceAll(false_);
return this;
}
}
CYExpression *CYLambda::Replace(CYContext &context) {
- return $N2($V("Functor"), $ CYFunctionExpression(NULL, parameters_->Parameters(context), statements_), parameters_->TypeSignature(context, typed_->Replace(context)));
+ return $N2($V("Functor"), $ CYFunctionExpression(NULL, parameters_->Parameters(context), code_), parameters_->TypeSignature(context, typed_->Replace(context)));
}
CYStatement *CYLetStatement::Replace(CYContext &context) {
return this;
}
+CYExpression *CYParenthetical::Replace(CYContext &context) {
+ return expression_;
+}
+
CYExpression *CYPostfix::Replace(CYContext &context) {
context.Replace(lhs_);
return this;
CYScope scope(true, context);
context.nextlocal_ = $ CYNonLocal();
- context.ReplaceAll(statements_);
- context.NonLocal(statements_);
+ context.ReplaceAll(code_);
+ context.NonLocal(code_);
- scope.Close(context, statements_);
+ scope.Close(context, code_);
size_t offset(0);
namespace Syntax {
CYStatement *Try::Replace(CYContext &context) {
- code_.Replace(context);
+ context.ReplaceAll(code_);
catch_->Replace(context);
finally_->Replace(context);
return this;
CYStatement *CYVar::Replace(CYContext &context) {
declarations_->Replace(context);
- if (CYCompound *compound = declarations_->Compound(context))
- return $E(compound);
+ if (CYExpression *expression = declarations_->Expression(context))
+ return $E(expression);
return $ CYEmpty();
}
CYStatement *CYWhile::Replace(CYContext &context) {
context.Replace(test_);
- context.Replace(code_);
+ context.ReplaceAll(code_);
return this;
}
CYStatement *CYWith::Replace(CYContext &context) {
context.Replace(scope_);
- context.Replace(code_);
+ context.ReplaceAll(code_);
return this;
}