10 template <typename Type_>
 
  19     void SetNext(Type_ *next) {
 
  25     virtual void Output(std::ostream &out) const = 0;
 
  28 _finline std::ostream &operator <<(std::ostream &out, const CYThing &rhs) {
 
  34     virtual void Part(std::ostream &out) const = 0;
 
  40     virtual void Show(std::ostream &out) const;
 
  41     virtual void Output(std::ostream &out) const = 0;
 
  42     virtual void Output(std::ostream &out, bool block) const;
 
  48     virtual const char *Name() const = 0;
 
  56     CYWord(const char *word) :
 
  61     const char *Value() const {
 
  65     virtual const char *Name() const {
 
  69     virtual void Output(std::ostream &out) const;
 
  75     CYIdentifier(const char *word) :
 
  82     CYIdentifier *identifier_;
 
  85     CYLabel(CYIdentifier *identifier, CYLabel *next) :
 
  86         identifier_(identifier),
 
  97     void AddLabel(CYIdentifier *identifier) {
 
  98         label_ = new CYLabel(identifier, label_);
 
 112     std::string filename_;
 
 113     std::vector<CYSource *> source_;
 
 118     void ScannerDestroy();
 
 121     CYDriver(const std::string &filename);
 
 127 struct CYForInitialiser :
 
 132 struct CYForInInitialiser :
 
 137 struct CYExpression :
 
 138     CYNext<CYExpression>,
 
 142     virtual void Part(std::ostream &out) const;
 
 143     virtual void Output(std::ostream &out) const = 0;
 
 144     void Output(std::ostream &out, bool raw) const;
 
 147 _finline std::ostream &operator <<(std::ostream &out, const CYExpression &rhs) {
 
 148     rhs.Output(out, false);
 
 164     CYString(const char *value, size_t size) :
 
 170     CYString(const CYIdentifier *identifier) :
 
 171         value_(identifier->Value()),
 
 172         size_(strlen(value_))
 
 176     const char *Value() const {
 
 180     virtual const char *Name() const {
 
 184     virtual void Output(std::ostream &out) const;
 
 193     CYNumber(double value) :
 
 198     double Value() const {
 
 202     virtual const char *Name() const {
 
 206     virtual void Output(std::ostream &out) const;
 
 218     virtual void Output(std::ostream &out) const;
 
 230     virtual void Output(std::ostream &out) const;
 
 236     virtual bool Value() const = 0;
 
 237     virtual void Output(std::ostream &out) const;
 
 249     virtual bool Value() const {
 
 263     virtual bool Value() const {
 
 273     CYVariable(CYIdentifier *name) :
 
 278     virtual void Output(std::ostream &out) const;
 
 286     CYPrefix(CYExpression *rhs) :
 
 291     virtual const char *Operator() const = 0;
 
 293     virtual void Output(std::ostream &out) const;
 
 302     CYInfix(CYExpression *lhs, CYExpression *rhs) :
 
 308     virtual const char *Operator() const = 0;
 
 310     virtual void Output(std::ostream &out) const;
 
 318     CYPostfix(CYExpression *lhs) :
 
 323     virtual const char *Operator() const = 0;
 
 325     virtual void Output(std::ostream &out) const;
 
 328 struct CYAssignment :
 
 331     CYAssignment(CYExpression *lhs, CYExpression *rhs) :
 
 336     virtual const char *Operator() const = 0;
 
 341     CYExpression *value_;
 
 344     CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
 
 351     void Output(std::ostream &out, bool send) const;
 
 370     CYClause(CYExpression *_case, CYStatement *code) :
 
 376     virtual void Output(std::ostream &out) const;
 
 382     CYExpression *value_;
 
 385     CYElement(CYExpression *value, CYElement *next) :
 
 391     void Output(std::ostream &out, bool raw) const;
 
 392     virtual void Output(std::ostream &out) const;
 
 395 struct CYDeclaration :
 
 399     CYIdentifier *identifier_;
 
 400     CYExpression *initialiser_;
 
 402     CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser) :
 
 403         identifier_(identifier),
 
 404         initialiser_(initialiser)
 
 408     virtual void Part(std::ostream &out) const;
 
 409     virtual void Output(std::ostream &out) const;
 
 412 struct CYDeclarations :
 
 416     CYDeclaration *declaration_;
 
 417     CYDeclarations *next_;
 
 419     CYDeclarations(CYDeclaration *declaration, CYDeclarations *next) :
 
 420         declaration_(declaration),
 
 425     virtual void Part(std::ostream &out) const;
 
 426     virtual void Output(std::ostream &out) const;
 
 435     CYParameter(CYIdentifier *name, CYParameter *next) :
 
 441     virtual void Output(std::ostream &out) const;
 
 447     CYForInitialiser *initialiser_;
 
 449     CYExpression *increment_;
 
 452     CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
 
 453         initialiser_(initialiser),
 
 455         increment_(increment),
 
 460     virtual void Output(std::ostream &out) const;
 
 466     CYForInInitialiser *initialiser_;
 
 470     CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
 
 471         initialiser_(initialiser),
 
 477     virtual void Output(std::ostream &out) const;
 
 484     CYExpression *value_;
 
 487     CYProperty(CYName *name, CYExpression *value, CYProperty *next) :
 
 494     void Output(std::ostream &out, bool raw) const;
 
 495     virtual void Output(std::ostream &out) const;
 
 504     CYCatch(CYIdentifier *name, CYStatement *code) :
 
 510     virtual void Output(std::ostream &out) const;
 
 517     CYArgument *arguments_;
 
 519     CYMessage(CYExpression *self, CYArgument *arguments) :
 
 521         arguments_(arguments)
 
 525     virtual void Output(std::ostream &out) const;
 
 531     CYExpression *object_;
 
 532     CYExpression *property_;
 
 534     CYMember(CYExpression *object, CYExpression *property) :
 
 540     virtual void Output(std::ostream &out) const;
 
 546     CYExpression *constructor_;
 
 547     CYArgument *arguments_;
 
 549     CYNew(CYExpression *constructor, CYArgument *arguments) :
 
 550         constructor_(constructor),
 
 551         arguments_(arguments)
 
 555     virtual void Output(std::ostream &out) const;
 
 561     CYExpression *function_;
 
 562     CYArgument *arguments_;
 
 564     CYCall(CYExpression *function, CYArgument *arguments) :
 
 566         arguments_(arguments)
 
 570     virtual void Output(std::ostream &out) const;
 
 580     CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false) :
 
 587     virtual void Output(std::ostream &out) const;
 
 596     CYDoWhile(CYExpression *test, CYStatement *code) :
 
 602     virtual void Output(std::ostream &out) const;
 
 611     CYWhile(CYExpression *test, CYStatement *code) :
 
 617     virtual void Output(std::ostream &out) const;
 
 624     CYParameter *parameters_;
 
 627     CYLambda(CYIdentifier *name, CYParameter *parameters, CYSource *body) :
 
 629         parameters_(parameters),
 
 634     virtual void Output(std::ostream &out) const;
 
 641     CYFunction(CYIdentifier *name, CYParameter *parameters, CYSource *body) :
 
 642         CYLambda(name, parameters, body)
 
 646     virtual void Output(std::ostream &out) const;
 
 652     CYExpression *expression_;
 
 654     CYExpress(CYExpression *expression) :
 
 655         expression_(expression)
 
 659     virtual void Output(std::ostream &out) const;
 
 665     CYIdentifier *label_;
 
 667     CYContinue(CYIdentifier *label) :
 
 672     virtual void Output(std::ostream &out) const;
 
 678     CYIdentifier *label_;
 
 680     CYBreak(CYIdentifier *label) :
 
 685     virtual void Output(std::ostream &out) const;
 
 691     CYExpression *value_;
 
 693     CYReturn(CYExpression *value) :
 
 698     virtual void Output(std::ostream &out) const;
 
 704     virtual void Output(std::ostream &out) const;
 
 705     virtual void Output(std::ostream &out, bool block) const;
 
 713     CYStatement *finally_;
 
 715     CYTry(CYStatement *_try, CYCatch *_catch, CYStatement *finally) :
 
 722     virtual void Output(std::ostream &out) const;
 
 728     CYExpression *value_;
 
 730     CYThrow(CYExpression *value) :
 
 735     virtual void Output(std::ostream &out) const;
 
 741     CYExpression *scope_;
 
 744     CYWith(CYExpression *scope, CYStatement *code) :
 
 750     virtual void Output(std::ostream &out) const;
 
 756     CYExpression *value_;
 
 759     CYSwitch(CYExpression *value, CYClause *clauses) :
 
 765     virtual void Output(std::ostream &out) const;
 
 773     CYExpression *false_;
 
 775     CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
 
 781     virtual void Output(std::ostream &out) const;
 
 787     CYAddressOf(CYExpression *rhs) :
 
 792     virtual const char *Operator() const {
 
 796     virtual void Output(std::ostream &out) const;
 
 802     CYIndirect(CYExpression *rhs) :
 
 807     virtual const char *Operator() const {
 
 811     virtual void Output(std::ostream &out) const;
 
 814 #define CYPostfix_(op, name) \
 
 815     struct CY ## name : \
 
 818         CY ## name(CYExpression *lhs) : \
 
 823         virtual const char *Operator() const { \
 
 828 #define CYPrefix_(op, name) \
 
 829     struct CY ## name : \
 
 832         CY ## name(CYExpression *rhs) : \
 
 837         virtual const char *Operator() const { \
 
 842 #define CYInfix_(op, name) \
 
 843     struct CY ## name : \
 
 846         CY ## name(CYExpression *lhs, CYExpression *rhs) : \
 
 851         virtual const char *Operator() const { \
 
 856 #define CYAssignment_(op, name) \
 
 857     struct CY ## name ## Assign : \
 
 860         CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
 
 861             CYAssignment(lhs, rhs) \
 
 865         virtual const char *Operator() const { \
 
 870 CYPostfix_("++", PostIncrement)
 
 871 CYPostfix_("--", PostDecrement)
 
 873 CYPrefix_("delete", Delete)
 
 874 CYPrefix_("void", Void)
 
 875 CYPrefix_("typeof", TypeOf)
 
 876 CYPrefix_("++", PreIncrement)
 
 877 CYPrefix_("--", PreDecrement)
 
 878 CYPrefix_("-", Negate)
 
 879 CYPrefix_("~", BitwiseNot)
 
 880 CYPrefix_("!", LogicalNot)
 
 882 CYInfix_("*", Multiply)
 
 883 CYInfix_("/", Divide)
 
 884 CYInfix_("%", Modulus)
 
 886 CYInfix_("-", Subtract)
 
 887 CYInfix_("<<", ShiftLeft)
 
 888 CYInfix_(">>", ShiftRightSigned)
 
 889 CYInfix_(">>>", ShiftRightUnsigned)
 
 891 CYInfix_(">", Greater)
 
 892 CYInfix_("<=", LessOrEqual)
 
 893 CYInfix_(">=", GreaterOrEqual)
 
 894 CYInfix_("instanceof", InstanceOf)
 
 896 CYInfix_("==", Equal)
 
 897 CYInfix_("!=", NotEqual)
 
 898 CYInfix_("===", Identical)
 
 899 CYInfix_("!==", NotIdentical)
 
 900 CYInfix_("&", BitwiseAnd)
 
 901 CYInfix_("^", BitwiseXOr)
 
 902 CYInfix_("|", BitwiseOr)
 
 903 CYInfix_("&&", LogicalAnd)
 
 904 CYInfix_("||", LogicalOr)
 
 907 CYAssignment_("*=", Multiply)
 
 908 CYAssignment_("/=", Divide)
 
 909 CYAssignment_("%=", Modulus)
 
 910 CYAssignment_("+=", Add)
 
 911 CYAssignment_("-=", Subtract)
 
 912 CYAssignment_("<<=", ShiftLeft)
 
 913 CYAssignment_(">>=", ShiftRightSigned)
 
 914 CYAssignment_(">>>=", ShiftRightUnsigned)
 
 915 CYAssignment_("&=", BitwiseAnd)
 
 916 CYAssignment_("^=", BitwiseXOr)
 
 917 CYAssignment_("|=", BitwiseOr)
 
 919 #endif/*CYPARSER_HPP*/