1 /* Cycript - Inlining/Optimizing JavaScript Compiler
2 * Copyright (C) 2009 Jay Freeman (saurik)
5 /* Modified BSD License {{{ */
7 * Redistribution and use in source and binary
8 * forms, with or without modification, are permitted
9 * provided that the following conditions are met:
11 * 1. Redistributions of source code must retain the
12 * above copyright notice, this list of conditions
13 * and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the
15 * above copyright notice, this list of conditions
16 * and the following disclaimer in the documentation
17 * and/or other materials provided with the
19 * 3. The name of the author may not be used to endorse
20 * or promote products derived from this software
21 * without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS''
24 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
25 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
26 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
30 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
34 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
36 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43 // XXX: wtf is this here?!
53 #include "location.hh"
54 #include "Pooling.hpp"
56 template <typename Type_>
70 void SetNext(Type_ *next) {
79 virtual void Output(struct CYOutput &out) const = 0;
96 CYOutput(std::ostream &out) :
105 void Check(char value);
108 CYOutput &operator <<(char rhs);
109 CYOutput &operator <<(const char *rhs);
111 _finline CYOutput &operator <<(const CYThing *rhs) {
117 _finline CYOutput &operator <<(const CYThing &rhs) {
123 struct CYPropertyName {
124 virtual void PropertyName(CYOutput &out) const = 0;
126 virtual ~CYPropertyName() {
140 CYNoBrace = (1 << 0),
141 CYNoFunction = (1 << 1),
144 CYNoRightHand = (1 << 4),
145 CYNoDangle = (1 << 5),
146 CYNoInteger = (1 << 6),
147 CYNoBF = (CYNoBrace | CYNoFunction),
153 CYContext(apr_pool_t *pool) :
158 template <typename Type_>
159 void Replace(Type_ *&value) {
161 while (Type_ *replace = value->Replace(*this))
169 virtual ~CYStatement() {
172 void Single(CYOutput &out, CYFlags flags) const;
173 void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
175 CYStatement *ReplaceAll(CYContext &context);
177 virtual CYStatement *Replace(CYContext &context) = 0;
180 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
183 struct CYStatements {
193 operator CYStatement *() const {
197 CYStatements &operator ->*(CYStatement *next) {
199 if (first_ == NULL) {
202 } else for (;; last_ = last_->next_)
203 if (last_->next_ == NULL) {
213 virtual ~CYClassName() {
216 virtual CYExpression *ClassName(CYContext &context, bool object) = 0;
217 virtual void ClassName(CYOutput &out, bool object) const = 0;
227 CYWord(const char *word) :
232 const char *Value() const {
236 virtual void Output(CYOutput &out) const;
238 virtual CYExpression *ClassName(CYContext &context, bool object);
239 virtual void ClassName(CYOutput &out, bool object) const;
240 virtual void PropertyName(CYOutput &out) const;
243 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
244 return lhs << rhs.Value();
247 struct CYIdentifier :
250 CYIdentifier(const char *word) :
261 CYComment(const char *value) :
266 virtual CYStatement *Replace(CYContext &context);
267 virtual void Output(CYOutput &out, CYFlags flags) const;
274 CYStatement *statement_;
276 CYLabel(CYIdentifier *name, CYStatement *statement) :
278 statement_(statement)
282 virtual CYStatement *Replace(CYContext &context);
283 virtual void Output(CYOutput &out, CYFlags flags) const;
289 CYStatement *statements_;
291 CYProgram(CYStatement *statements) :
292 statements_(statements)
296 virtual void Replace(CYContext &context);
298 virtual void Output(CYOutput &out) const;
305 CYStatement *statements_;
307 CYBlock(CYStatement *statements) :
308 statements_(statements)
312 operator CYStatement *() const {
316 virtual CYStatement *Replace(CYContext &context);
318 virtual void Output(CYOutput &out) const;
319 virtual void Output(CYOutput &out, CYFlags flags) const;
347 std::string filename_;
351 cy::location location_;
352 std::string message_;
355 typedef std::vector<Error> Errors;
362 void ScannerDestroy();
365 CYDriver(const std::string &filename);
368 Condition GetCondition();
369 void SetCondition(Condition condition);
371 void PushCondition(Condition condition);
374 void Warning(const cy::location &location, const char *message);
377 struct CYForInitialiser {
378 virtual ~CYForInitialiser() {
381 virtual void For(CYOutput &out) const = 0;
384 struct CYForInInitialiser {
385 virtual ~CYForInInitialiser() {
388 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
389 virtual const char *ForEachIn() const = 0;
390 virtual CYExpression *ForEachIn(CYContext &out) = 0;
396 struct CYExpression :
397 CYNext<CYExpression>,
403 virtual unsigned Precedence() const = 0;
405 virtual bool RightHand() const {
409 virtual void For(CYOutput &out) const;
410 virtual void ForIn(CYOutput &out, CYFlags flags) const;
412 virtual const char *ForEachIn() const;
413 virtual CYExpression *ForEachIn(CYContext &out);
415 virtual void Output(CYOutput &out) const;
416 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
417 void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
419 virtual CYExpression *ClassName(CYContext &context, bool object);
420 virtual void ClassName(CYOutput &out, bool object) const;
422 CYExpression *ReplaceAll(CYContext &context);
424 virtual CYExpression *Replace(CYContext &context) = 0;
426 virtual CYExpression *Primitive(CYContext &context) {
430 virtual CYNumber *Number(CYContext &context) {
434 virtual CYString *String(CYContext &context) {
438 virtual const char *Word() const {
443 #define CYAlphabetic(value) \
444 virtual bool Alphabetic() const { \
448 #define CYPrecedence(value) \
449 virtual unsigned Precedence() const { \
453 #define CYRightHand(value) \
454 virtual bool RightHand() const { \
461 CYExpression *expressions_;
463 CYCompound(CYExpression *expressions) :
464 expressions_(expressions)
468 void AddPrev(CYExpression *expression) {
469 CYExpression *last(expression);
470 while (last->next_ != NULL)
472 last->SetNext(expressions_);
473 expressions_ = expression;
478 virtual CYExpression *Replace(CYContext &context);
479 void Output(CYOutput &out, CYFlags flags) const;
482 struct CYFunctionParameter :
483 CYNext<CYFunctionParameter>,
488 CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next = NULL) :
489 CYNext<CYFunctionParameter>(next),
494 virtual void Output(CYOutput &out) const;
497 struct CYComprehension :
498 CYNext<CYComprehension>,
501 virtual const char *Name() const = 0;
503 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
504 CYFunctionParameter *Parameters(CYContext &context) const;
505 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
506 virtual void Output(CYOutput &out) const = 0;
509 struct CYForInComprehension :
515 CYForInComprehension(CYIdentifier *name, CYExpression *set) :
521 virtual const char *Name() const {
522 return name_->Value();
525 virtual CYFunctionParameter *Parameter(CYContext &context) const;
526 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
527 virtual void Output(CYOutput &out) const;
530 struct CYForEachInComprehension :
536 CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
542 virtual const char *Name() const {
543 return name_->Value();
546 virtual CYFunctionParameter *Parameter(CYContext &context) const;
547 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
548 virtual void Output(CYOutput &out) const;
551 struct CYIfComprehension :
556 CYIfComprehension(CYExpression *test) :
561 virtual const char *Name() const {
565 virtual CYFunctionParameter *Parameter(CYContext &context) const;
566 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
567 virtual void Output(CYOutput &out) const;
570 struct CYArrayComprehension :
573 CYExpression *expression_;
574 CYComprehension *comprehensions_;
576 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
577 expression_(expression),
578 comprehensions_(comprehensions)
584 virtual CYExpression *Replace(CYContext &context);
585 virtual void Output(CYOutput &out, CYFlags flags) const;
598 virtual CYExpression *Replace(CYContext &context);
612 CYRange(uint64_t lo, uint64_t hi) :
617 bool operator [](uint8_t value) const {
618 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
621 void operator()(uint8_t value) {
624 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
628 extern CYRange DigitRange_;
629 extern CYRange WordStartRange_;
630 extern CYRange WordEndRange_;
645 CYString(const char *value) :
651 CYString(const char *value, size_t size) :
657 CYString(const CYWord *word) :
658 value_(word->Value()),
659 size_(strlen(value_))
663 const char *Value() const {
667 virtual const char *Word() const;
669 virtual CYNumber *Number(CYContext &context);
670 virtual CYString *String(CYContext &context);
672 CYString *Concat(CYContext &out, CYString *rhs) const;
673 virtual void Output(CYOutput &out, CYFlags flags) const;
674 virtual void PropertyName(CYOutput &out) const;
683 CYNumber(double value) :
688 double Value() const {
692 virtual CYNumber *Number(CYContext &context);
693 virtual CYString *String(CYContext &context);
695 virtual void Output(CYOutput &out, CYFlags flags) const;
696 virtual void PropertyName(CYOutput &out) const;
704 CYRegEx(const char *value) :
709 const char *Value() const {
713 virtual void Output(CYOutput &out, CYFlags flags) const;
725 virtual CYNumber *Number(CYContext &context);
726 virtual CYString *String(CYContext &context);
728 virtual void Output(CYOutput &out, CYFlags flags) const;
740 virtual CYExpression *Replace(CYContext &context);
741 virtual void Output(CYOutput &out, CYFlags flags) const;
747 virtual bool Value() const = 0;
748 virtual void Output(CYOutput &out, CYFlags flags) const;
760 virtual bool Value() const {
764 virtual CYNumber *Number(CYContext &context);
765 virtual CYString *String(CYContext &context);
777 virtual bool Value() const {
781 virtual CYNumber *Number(CYContext &context);
782 virtual CYString *String(CYContext &context);
790 CYVariable(CYIdentifier *name) :
798 virtual CYExpression *Replace(CYContext &context);
799 virtual void Output(CYOutput &out, CYFlags flags) const;
807 CYPrefix(CYExpression *rhs) :
812 virtual bool Alphabetic() const = 0;
813 virtual const char *Operator() const = 0;
817 virtual CYExpression *Replace(CYContext &context);
818 virtual void Output(CYOutput &out, CYFlags flags) const;
827 CYInfix(CYExpression *lhs, CYExpression *rhs) :
833 void SetLeft(CYExpression *lhs) {
837 virtual bool Alphabetic() const = 0;
838 virtual const char *Operator() const = 0;
840 virtual CYExpression *Replace(CYContext &context);
841 virtual void Output(CYOutput &out, CYFlags flags) const;
849 CYPostfix(CYExpression *lhs) :
854 virtual const char *Operator() const = 0;
858 virtual CYExpression *Replace(CYContext &context);
859 virtual void Output(CYOutput &out, CYFlags flags) const;
862 struct CYAssignment :
868 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
874 void SetLeft(CYExpression *lhs) {
878 virtual const char *Operator() const = 0;
882 virtual CYExpression *Replace(CYContext &context);
883 virtual void Output(CYOutput &out, CYFlags flags) const;
891 CYExpression *value_;
893 CYArgument(CYExpression *value, CYArgument *next = NULL) :
894 CYNext<CYArgument>(next),
900 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
901 CYNext<CYArgument>(next),
907 void Replace(CYContext &context);
908 void Output(CYOutput &out) const;
925 CYStatement *statements_;
927 CYClause(CYExpression *_case, CYStatement *statements) :
929 statements_(statements)
933 void Replace(CYContext &context);
934 virtual void Output(CYOutput &out) const;
941 CYExpression *value_;
943 CYElement(CYExpression *value, CYElement *next) :
944 CYNext<CYElement>(next),
949 void Replace(CYContext &context);
950 void Output(CYOutput &out) const;
956 CYElement *elements_;
958 CYArray(CYElement *elements = NULL) :
963 virtual CYExpression *Replace(CYContext &context);
964 virtual void Output(CYOutput &out, CYFlags flags) const;
971 CYPropertyName *name_;
972 CYExpression *value_;
974 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
975 CYNext<CYProperty>(next),
981 void Replace(CYContext &context);
982 virtual void Output(CYOutput &out) const;
985 struct CYDeclaration :
988 CYIdentifier *identifier_;
989 CYExpression *initialiser_;
991 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
992 identifier_(identifier),
993 initialiser_(initialiser)
997 virtual void ForIn(CYOutput &out, CYFlags flags) const;
999 virtual const char *ForEachIn() const;
1000 virtual CYExpression *ForEachIn(CYContext &out);
1002 void Replace(CYContext &context);
1004 virtual void Output(CYOutput &out, CYFlags flags) const;
1007 struct CYDeclarations :
1008 CYNext<CYDeclarations>,
1012 CYDeclaration *declaration_;
1014 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1015 CYNext<CYDeclarations>(next),
1016 declaration_(declaration)
1020 virtual void For(CYOutput &out) const;
1022 void Replace(CYContext &context);
1023 CYProperty *Property(CYContext &context);
1025 virtual void Output(CYOutput &out) const;
1026 virtual void Output(CYOutput &out, CYFlags flags) const;
1032 CYDeclarations *declarations_;
1034 CYVar(CYDeclarations *declarations) :
1035 declarations_(declarations)
1039 virtual CYStatement *Replace(CYContext &context);
1040 virtual void Output(CYOutput &out, CYFlags flags) const;
1046 CYDeclarations *declarations_;
1049 CYLet(CYDeclarations *declarations, CYStatement *statements) :
1050 declarations_(declarations),
1055 virtual CYStatement *Replace(CYContext &context);
1056 virtual void Output(CYOutput &out, CYFlags flags) const;
1062 CYForInitialiser *initialiser_;
1063 CYExpression *test_;
1064 CYExpression *increment_;
1067 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1068 initialiser_(initialiser),
1070 increment_(increment),
1075 virtual CYStatement *Replace(CYContext &context);
1076 virtual void Output(CYOutput &out, CYFlags flags) const;
1082 CYForInInitialiser *initialiser_;
1086 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1087 initialiser_(initialiser),
1093 virtual CYStatement *Replace(CYContext &context);
1094 virtual void Output(CYOutput &out, CYFlags flags) const;
1097 struct CYForEachIn :
1100 CYForInInitialiser *initialiser_;
1104 CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1105 initialiser_(initialiser),
1111 virtual CYStatement *Replace(CYContext &context);
1112 virtual void Output(CYOutput &out, CYFlags flags) const;
1118 CYProperty *properties_;
1120 CYObject(CYProperty *properties) :
1121 properties_(properties)
1125 virtual CYExpression *Replace(CYContext &context);
1126 void Output(CYOutput &out, CYFlags flags) const;
1132 CYExpression *object_;
1133 CYExpression *property_;
1135 CYMember(CYExpression *object, CYExpression *property) :
1141 void SetLeft(CYExpression *object) {
1145 void Replace_(CYContext &context);
1148 struct CYDirectMember :
1151 CYDirectMember(CYExpression *object, CYExpression *property) :
1152 CYMember(object, property)
1159 virtual CYExpression *Replace(CYContext &context);
1160 virtual void Output(CYOutput &out, CYFlags flags) const;
1163 struct CYIndirectMember :
1166 CYIndirectMember(CYExpression *object, CYExpression *property) :
1167 CYMember(object, property)
1174 virtual CYExpression *Replace(CYContext &context);
1175 virtual void Output(CYOutput &out, CYFlags flags) const;
1181 CYExpression *constructor_;
1182 CYArgument *arguments_;
1184 CYNew(CYExpression *constructor, CYArgument *arguments) :
1185 constructor_(constructor),
1186 arguments_(arguments)
1190 virtual unsigned Precedence() const {
1191 return arguments_ == NULL ? 2 : 1;
1196 virtual CYExpression *Replace(CYContext &context);
1197 virtual void Output(CYOutput &out, CYFlags flags) const;
1203 CYExpression *function_;
1204 CYArgument *arguments_;
1206 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1207 function_(function),
1208 arguments_(arguments)
1215 virtual CYExpression *Replace(CYContext &context);
1216 virtual void Output(CYOutput &out, CYFlags flags) const;
1222 CYExpression *test_;
1224 CYStatement *false_;
1226 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1233 virtual CYStatement *Replace(CYContext &context);
1234 virtual void Output(CYOutput &out, CYFlags flags) const;
1240 CYExpression *test_;
1243 CYDoWhile(CYExpression *test, CYStatement *code) :
1249 virtual CYStatement *Replace(CYContext &context);
1250 virtual void Output(CYOutput &out, CYFlags flags) const;
1256 CYExpression *test_;
1259 CYWhile(CYExpression *test, CYStatement *code) :
1265 virtual CYStatement *Replace(CYContext &context);
1266 virtual void Output(CYOutput &out, CYFlags flags) const;
1270 CYIdentifier *name_;
1271 CYFunctionParameter *parameters_;
1274 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1276 parameters_(parameters),
1281 virtual ~CYFunction() {
1284 virtual void Replace_(CYContext &context);
1285 virtual void Output(CYOutput &out, CYFlags flags) const;
1288 struct CYFunctionExpression :
1292 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1293 CYFunction(name, parameters, statements)
1300 virtual CYExpression *Replace(CYContext &context);
1301 virtual void Output(CYOutput &out, CYFlags flags) const;
1304 struct CYFunctionStatement :
1308 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1309 CYFunction(name, parameters, statements)
1313 virtual CYStatement *Replace(CYContext &context);
1314 virtual void Output(CYOutput &out, CYFlags flags) const;
1320 CYExpression *expression_;
1322 CYExpress(CYExpression *expression) :
1323 expression_(expression)
1327 virtual CYStatement *Replace(CYContext &context);
1328 virtual void Output(CYOutput &out, CYFlags flags) const;
1334 CYIdentifier *label_;
1336 CYContinue(CYIdentifier *label) :
1341 virtual CYStatement *Replace(CYContext &context);
1342 virtual void Output(CYOutput &out, CYFlags flags) const;
1348 CYIdentifier *label_;
1350 CYBreak(CYIdentifier *label) :
1355 virtual CYStatement *Replace(CYContext &context);
1356 virtual void Output(CYOutput &out, CYFlags flags) const;
1362 CYExpression *value_;
1364 CYReturn(CYExpression *value) :
1369 virtual CYStatement *Replace(CYContext &context);
1370 virtual void Output(CYOutput &out, CYFlags flags) const;
1376 virtual CYStatement *Replace(CYContext &context);
1377 virtual void Output(CYOutput &out, CYFlags flags) const;
1385 CYFinally(CYStatement *statements) :
1390 void Replace(CYContext &context);
1391 virtual void Output(CYOutput &out) const;
1400 CYIdentifier *name_;
1403 Catch(CYIdentifier *name, CYStatement *statements) :
1409 void Replace(CYContext &context);
1410 virtual void Output(CYOutput &out) const;
1418 CYFinally *finally_;
1420 Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
1427 virtual CYStatement *Replace(CYContext &context);
1428 virtual void Output(CYOutput &out, CYFlags flags) const;
1434 CYExpression *value_;
1436 Throw(CYExpression *value) :
1441 virtual CYStatement *Replace(CYContext &context);
1442 virtual void Output(CYOutput &out, CYFlags flags) const;
1450 CYExpression *scope_;
1453 CYWith(CYExpression *scope, CYStatement *code) :
1459 virtual CYStatement *Replace(CYContext &context);
1460 virtual void Output(CYOutput &out, CYFlags flags) const;
1466 CYExpression *value_;
1469 CYSwitch(CYExpression *value, CYClause *clauses) :
1475 virtual CYStatement *Replace(CYContext &context);
1476 virtual void Output(CYOutput &out, CYFlags flags) const;
1479 struct CYCondition :
1482 CYExpression *test_;
1483 CYExpression *true_;
1484 CYExpression *false_;
1486 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
1495 virtual CYExpression *Replace(CYContext &context);
1496 virtual void Output(CYOutput &out, CYFlags flags) const;
1499 struct CYAddressOf :
1502 CYAddressOf(CYExpression *rhs) :
1507 virtual const char *Operator() const {
1513 virtual CYExpression *Replace(CYContext &context);
1519 CYIndirect(CYExpression *rhs) :
1524 virtual const char *Operator() const {
1530 virtual CYExpression *Replace(CYContext &context);
1534 virtual CYExpression *Replace(CYContext &context);
1536 #define CYPostfix_(op, name, args...) \
1537 struct CY ## name : \
1540 CY ## name(CYExpression *lhs) : \
1545 virtual const char *Operator() const { \
1550 #define CYPrefix_(alphabetic, op, name, args...) \
1551 struct CY ## name : \
1554 CY ## name(CYExpression *rhs) : \
1559 CYAlphabetic(alphabetic) \
1561 virtual const char *Operator() const { \
1566 #define CYInfix_(alphabetic, precedence, op, name, args...) \
1567 struct CY ## name : \
1570 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
1575 CYAlphabetic(alphabetic) \
1576 CYPrecedence(precedence) \
1578 virtual const char *Operator() const { \
1583 #define CYAssignment_(op, name, args...) \
1584 struct CY ## name ## Assign : \
1587 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
1588 CYAssignment(lhs, rhs) \
1592 virtual const char *Operator() const { \
1597 CYPostfix_("++", PostIncrement)
1598 CYPostfix_("--", PostDecrement)
1600 CYPrefix_(true, "delete", Delete)
1601 CYPrefix_(true, "void", Void)
1602 CYPrefix_(true, "typeof", TypeOf)
1603 CYPrefix_(false, "++", PreIncrement)
1604 CYPrefix_(false, "--", PreDecrement)
1605 CYPrefix_(false, "+", Affirm)
1606 CYPrefix_(false, "-", Negate)
1607 CYPrefix_(false, "~", BitwiseNot)
1608 CYPrefix_(false, "!", LogicalNot)
1610 CYInfix_(false, 5, "*", Multiply)
1611 CYInfix_(false, 5, "/", Divide)
1612 CYInfix_(false, 5, "%", Modulus)
1613 CYInfix_(false, 6, "+", Add, CYReplace)
1614 CYInfix_(false, 6, "-", Subtract)
1615 CYInfix_(false, 7, "<<", ShiftLeft)
1616 CYInfix_(false, 7, ">>", ShiftRightSigned)
1617 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
1618 CYInfix_(false, 8, "<", Less)
1619 CYInfix_(false, 8, ">", Greater)
1620 CYInfix_(false, 8, "<=", LessOrEqual)
1621 CYInfix_(false, 8, ">=", GreaterOrEqual)
1622 CYInfix_(true, 8, "instanceof", InstanceOf)
1623 CYInfix_(true, 8, "in", In)
1624 CYInfix_(false, 9, "==", Equal)
1625 CYInfix_(false, 9, "!=", NotEqual)
1626 CYInfix_(false, 9, "===", Identical)
1627 CYInfix_(false, 9, "!==", NotIdentical)
1628 CYInfix_(false, 10, "&", BitwiseAnd)
1629 CYInfix_(false, 11, "^", BitwiseXOr)
1630 CYInfix_(false, 12, "|", BitwiseOr)
1631 CYInfix_(false, 13, "&&", LogicalAnd)
1632 CYInfix_(false, 14, "||", LogicalOr)
1634 CYAssignment_("=", )
1635 CYAssignment_("*=", Multiply)
1636 CYAssignment_("/=", Divide)
1637 CYAssignment_("%=", Modulus)
1638 CYAssignment_("+=", Add)
1639 CYAssignment_("-=", Subtract)
1640 CYAssignment_("<<=", ShiftLeft)
1641 CYAssignment_(">>=", ShiftRightSigned)
1642 CYAssignment_(">>>=", ShiftRightUnsigned)
1643 CYAssignment_("&=", BitwiseAnd)
1644 CYAssignment_("^=", BitwiseXOr)
1645 CYAssignment_("|=", BitwiseOr)
1647 #endif/*CYPARSER_HPP*/