+struct CYMember :
+ CYExpression
+{
+ CYExpression *object_;
+ CYExpression *property_;
+
+ CYMember(CYExpression *object, CYExpression *property) :
+ object_(object),
+ property_(property)
+ {
+ }
+};
+
+struct CYNew :
+ CYExpression
+{
+ CYExpression *constructor_;
+ CYArgument *arguments_;
+
+ CYNew(CYExpression *constructor, CYArgument *arguments) :
+ constructor_(constructor),
+ arguments_(arguments)
+ {
+ }
+};
+
+struct CYCall :
+ CYExpression
+{
+ CYExpression *function_;
+ CYArgument *arguments_;
+
+ CYCall(CYExpression *function, CYArgument *arguments) :
+ function_(function),
+ arguments_(arguments)
+ {
+ }
+};
+
+struct CYIf :
+ CYStatement
+{
+ CYExpression *test_;
+ CYStatement *true_;
+ CYStatement *false_;
+
+ CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false) :
+ test_(test),
+ true_(_true),
+ false_(_false)
+ {
+ }
+};
+
+struct CYDoWhile :
+ CYStatement
+{
+ CYExpression *test_;
+ CYStatement *code_;
+
+ CYDoWhile(CYExpression *test, CYStatement *code) :
+ test_(test),
+ code_(code)
+ {
+ }
+};
+
+struct CYWhile :
+ CYStatement
+{
+ CYExpression *test_;
+ CYStatement *code_;
+
+ CYWhile(CYExpression *test, CYStatement *code) :
+ test_(test),
+ code_(code)
+ {
+ }
+};
+
+struct CYLambda :
+ CYExpression
+{
+ CYIdentifier *name_;
+ CYParameter *parameters_;
+ CYSource *body_;
+
+ CYLambda(CYIdentifier *name, CYParameter *parameters, CYSource *body) :
+ name_(name),
+ parameters_(parameters),
+ body_(body)
+ {
+ }
+};
+
+struct CYFunction :
+ CYLambda
+{
+ CYFunction(CYIdentifier *name, CYParameter *parameters, CYSource *body) :
+ CYLambda(name, parameters, body)
+ {
+ }
+};
+
+struct CYContinue :
+ CYStatement
+{
+ CYIdentifier *label_;
+
+ CYContinue(CYIdentifier *label) :
+ label_(label)
+ {
+ }
+};
+
+struct CYBreak :
+ CYStatement
+{
+ CYIdentifier *label_;
+
+ CYBreak(CYIdentifier *label) :
+ label_(label)
+ {
+ }
+};
+
+struct CYReturn :
+ CYStatement
+{
+ CYExpression *value_;
+
+ CYReturn(CYExpression *value) :
+ value_(value)
+ {
+ }
+};
+
+struct CYEmpty :
+ CYStatement
+{
+};
+
+struct CYTry :
+ CYStatement
+{
+ CYStatement *try_;
+ CYCatch *catch_;
+ CYStatement *finally_;
+
+ CYTry(CYStatement *_try, CYCatch *_catch, CYStatement *finally) :
+ try_(_try),
+ catch_(_catch),
+ finally_(finally)
+ {
+ }
+};
+
+struct CYThrow :
+ CYStatement
+{
+ CYExpression *value_;
+
+ CYThrow(CYExpression *value) :
+ value_(value)
+ {
+ }
+};
+
+struct CYWith :
+ CYStatement
+{
+ CYExpression *scope_;
+ CYStatement *code_;
+
+ CYWith(CYExpression *scope, CYStatement *code) :
+ scope_(scope),
+ code_(code)
+ {
+ }
+};
+
+struct CYSwitch :
+ CYStatement
+{
+ CYExpression *value_;
+ CYClause *clauses_;
+
+ CYSwitch(CYExpression *value, CYClause *clauses) :
+ value_(value),
+ clauses_(clauses)
+ {
+ }
+};
+
+struct CYCondition :
+ CYExpression
+{
+ CYExpression *test_;
+ CYExpression *true_;
+ CYExpression *false_;
+
+ CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
+ true_(_true),
+ false_(_false)
+ {
+ }
+};
+
+#define CYPostfix_(op, name) \
+ struct CY ## name : \
+ CYPostfix \
+ { \
+ CY ## name(CYExpression *lhs) : \
+ CYPostfix(lhs) \
+ { \
+ } \
+ };
+
+#define CYPrefix_(op, name) \
+ struct CY ## name : \
+ CYPrefix \
+ { \
+ CY ## name(CYExpression *rhs) : \
+ CYPrefix(rhs) \
+ { \
+ } \
+ };
+
+#define CYInfix_(op, name) \
+ struct CY ## name : \
+ CYInfix \
+ { \
+ CY ## name(CYExpression *lhs, CYExpression *rhs) : \
+ CYInfix(lhs, rhs) \
+ { \
+ } \
+ };
+
+#define CYAssignment_(op, name) \
+ struct CY ## name ## Assign : \
+ CYAssignment \
+ { \
+ CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
+ CYAssignment(lhs, rhs) \
+ { \
+ } \
+ };
+
+CYPostfix_("++", PostIncrement)
+CYPostfix_("--", PostDecrement)
+
+CYPrefix_("delete", Delete)
+CYPrefix_("void", Void)
+CYPrefix_("typeof", TypeOf)
+CYPrefix_("++", PreIncrement)
+CYPrefix_("--", PreDecrement)
+CYPrefix_("-", Negate)
+CYPrefix_("~", BitwiseNot)
+CYPrefix_("!", LogicalNot)
+CYPrefix_("*", Indirect)
+CYPrefix_("&", AddressOf)
+
+CYInfix_("*", Multiply)
+CYInfix_("/", Divide)
+CYInfix_("%", Modulus)
+CYInfix_("+", Add)
+CYInfix_("-", Subtract)
+CYInfix_("<<", ShiftLeft)
+CYInfix_(">>", ShiftRightSigned)
+CYInfix_(">>>", ShiftRightUnsigned)
+CYInfix_("<", Less)
+CYInfix_(">", Greater)
+CYInfix_("<=", LessOrEqual)
+CYInfix_(">=", GreaterOrEqual)
+CYInfix_("instanceof", InstanceOf)
+CYInfix_("in", In)
+CYInfix_("==", Equal)
+CYInfix_("!=", NotEqual)
+CYInfix_("===", Identical)
+CYInfix_("!==", NotIdentical)
+CYInfix_("&", BitwiseAnd)
+CYInfix_("^", BitwiseXOr)
+CYInfix_("|", BitwiseOr)
+CYInfix_("&&", LogicalAnd)
+CYInfix_("||", LogicalOr)
+
+CYAssignment_("=", )
+CYAssignment_("*=", Multiply)
+CYAssignment_("/=", Divide)
+CYAssignment_("%=", Modulus)
+CYAssignment_("+=", Add)
+CYAssignment_("-=", Subtract)
+CYAssignment_("<<=", ShiftLeft)
+CYAssignment_(">>=", ShiftRightSigned)
+CYAssignment_(">>>=", ShiftRightUnsigned)
+CYAssignment_("&=", BitwiseAnd)
+CYAssignment_("^=", BitwiseXOr)
+CYAssignment_("|=", BitwiseOr)
+