9 template <typename Type_>
18 void SetNext(Type_ *next) {
24 virtual void Output(std::ostream &out) const = 0;
27 _finline std::ostream &operator <<(std::ostream &out, const CYThing &rhs) {
33 virtual void Part(std::ostream &out) const = 0;
39 virtual void Show(std::ostream &out) const;
40 virtual void Output(std::ostream &out) const = 0;
41 virtual void Output(std::ostream &out, bool block) const;
47 virtual const char *Name() const = 0;
55 CYWord(const char *word) :
60 const char *Value() const {
64 virtual const char *Name() const {
68 virtual void Output(std::ostream &out) const;
74 CYIdentifier(const char *word) :
81 CYIdentifier *identifier_;
84 CYLabel(CYIdentifier *identifier, CYLabel *next) :
85 identifier_(identifier),
96 void AddLabel(CYIdentifier *identifier) {
97 label_ = new CYLabel(identifier, label_);
104 std::string filename_;
110 void ScannerDestroy();
113 CYDriver(const std::string &filename);
119 struct CYForInitialiser :
124 struct CYForInInitialiser :
129 struct CYExpression :
130 CYNext<CYExpression>,
134 virtual void Part(std::ostream &out) const;
135 virtual void Output(std::ostream &out) const = 0;
136 void Output(std::ostream &out, bool raw) const;
139 _finline std::ostream &operator <<(std::ostream &out, const CYExpression &rhs) {
140 rhs.Output(out, false);
156 CYString(const char *value, size_t size) :
162 CYString(const CYIdentifier *identifier) :
163 value_(identifier->Value()),
164 size_(strlen(value_))
168 const char *Value() const {
172 virtual const char *Name() const {
176 virtual void Output(std::ostream &out) const;
185 CYNumber(double value) :
190 double Value() const {
194 virtual const char *Name() const {
198 virtual void Output(std::ostream &out) const;
210 virtual void Output(std::ostream &out) const;
222 virtual void Output(std::ostream &out) const;
228 virtual bool Value() const = 0;
229 virtual void Output(std::ostream &out) const;
241 virtual bool Value() const {
255 virtual bool Value() const {
265 CYVariable(CYIdentifier *name) :
270 virtual void Output(std::ostream &out) const;
278 CYPrefix(CYExpression *rhs) :
283 virtual const char *Operator() const = 0;
285 virtual void Output(std::ostream &out) const;
294 CYInfix(CYExpression *lhs, CYExpression *rhs) :
300 virtual const char *Operator() const = 0;
302 virtual void Output(std::ostream &out) const;
310 CYPostfix(CYExpression *lhs) :
315 virtual const char *Operator() const = 0;
317 virtual void Output(std::ostream &out) const;
320 struct CYAssignment :
323 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
328 virtual const char *Operator() const = 0;
333 CYExpression *value_;
336 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
343 void Output(std::ostream &out, bool send) const;
362 CYClause(CYExpression *_case, CYStatement *code) :
368 virtual void Output(std::ostream &out) const;
374 CYExpression *value_;
377 CYElement(CYExpression *value, CYElement *next) :
383 void Output(std::ostream &out, bool raw) const;
384 virtual void Output(std::ostream &out) const;
387 struct CYDeclaration :
391 CYIdentifier *identifier_;
392 CYExpression *initialiser_;
394 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser) :
395 identifier_(identifier),
396 initialiser_(initialiser)
400 virtual void Part(std::ostream &out) const;
401 virtual void Output(std::ostream &out) const;
404 struct CYDeclarations :
408 CYDeclaration *declaration_;
409 CYDeclarations *next_;
411 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next) :
412 declaration_(declaration),
417 virtual void Part(std::ostream &out) const;
418 virtual void Output(std::ostream &out) const;
427 CYParameter(CYIdentifier *name, CYParameter *next) :
433 virtual void Output(std::ostream &out) const;
439 CYForInitialiser *initialiser_;
441 CYExpression *increment_;
444 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
445 initialiser_(initialiser),
447 increment_(increment),
452 virtual void Output(std::ostream &out) const;
458 CYForInInitialiser *initialiser_;
462 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
463 initialiser_(initialiser),
469 virtual void Output(std::ostream &out) const;
476 CYExpression *value_;
479 CYProperty(CYName *name, CYExpression *value, CYProperty *next) :
486 void Output(std::ostream &out, bool raw) const;
487 virtual void Output(std::ostream &out) const;
496 CYCatch(CYIdentifier *name, CYStatement *code) :
502 virtual void Output(std::ostream &out) const;
509 CYArgument *arguments_;
511 CYMessage(CYExpression *self, CYArgument *arguments) :
513 arguments_(arguments)
517 virtual void Output(std::ostream &out) const;
523 CYExpression *object_;
524 CYExpression *property_;
526 CYMember(CYExpression *object, CYExpression *property) :
532 virtual void Output(std::ostream &out) const;
538 CYExpression *constructor_;
539 CYArgument *arguments_;
541 CYNew(CYExpression *constructor, CYArgument *arguments) :
542 constructor_(constructor),
543 arguments_(arguments)
547 virtual void Output(std::ostream &out) const;
553 CYExpression *function_;
554 CYArgument *arguments_;
556 CYCall(CYExpression *function, CYArgument *arguments) :
558 arguments_(arguments)
562 virtual void Output(std::ostream &out) const;
572 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false) :
579 virtual void Output(std::ostream &out) const;
588 CYDoWhile(CYExpression *test, CYStatement *code) :
594 virtual void Output(std::ostream &out) const;
603 CYWhile(CYExpression *test, CYStatement *code) :
609 virtual void Output(std::ostream &out) const;
616 CYParameter *parameters_;
619 CYLambda(CYIdentifier *name, CYParameter *parameters, CYSource *body) :
621 parameters_(parameters),
626 virtual void Output(std::ostream &out) const;
633 CYFunction(CYIdentifier *name, CYParameter *parameters, CYSource *body) :
634 CYLambda(name, parameters, body)
638 virtual void Output(std::ostream &out) const;
644 CYExpression *expression_;
646 CYExpress(CYExpression *expression) :
647 expression_(expression)
651 virtual void Output(std::ostream &out) const;
657 CYIdentifier *label_;
659 CYContinue(CYIdentifier *label) :
664 virtual void Output(std::ostream &out) const;
670 CYIdentifier *label_;
672 CYBreak(CYIdentifier *label) :
677 virtual void Output(std::ostream &out) const;
683 CYExpression *value_;
685 CYReturn(CYExpression *value) :
690 virtual void Output(std::ostream &out) const;
696 virtual void Output(std::ostream &out) const;
697 virtual void Output(std::ostream &out, bool block) const;
705 CYStatement *finally_;
707 CYTry(CYStatement *_try, CYCatch *_catch, CYStatement *finally) :
714 virtual void Output(std::ostream &out) const;
720 CYExpression *value_;
722 CYThrow(CYExpression *value) :
727 virtual void Output(std::ostream &out) const;
733 CYExpression *scope_;
736 CYWith(CYExpression *scope, CYStatement *code) :
742 virtual void Output(std::ostream &out) const;
748 CYExpression *value_;
751 CYSwitch(CYExpression *value, CYClause *clauses) :
757 virtual void Output(std::ostream &out) const;
765 CYExpression *false_;
767 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
773 virtual void Output(std::ostream &out) const;
779 CYAddressOf(CYExpression *rhs) :
784 virtual const char *Operator() const {
788 virtual void Output(std::ostream &out) const;
794 CYIndirect(CYExpression *rhs) :
799 virtual const char *Operator() const {
803 virtual void Output(std::ostream &out) const;
806 #define CYPostfix_(op, name) \
807 struct CY ## name : \
810 CY ## name(CYExpression *lhs) : \
815 virtual const char *Operator() const { \
820 #define CYPrefix_(op, name) \
821 struct CY ## name : \
824 CY ## name(CYExpression *rhs) : \
829 virtual const char *Operator() const { \
834 #define CYInfix_(op, name) \
835 struct CY ## name : \
838 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
843 virtual const char *Operator() const { \
848 #define CYAssignment_(op, name) \
849 struct CY ## name ## Assign : \
852 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
853 CYAssignment(lhs, rhs) \
857 virtual const char *Operator() const { \
862 CYPostfix_("++", PostIncrement)
863 CYPostfix_("--", PostDecrement)
865 CYPrefix_("delete", Delete)
866 CYPrefix_("void", Void)
867 CYPrefix_("typeof", TypeOf)
868 CYPrefix_("++", PreIncrement)
869 CYPrefix_("--", PreDecrement)
870 CYPrefix_("-", Negate)
871 CYPrefix_("~", BitwiseNot)
872 CYPrefix_("!", LogicalNot)
874 CYInfix_("*", Multiply)
875 CYInfix_("/", Divide)
876 CYInfix_("%", Modulus)
878 CYInfix_("-", Subtract)
879 CYInfix_("<<", ShiftLeft)
880 CYInfix_(">>", ShiftRightSigned)
881 CYInfix_(">>>", ShiftRightUnsigned)
883 CYInfix_(">", Greater)
884 CYInfix_("<=", LessOrEqual)
885 CYInfix_(">=", GreaterOrEqual)
886 CYInfix_("instanceof", InstanceOf)
888 CYInfix_("==", Equal)
889 CYInfix_("!=", NotEqual)
890 CYInfix_("===", Identical)
891 CYInfix_("!==", NotIdentical)
892 CYInfix_("&", BitwiseAnd)
893 CYInfix_("^", BitwiseXOr)
894 CYInfix_("|", BitwiseOr)
895 CYInfix_("&&", LogicalAnd)
896 CYInfix_("||", LogicalOr)
899 CYAssignment_("*=", Multiply)
900 CYAssignment_("/=", Divide)
901 CYAssignment_("%=", Modulus)
902 CYAssignment_("+=", Add)
903 CYAssignment_("-=", Subtract)
904 CYAssignment_("<<=", ShiftLeft)
905 CYAssignment_(">>=", ShiftRightSigned)
906 CYAssignment_(">>>=", ShiftRightUnsigned)
907 CYAssignment_("&=", BitwiseAnd)
908 CYAssignment_("^=", BitwiseXOr)
909 CYAssignment_("|=", BitwiseOr)
911 #endif/*CYPARSER_HPP*/