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*/