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;
95 CYOutput(std::ostream &out) :
103 void Check(char value);
106 CYOutput &operator <<(char rhs);
107 CYOutput &operator <<(const char *rhs);
109 _finline CYOutput &operator <<(const CYThing *rhs) {
115 _finline CYOutput &operator <<(const CYThing &rhs) {
121 struct CYPropertyName {
122 virtual void PropertyName(CYOutput &out) const = 0;
124 virtual ~CYPropertyName() {
138 CYNoBrace = (1 << 0),
139 CYNoFunction = (1 << 1),
142 CYNoRightHand = (1 << 4),
143 CYNoDangle = (1 << 5),
144 CYNoInteger = (1 << 6),
145 CYNoBF = (CYNoBrace | CYNoFunction),
151 CYContext(apr_pool_t *pool) :
156 template <typename Type_>
157 void Replace(Type_ *&value) {
159 while (Type_ *replace = value->Replace(*this))
167 virtual ~CYStatement() {
170 void Single(CYOutput &out, CYFlags flags) const;
171 void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
173 CYStatement *ReplaceAll(CYContext &context);
175 virtual CYStatement *Replace(CYContext &context) = 0;
178 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
181 struct CYStatements {
191 operator CYStatement *() const {
195 CYStatements &operator ->*(CYStatement *next) {
197 if (first_ == NULL) {
200 } else for (;; last_ = last_->next_)
201 if (last_->next_ == NULL) {
211 virtual ~CYClassName() {
214 virtual CYExpression *ClassName(CYContext &context, bool object) = 0;
215 virtual void ClassName(CYOutput &out, bool object) const = 0;
225 CYWord(const char *word) :
230 const char *Value() const {
234 virtual void Output(CYOutput &out) const;
236 virtual CYExpression *ClassName(CYContext &context, bool object);
237 virtual void ClassName(CYOutput &out, bool object) const;
238 virtual void PropertyName(CYOutput &out) const;
241 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
242 return lhs << rhs.Value();
245 struct CYIdentifier :
248 CYIdentifier(const char *word) :
258 CYStatement *statement_;
260 CYLabel(CYIdentifier *name, CYStatement *statement) :
262 statement_(statement)
266 virtual CYStatement *Replace(CYContext &context);
267 virtual void Output(CYOutput &out, CYFlags flags) const;
273 CYStatement *statements_;
275 CYProgram(CYStatement *statements) :
276 statements_(statements)
280 virtual void Replace(CYContext &context);
282 virtual void Output(CYOutput &out) const;
289 CYStatement *statements_;
291 CYBlock(CYStatement *statements) :
292 statements_(statements)
296 operator CYStatement *() const {
300 virtual CYStatement *Replace(CYContext &context);
302 virtual void Output(CYOutput &out) const;
303 virtual void Output(CYOutput &out, CYFlags flags) const;
331 std::string filename_;
335 cy::location location_;
336 std::string message_;
339 typedef std::vector<Error> Errors;
346 void ScannerDestroy();
349 CYDriver(const std::string &filename);
352 Condition GetCondition();
353 void SetCondition(Condition condition);
355 void PushCondition(Condition condition);
358 void Warning(const cy::location &location, const char *message);
361 struct CYForInitialiser {
362 virtual ~CYForInitialiser() {
365 virtual void For(CYOutput &out) const = 0;
368 struct CYForInInitialiser {
369 virtual ~CYForInInitialiser() {
372 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
373 virtual const char *ForEachIn() const = 0;
374 virtual CYExpression *ForEachIn(CYContext &out) = 0;
380 struct CYExpression :
381 CYNext<CYExpression>,
387 virtual unsigned Precedence() const = 0;
389 virtual bool RightHand() const {
393 virtual void For(CYOutput &out) const;
394 virtual void ForIn(CYOutput &out, CYFlags flags) const;
396 virtual const char *ForEachIn() const;
397 virtual CYExpression *ForEachIn(CYContext &out);
399 virtual void Output(CYOutput &out) const;
400 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
401 void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
403 virtual CYExpression *ClassName(CYContext &context, bool object);
404 virtual void ClassName(CYOutput &out, bool object) const;
406 CYExpression *ReplaceAll(CYContext &context);
408 virtual CYExpression *Replace(CYContext &context) = 0;
410 virtual CYExpression *Primitive(CYContext &context) {
414 virtual CYNumber *Number(CYContext &context) {
418 virtual CYString *String(CYContext &context) {
422 virtual const char *Word() const {
427 #define CYAlphabetic(value) \
428 virtual bool Alphabetic() const { \
432 #define CYPrecedence(value) \
433 virtual unsigned Precedence() const { \
437 #define CYRightHand(value) \
438 virtual bool RightHand() const { \
445 CYExpression *expressions_;
447 CYCompound(CYExpression *expressions) :
448 expressions_(expressions)
452 void AddPrev(CYExpression *expression) {
453 CYExpression *last(expression);
454 while (last->next_ != NULL)
456 last->SetNext(expressions_);
457 expressions_ = expression;
462 virtual CYExpression *Replace(CYContext &context);
463 void Output(CYOutput &out, CYFlags flags) const;
466 struct CYFunctionParameter :
467 CYNext<CYFunctionParameter>,
472 CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next = NULL) :
473 CYNext<CYFunctionParameter>(next),
478 virtual void Output(CYOutput &out) const;
481 struct CYComprehension :
482 CYNext<CYComprehension>,
485 virtual const char *Name() const = 0;
487 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
488 CYFunctionParameter *Parameters(CYContext &context) const;
489 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
490 virtual void Output(CYOutput &out) const = 0;
493 struct CYForInComprehension :
499 CYForInComprehension(CYIdentifier *name, CYExpression *set) :
505 virtual const char *Name() const {
506 return name_->Value();
509 virtual CYFunctionParameter *Parameter(CYContext &context) const;
510 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
511 virtual void Output(CYOutput &out) const;
514 struct CYForEachInComprehension :
520 CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
526 virtual const char *Name() const {
527 return name_->Value();
530 virtual CYFunctionParameter *Parameter(CYContext &context) const;
531 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
532 virtual void Output(CYOutput &out) const;
535 struct CYIfComprehension :
540 CYIfComprehension(CYExpression *test) :
545 virtual const char *Name() const {
549 virtual CYFunctionParameter *Parameter(CYContext &context) const;
550 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
551 virtual void Output(CYOutput &out) const;
554 struct CYArrayComprehension :
557 CYExpression *expression_;
558 CYComprehension *comprehensions_;
560 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
561 expression_(expression),
562 comprehensions_(comprehensions)
568 virtual CYExpression *Replace(CYContext &context);
569 virtual void Output(CYOutput &out, CYFlags flags) const;
582 virtual CYExpression *Replace(CYContext &context);
596 CYRange(uint64_t lo, uint64_t hi) :
601 bool operator [](uint8_t value) const {
602 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
605 void operator()(uint8_t value) {
608 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
612 extern CYRange DigitRange_;
613 extern CYRange WordStartRange_;
614 extern CYRange WordEndRange_;
629 CYString(const char *value) :
635 CYString(const char *value, size_t size) :
641 CYString(const CYWord *word) :
642 value_(word->Value()),
643 size_(strlen(value_))
647 const char *Value() const {
651 virtual const char *Word() const;
653 virtual CYNumber *Number(CYContext &context);
654 virtual CYString *String(CYContext &context);
656 CYString *Concat(CYContext &out, CYString *rhs) const;
657 virtual void Output(CYOutput &out, CYFlags flags) const;
658 virtual void PropertyName(CYOutput &out) const;
667 CYNumber(double value) :
672 double Value() const {
676 virtual CYNumber *Number(CYContext &context);
677 virtual CYString *String(CYContext &context);
679 virtual void Output(CYOutput &out, CYFlags flags) const;
680 virtual void PropertyName(CYOutput &out) const;
688 CYRegEx(const char *value) :
693 const char *Value() const {
697 virtual void Output(CYOutput &out, CYFlags flags) const;
709 virtual CYNumber *Number(CYContext &context);
710 virtual CYString *String(CYContext &context);
712 virtual void Output(CYOutput &out, CYFlags flags) const;
724 virtual CYExpression *Replace(CYContext &context);
725 virtual void Output(CYOutput &out, CYFlags flags) const;
731 virtual bool Value() const = 0;
732 virtual void Output(CYOutput &out, CYFlags flags) const;
744 virtual bool Value() const {
748 virtual CYNumber *Number(CYContext &context);
749 virtual CYString *String(CYContext &context);
761 virtual bool Value() const {
765 virtual CYNumber *Number(CYContext &context);
766 virtual CYString *String(CYContext &context);
774 CYVariable(CYIdentifier *name) :
782 virtual CYExpression *Replace(CYContext &context);
783 virtual void Output(CYOutput &out, CYFlags flags) const;
791 CYPrefix(CYExpression *rhs) :
796 virtual bool Alphabetic() const = 0;
797 virtual const char *Operator() const = 0;
801 virtual CYExpression *Replace(CYContext &context);
802 virtual void Output(CYOutput &out, CYFlags flags) const;
811 CYInfix(CYExpression *lhs, CYExpression *rhs) :
817 void SetLeft(CYExpression *lhs) {
821 virtual bool Alphabetic() const = 0;
822 virtual const char *Operator() const = 0;
824 virtual CYExpression *Replace(CYContext &context);
825 virtual void Output(CYOutput &out, CYFlags flags) const;
833 CYPostfix(CYExpression *lhs) :
838 virtual const char *Operator() const = 0;
842 virtual CYExpression *Replace(CYContext &context);
843 virtual void Output(CYOutput &out, CYFlags flags) const;
846 struct CYAssignment :
852 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
858 void SetLeft(CYExpression *lhs) {
862 virtual const char *Operator() const = 0;
866 virtual CYExpression *Replace(CYContext &context);
867 virtual void Output(CYOutput &out, CYFlags flags) const;
875 CYExpression *value_;
877 CYArgument(CYExpression *value, CYArgument *next = NULL) :
878 CYNext<CYArgument>(next),
884 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
885 CYNext<CYArgument>(next),
891 void Replace(CYContext &context);
892 void Output(CYOutput &out) const;
909 CYStatement *statements_;
911 CYClause(CYExpression *_case, CYStatement *statements) :
913 statements_(statements)
917 void Replace(CYContext &context);
918 virtual void Output(CYOutput &out) const;
925 CYExpression *value_;
927 CYElement(CYExpression *value, CYElement *next) :
928 CYNext<CYElement>(next),
933 void Replace(CYContext &context);
934 void Output(CYOutput &out) const;
940 CYElement *elements_;
942 CYArray(CYElement *elements = NULL) :
947 virtual CYExpression *Replace(CYContext &context);
948 virtual void Output(CYOutput &out, CYFlags flags) const;
955 CYPropertyName *name_;
956 CYExpression *value_;
958 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
959 CYNext<CYProperty>(next),
965 void Replace(CYContext &context);
966 virtual void Output(CYOutput &out) const;
969 struct CYDeclaration :
972 CYIdentifier *identifier_;
973 CYExpression *initialiser_;
975 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
976 identifier_(identifier),
977 initialiser_(initialiser)
981 virtual void ForIn(CYOutput &out, CYFlags flags) const;
983 virtual const char *ForEachIn() const;
984 virtual CYExpression *ForEachIn(CYContext &out);
986 void Replace(CYContext &context);
988 virtual void Output(CYOutput &out, CYFlags flags) const;
991 struct CYDeclarations :
992 CYNext<CYDeclarations>,
996 CYDeclaration *declaration_;
998 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
999 CYNext<CYDeclarations>(next),
1000 declaration_(declaration)
1004 virtual void For(CYOutput &out) const;
1006 void Replace(CYContext &context);
1007 CYProperty *Property(CYContext &context);
1009 virtual void Output(CYOutput &out) const;
1010 virtual void Output(CYOutput &out, CYFlags flags) const;
1016 CYDeclarations *declarations_;
1018 CYVar(CYDeclarations *declarations) :
1019 declarations_(declarations)
1023 virtual CYStatement *Replace(CYContext &context);
1024 virtual void Output(CYOutput &out, CYFlags flags) const;
1030 CYDeclarations *declarations_;
1033 CYLet(CYDeclarations *declarations, CYStatement *statements) :
1034 declarations_(declarations),
1039 virtual CYStatement *Replace(CYContext &context);
1040 virtual void Output(CYOutput &out, CYFlags flags) const;
1046 CYForInitialiser *initialiser_;
1047 CYExpression *test_;
1048 CYExpression *increment_;
1051 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1052 initialiser_(initialiser),
1054 increment_(increment),
1059 virtual CYStatement *Replace(CYContext &context);
1060 virtual void Output(CYOutput &out, CYFlags flags) const;
1066 CYForInInitialiser *initialiser_;
1070 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1071 initialiser_(initialiser),
1077 virtual CYStatement *Replace(CYContext &context);
1078 virtual void Output(CYOutput &out, CYFlags flags) const;
1081 struct CYForEachIn :
1084 CYForInInitialiser *initialiser_;
1088 CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1089 initialiser_(initialiser),
1095 virtual CYStatement *Replace(CYContext &context);
1096 virtual void Output(CYOutput &out, CYFlags flags) const;
1102 CYProperty *properties_;
1104 CYObject(CYProperty *properties) :
1105 properties_(properties)
1109 virtual CYExpression *Replace(CYContext &context);
1110 void Output(CYOutput &out, CYFlags flags) const;
1116 CYExpression *object_;
1117 CYExpression *property_;
1119 CYMember(CYExpression *object, CYExpression *property) :
1125 void SetLeft(CYExpression *object) {
1129 void Replace_(CYContext &context);
1132 struct CYDirectMember :
1135 CYDirectMember(CYExpression *object, CYExpression *property) :
1136 CYMember(object, property)
1143 virtual CYExpression *Replace(CYContext &context);
1144 virtual void Output(CYOutput &out, CYFlags flags) const;
1147 struct CYIndirectMember :
1150 CYIndirectMember(CYExpression *object, CYExpression *property) :
1151 CYMember(object, property)
1158 virtual CYExpression *Replace(CYContext &context);
1159 virtual void Output(CYOutput &out, CYFlags flags) const;
1165 CYExpression *constructor_;
1166 CYArgument *arguments_;
1168 CYNew(CYExpression *constructor, CYArgument *arguments) :
1169 constructor_(constructor),
1170 arguments_(arguments)
1174 virtual unsigned Precedence() const {
1175 return arguments_ == NULL ? 2 : 1;
1180 virtual CYExpression *Replace(CYContext &context);
1181 virtual void Output(CYOutput &out, CYFlags flags) const;
1187 CYExpression *function_;
1188 CYArgument *arguments_;
1190 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1191 function_(function),
1192 arguments_(arguments)
1199 virtual CYExpression *Replace(CYContext &context);
1200 virtual void Output(CYOutput &out, CYFlags flags) const;
1206 CYExpression *test_;
1208 CYStatement *false_;
1210 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1217 virtual CYStatement *Replace(CYContext &context);
1218 virtual void Output(CYOutput &out, CYFlags flags) const;
1224 CYExpression *test_;
1227 CYDoWhile(CYExpression *test, CYStatement *code) :
1233 virtual CYStatement *Replace(CYContext &context);
1234 virtual void Output(CYOutput &out, CYFlags flags) const;
1240 CYExpression *test_;
1243 CYWhile(CYExpression *test, CYStatement *code) :
1249 virtual CYStatement *Replace(CYContext &context);
1250 virtual void Output(CYOutput &out, CYFlags flags) const;
1254 CYIdentifier *name_;
1255 CYFunctionParameter *parameters_;
1258 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1260 parameters_(parameters),
1265 virtual ~CYFunction() {
1268 virtual void Replace_(CYContext &context);
1269 virtual void Output(CYOutput &out, CYFlags flags) const;
1272 struct CYFunctionExpression :
1276 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1277 CYFunction(name, parameters, statements)
1284 virtual CYExpression *Replace(CYContext &context);
1285 virtual void Output(CYOutput &out, CYFlags flags) const;
1288 struct CYFunctionStatement :
1292 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1293 CYFunction(name, parameters, statements)
1297 virtual CYStatement *Replace(CYContext &context);
1298 virtual void Output(CYOutput &out, CYFlags flags) const;
1304 CYExpression *expression_;
1306 CYExpress(CYExpression *expression) :
1307 expression_(expression)
1311 virtual CYStatement *Replace(CYContext &context);
1312 virtual void Output(CYOutput &out, CYFlags flags) const;
1318 CYIdentifier *label_;
1320 CYContinue(CYIdentifier *label) :
1325 virtual CYStatement *Replace(CYContext &context);
1326 virtual void Output(CYOutput &out, CYFlags flags) const;
1332 CYIdentifier *label_;
1334 CYBreak(CYIdentifier *label) :
1339 virtual CYStatement *Replace(CYContext &context);
1340 virtual void Output(CYOutput &out, CYFlags flags) const;
1346 CYExpression *value_;
1348 CYReturn(CYExpression *value) :
1353 virtual CYStatement *Replace(CYContext &context);
1354 virtual void Output(CYOutput &out, CYFlags flags) const;
1360 virtual CYStatement *Replace(CYContext &context);
1361 virtual void Output(CYOutput &out, CYFlags flags) const;
1369 CYFinally(CYStatement *statements) :
1374 void Replace(CYContext &context);
1375 virtual void Output(CYOutput &out) const;
1384 CYIdentifier *name_;
1387 Catch(CYIdentifier *name, CYStatement *statements) :
1393 void Replace(CYContext &context);
1394 virtual void Output(CYOutput &out) const;
1402 CYFinally *finally_;
1404 Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
1411 virtual CYStatement *Replace(CYContext &context);
1412 virtual void Output(CYOutput &out, CYFlags flags) const;
1418 CYExpression *value_;
1420 Throw(CYExpression *value) :
1425 virtual CYStatement *Replace(CYContext &context);
1426 virtual void Output(CYOutput &out, CYFlags flags) const;
1434 CYExpression *scope_;
1437 CYWith(CYExpression *scope, CYStatement *code) :
1443 virtual CYStatement *Replace(CYContext &context);
1444 virtual void Output(CYOutput &out, CYFlags flags) const;
1450 CYExpression *value_;
1453 CYSwitch(CYExpression *value, CYClause *clauses) :
1459 virtual CYStatement *Replace(CYContext &context);
1460 virtual void Output(CYOutput &out, CYFlags flags) const;
1463 struct CYCondition :
1466 CYExpression *test_;
1467 CYExpression *true_;
1468 CYExpression *false_;
1470 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
1479 virtual CYExpression *Replace(CYContext &context);
1480 virtual void Output(CYOutput &out, CYFlags flags) const;
1483 struct CYAddressOf :
1486 CYAddressOf(CYExpression *rhs) :
1491 virtual const char *Operator() const {
1497 virtual CYExpression *Replace(CYContext &context);
1503 CYIndirect(CYExpression *rhs) :
1508 virtual const char *Operator() const {
1514 virtual CYExpression *Replace(CYContext &context);
1518 virtual CYExpression *Replace(CYContext &context);
1520 #define CYPostfix_(op, name, args...) \
1521 struct CY ## name : \
1524 CY ## name(CYExpression *lhs) : \
1529 virtual const char *Operator() const { \
1534 #define CYPrefix_(alphabetic, op, name, args...) \
1535 struct CY ## name : \
1538 CY ## name(CYExpression *rhs) : \
1543 CYAlphabetic(alphabetic) \
1545 virtual const char *Operator() const { \
1550 #define CYInfix_(alphabetic, precedence, op, name, args...) \
1551 struct CY ## name : \
1554 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
1559 CYAlphabetic(alphabetic) \
1560 CYPrecedence(precedence) \
1562 virtual const char *Operator() const { \
1567 #define CYAssignment_(op, name, args...) \
1568 struct CY ## name ## Assign : \
1571 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
1572 CYAssignment(lhs, rhs) \
1576 virtual const char *Operator() const { \
1581 CYPostfix_("++", PostIncrement)
1582 CYPostfix_("--", PostDecrement)
1584 CYPrefix_(true, "delete", Delete)
1585 CYPrefix_(true, "void", Void)
1586 CYPrefix_(true, "typeof", TypeOf)
1587 CYPrefix_(false, "++", PreIncrement)
1588 CYPrefix_(false, "--", PreDecrement)
1589 CYPrefix_(false, "+", Affirm)
1590 CYPrefix_(false, "-", Negate)
1591 CYPrefix_(false, "~", BitwiseNot)
1592 CYPrefix_(false, "!", LogicalNot)
1594 CYInfix_(false, 5, "*", Multiply)
1595 CYInfix_(false, 5, "/", Divide)
1596 CYInfix_(false, 5, "%", Modulus)
1597 CYInfix_(false, 6, "+", Add, CYReplace)
1598 CYInfix_(false, 6, "-", Subtract)
1599 CYInfix_(false, 7, "<<", ShiftLeft)
1600 CYInfix_(false, 7, ">>", ShiftRightSigned)
1601 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
1602 CYInfix_(false, 8, "<", Less)
1603 CYInfix_(false, 8, ">", Greater)
1604 CYInfix_(false, 8, "<=", LessOrEqual)
1605 CYInfix_(false, 8, ">=", GreaterOrEqual)
1606 CYInfix_(true, 8, "instanceof", InstanceOf)
1607 CYInfix_(true, 8, "in", In)
1608 CYInfix_(false, 9, "==", Equal)
1609 CYInfix_(false, 9, "!=", NotEqual)
1610 CYInfix_(false, 9, "===", Identical)
1611 CYInfix_(false, 9, "!==", NotIdentical)
1612 CYInfix_(false, 10, "&", BitwiseAnd)
1613 CYInfix_(false, 11, "^", BitwiseXOr)
1614 CYInfix_(false, 12, "|", BitwiseOr)
1615 CYInfix_(false, 13, "&&", LogicalAnd)
1616 CYInfix_(false, 14, "||", LogicalOr)
1618 CYAssignment_("=", )
1619 CYAssignment_("*=", Multiply)
1620 CYAssignment_("/=", Divide)
1621 CYAssignment_("%=", Modulus)
1622 CYAssignment_("+=", Add)
1623 CYAssignment_("-=", Subtract)
1624 CYAssignment_("<<=", ShiftLeft)
1625 CYAssignment_(">>=", ShiftRightSigned)
1626 CYAssignment_(">>>=", ShiftRightUnsigned)
1627 CYAssignment_("&=", BitwiseAnd)
1628 CYAssignment_("^=", BitwiseXOr)
1629 CYAssignment_("|=", BitwiseOr)
1631 #endif/*CYPARSER_HPP*/