1 /* Cycript - Remove Execution Server and Disassembler
 
   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.
 
  47 #include "location.hh"
 
  48 #include "Pooling.hpp"
 
  50 template <typename Type_>
 
  64     void SetNext(Type_ *next) {
 
  70     virtual void Output(struct CYOutput &out) const = 0;
 
  76     CYOutput(std::ostream &out) :
 
  81     _finline CYOutput &operator <<(char rhs) {
 
  86     _finline CYOutput &operator <<(const char *rhs) {
 
  91     _finline CYOutput &operator <<(const CYThing &rhs) {
 
  97 struct CYPropertyName {
 
  98     virtual void PropertyName(CYOutput &out) const = 0;
 
 102     virtual void ClassName(CYOutput &out, bool object) const = 0;
 
 112     CYWord(const char *word) :
 
 117     const char *Value() const {
 
 121     virtual void Output(CYOutput &out) const;
 
 123     virtual void ClassName(CYOutput &out, bool object) const;
 
 124     virtual void PropertyName(CYOutput &out) const;
 
 127 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
 
 128     return lhs << rhs.Value();
 
 131 struct CYIdentifier :
 
 134     CYIdentifier(const char *word) :
 
 145     CYLabel(CYIdentifier *name, CYLabel *next) :
 
 146         CYNext<CYLabel>(next),
 
 160     CYNoBrace =      (1 << 0),
 
 161     CYNoFunction =   (1 << 1),
 
 162     CYNoLeader =     (1 << 2),
 
 163     CYNoTrailer =    (1 << 3),
 
 165     CYNoHyphen =     (1 << 5),
 
 167     CYNoRightHand =  (1 << 7),
 
 168     CYNoDangle =     (1 << 8),
 
 169     CYNoTerminator = (1 << 9),
 
 170     CYNoBF =         (CYNoBrace | CYNoFunction),
 
 183     void AddLabel(CYIdentifier *identifier) {
 
 184         labels_ = new CYLabel(identifier, labels_);
 
 187     virtual bool IsBlock() const {
 
 188         return next_ != NULL;
 
 191     virtual void Single(CYOutput &out, CYFlags flags) const;
 
 192     virtual void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
 
 195     virtual void Output(CYOutput &out, CYFlags flags) const = 0;
 
 201     CYStatement *statements_;
 
 203     CYBlock(CYStatement *statements) :
 
 204         statements_(statements)
 
 208     virtual bool IsBlock() const {
 
 212     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 239     std::string filename_;
 
 243         cy::location location_;
 
 244         std::string message_;
 
 247     typedef std::vector<Error> Errors;
 
 249     CYStatement *program_;
 
 254     void ScannerDestroy();
 
 257     CYDriver(const std::string &filename);
 
 260     void SetCondition(Condition condition);
 
 262     void Warning(const cy::location &location, const char *message);
 
 265 struct CYForInitialiser {
 
 266     virtual void For(CYOutput &out) const = 0;
 
 269 struct CYForInInitialiser {
 
 270     virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
 
 271     virtual const char *ForEachIn() const = 0;
 
 272     virtual void ForEachIn(CYOutput &out) const = 0;
 
 275 struct CYExpression :
 
 276     CYNext<CYExpression>,
 
 281     virtual unsigned Precedence() const = 0;
 
 283     virtual bool RightHand() const {
 
 287     virtual void For(CYOutput &out) const;
 
 288     virtual void ForIn(CYOutput &out, CYFlags flags) const;
 
 290     virtual const char *ForEachIn() const;
 
 291     virtual void ForEachIn(CYOutput &out) const;
 
 293     virtual void Output(CYOutput &out, CYFlags flags) const = 0;
 
 294     void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
 
 296     virtual void ClassName(CYOutput &out, bool object) const;
 
 298     virtual const char *Word() const {
 
 303 #define CYAlphabetic(value) \
 
 304     virtual bool Alphabetic() const { \
 
 308 #define CYPrecedence(value) \
 
 309     virtual unsigned Precedence() const { \
 
 313 #define CYRightHand(value) \
 
 314     virtual bool RightHand() const { \
 
 321     CYExpression *expressions_;
 
 323     CYCompound(CYExpression *expressions) :
 
 324         expressions_(expressions)
 
 328     void AddPrev(CYExpression *expression) {
 
 329         CYExpression *last(expression);
 
 330         while (last->next_ != NULL)
 
 332         last->SetNext(expressions_);
 
 333         expressions_ = expression;
 
 338     void Output(CYOutput &out, CYFlags flags) const;
 
 341 struct CYComprehension :
 
 342     CYNext<CYComprehension>
 
 344     void Output(CYOutput &out) const;
 
 345     virtual const char *Name() const = 0;
 
 347     virtual void Begin_(CYOutput &out) const = 0;
 
 349     virtual void End_(CYOutput &out) const {
 
 353 struct CYForInComprehension :
 
 359     CYForInComprehension(CYIdentifier *name, CYExpression *set) :
 
 365     virtual const char *Name() const {
 
 366         return name_->Value();
 
 369     virtual void Begin_(CYOutput &out) const;
 
 372 struct CYForEachInComprehension :
 
 378     CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
 
 384     virtual const char *Name() const {
 
 385         return name_->Value();
 
 388     virtual void Begin_(CYOutput &out) const;
 
 389     virtual void End_(CYOutput &out) const;
 
 392 struct CYIfComprehension :
 
 397     CYIfComprehension(CYExpression *test) :
 
 402     virtual const char *Name() const {
 
 406     virtual void Begin_(CYOutput &out) const;
 
 409 struct CYArrayComprehension :
 
 412     CYExpression *expression_;
 
 413     CYComprehension *comprehensions_;
 
 415     CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
 
 416         expression_(expression),
 
 417         comprehensions_(comprehensions)
 
 423     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 440 struct CYSelectorPart :
 
 441     CYNext<CYSelectorPart>
 
 446     CYSelectorPart(CYWord *name, bool value, CYSelectorPart *next) :
 
 447         CYNext<CYSelectorPart>(next),
 
 453     virtual void Output(CYOutput &out) const;
 
 459     CYSelectorPart *name_;
 
 461     CYSelector(CYSelectorPart *name) :
 
 468     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 475     CYRange(uint64_t lo, uint64_t hi) :
 
 480     bool operator [](uint8_t value) const {
 
 481         return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
 
 484     void operator()(uint8_t value) {
 
 487         (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
 
 491 extern CYRange DigitRange_;
 
 492 extern CYRange WordStartRange_;
 
 493 extern CYRange WordEndRange_;
 
 502     CYString(const char *value, size_t size) :
 
 508     CYString(const CYIdentifier *identifier) :
 
 509         value_(identifier->Value()),
 
 510         size_(strlen(value_))
 
 514     const char *Value() const {
 
 518     virtual const char *Word() const {
 
 519         if (size_ == 0 || !WordStartRange_[value_[0]])
 
 521         for (size_t i(1); i != size_; ++i)
 
 522             if (!WordEndRange_[value_[i]])
 
 527     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 528     virtual void PropertyName(CYOutput &out) const;
 
 537     CYNumber(double value) :
 
 542     double Value() const {
 
 546     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 547     virtual void PropertyName(CYOutput &out) const;
 
 555     CYRegEx(const char *value) :
 
 560     const char *Value() const {
 
 564     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 576     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 588     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 594     virtual bool Value() const = 0;
 
 595     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 607     virtual bool Value() const;
 
 619     virtual bool Value() const;
 
 627     CYVariable(CYIdentifier *name) :
 
 635     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 643     CYPrefix(CYExpression *rhs) :
 
 648     virtual bool Alphabetic() const = 0;
 
 649     virtual const char *Operator() const = 0;
 
 651     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 660     CYInfix(CYExpression *lhs, CYExpression *rhs) :
 
 666     void SetLeft(CYExpression *lhs) {
 
 670     virtual bool Alphabetic() const = 0;
 
 671     virtual const char *Operator() const = 0;
 
 673     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 681     CYPostfix(CYExpression *lhs) :
 
 686     virtual const char *Operator() const = 0;
 
 688     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 691 struct CYAssignment :
 
 697     CYAssignment(CYExpression *lhs, CYExpression *rhs) :
 
 703     void SetLeft(CYExpression *lhs) {
 
 707     virtual const char *Operator() const = 0;
 
 709     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 716     CYExpression *value_;
 
 718     CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
 
 719         CYNext<CYArgument>(next),
 
 725     void Output(CYOutput &out) const;
 
 744     CYClause(CYExpression *_case, CYStatement *code) :
 
 750     virtual void Output(CYOutput &out) const;
 
 756     CYExpression *value_;
 
 758     CYElement(CYExpression *value, CYElement *next) :
 
 759         CYNext<CYElement>(next),
 
 764     void Output(CYOutput &out) const;
 
 770     CYElement *elements_;
 
 772     CYArray(CYElement *elements) :
 
 777     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 780 struct CYDeclaration :
 
 783     CYIdentifier *identifier_;
 
 784     CYExpression *initialiser_;
 
 786     CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser) :
 
 787         identifier_(identifier),
 
 788         initialiser_(initialiser)
 
 792     virtual void ForIn(CYOutput &out, CYFlags flags) const;
 
 794     virtual const char *ForEachIn() const;
 
 795     virtual void ForEachIn(CYOutput &out) const;
 
 797     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 800 struct CYDeclarations :
 
 801     CYNext<CYDeclarations>,
 
 804     CYDeclaration *declaration_;
 
 806     CYDeclarations(CYDeclaration *declaration, CYDeclarations *next) :
 
 807         CYNext<CYDeclarations>(next),
 
 808         declaration_(declaration)
 
 812     virtual void For(CYOutput &out) const;
 
 813     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 819     CYDeclarations *declarations_;
 
 821     CYVar(CYDeclarations *declarations) :
 
 822         declarations_(declarations)
 
 826     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 832     CYDeclarations *declarations_;
 
 833     CYStatement *statements_;
 
 835     CYLet(CYDeclarations *declarations, CYStatement *statements) :
 
 836         declarations_(declarations),
 
 837         statements_(statements)
 
 841     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 847     virtual void Output(CYOutput &out) const;
 
 850 struct CYMessageParameter :
 
 851     CYNext<CYMessageParameter>
 
 857     CYMessageParameter(CYWord *tag, CYExpression *type, CYIdentifier *name) :
 
 870     CYMessageParameter *parameter_;
 
 873     CYMessage(bool instance, CYExpression *type, CYMessageParameter *parameter, CYStatement *body) :
 
 876         parameter_(parameter),
 
 881     virtual void Output(CYOutput &out, bool replace) const;
 
 886     CYExpression *super_;
 
 888     CYMessage *messages_;
 
 890     CYClass(CYClassName *name, CYExpression *super, CYField *fields, CYMessage *messages) :
 
 898     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 901 struct CYClassExpression :
 
 905     CYClassExpression(CYClassName *name, CYExpression *super, CYField *fields, CYMessage *messages) :
 
 906         CYClass(name, super, fields, messages)
 
 912     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 915 struct CYClassStatement :
 
 919     CYClassStatement(CYClassName *name, CYExpression *super, CYField *fields, CYMessage *messages) :
 
 920         CYClass(name, super, fields, messages)
 
 924     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 931     CYMessage *messages_;
 
 933     CYCategory(CYClassName *name, CYMessage *messages) :
 
 939     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 942 struct CYFunctionParameter :
 
 943     CYNext<CYFunctionParameter>,
 
 948     CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next) :
 
 949         CYNext<CYFunctionParameter>(next),
 
 954     virtual void Output(CYOutput &out) const;
 
 960     CYForInitialiser *initialiser_;
 
 962     CYExpression *increment_;
 
 965     CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
 
 966         initialiser_(initialiser),
 
 968         increment_(increment),
 
 973     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 979     CYForInInitialiser *initialiser_;
 
 983     CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
 
 984         initialiser_(initialiser),
 
 990     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 996     CYForInInitialiser *initialiser_;
 
1000     CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
 
1001         initialiser_(initialiser),
 
1007     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1013     CYPropertyName *name_;
 
1014     CYExpression *value_;
 
1016     CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next) :
 
1017         CYNext<CYProperty>(next),
 
1023     virtual void Output(CYOutput &out) const;
 
1029     CYProperty *property_;
 
1031     CYObject(CYProperty *property) :
 
1036     void Output(CYOutput &out, CYFlags flags) const;
 
1042     CYIdentifier *name_;
 
1045     CYCatch(CYIdentifier *name, CYStatement *code) :
 
1051     virtual void Output(CYOutput &out) const;
 
1057     CYExpression *self_;
 
1058     CYArgument *arguments_;
 
1060     CYSend(CYExpression *self, CYArgument *arguments) :
 
1062         arguments_(arguments)
 
1068     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1074     CYExpression *object_;
 
1075     CYExpression *property_;
 
1077     CYMember(CYExpression *object, CYExpression *property) :
 
1083     void SetLeft(CYExpression *object) {
 
1088 struct CYDirectMember :
 
1091     CYDirectMember(CYExpression *object, CYExpression *property) :
 
1092         CYMember(object, property)
 
1099     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1102 struct CYIndirectMember :
 
1105     CYIndirectMember(CYExpression *object, CYExpression *property) :
 
1106         CYMember(object, property)
 
1113     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1119     CYExpression *constructor_;
 
1120     CYArgument *arguments_;
 
1122     CYNew(CYExpression *constructor, CYArgument *arguments) :
 
1123         constructor_(constructor),
 
1124         arguments_(arguments)
 
1128     virtual unsigned Precedence() const {
 
1129         return arguments_ == NULL ? 2 : 1;
 
1134     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1140     CYExpression *function_;
 
1141     CYArgument *arguments_;
 
1143     CYCall(CYExpression *function, CYArgument *arguments) :
 
1144         function_(function),
 
1145         arguments_(arguments)
 
1152     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1158     CYExpression *test_;
 
1160     CYStatement *false_;
 
1162     CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false) :
 
1169     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1175     CYExpression *test_;
 
1178     CYDoWhile(CYExpression *test, CYStatement *code) :
 
1184     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1190     CYExpression *test_;
 
1193     CYWhile(CYExpression *test, CYStatement *code) :
 
1199     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1203     CYIdentifier *name_;
 
1204     CYFunctionParameter *parameters_;
 
1207     CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *body) :
 
1209         parameters_(parameters),
 
1214     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1217 struct CYFunctionExpression :
 
1221     CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *body) :
 
1222         CYFunction(name, parameters, body)
 
1229     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1232 struct CYFunctionStatement :
 
1236     CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *body) :
 
1237         CYFunction(name, parameters, body)
 
1241     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1247     CYExpression *expression_;
 
1249     CYExpress(CYExpression *expression) :
 
1250         expression_(expression)
 
1254     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1260     CYIdentifier *label_;
 
1262     CYContinue(CYIdentifier *label) :
 
1267     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1273     CYIdentifier *label_;
 
1275     CYBreak(CYIdentifier *label) :
 
1280     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1286     CYExpression *value_;
 
1288     CYReturn(CYExpression *value) :
 
1293     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1299     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1305     CYFinally(CYStatement *code) :
 
1310     virtual void Output(CYOutput &out) const;
 
1318     CYFinally *finally_;
 
1320     CYTry(CYStatement *code, CYCatch *_catch, CYFinally *finally) :
 
1327     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1333     CYExpression *value_;
 
1335     CYThrow(CYExpression *value) :
 
1340     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1346     CYExpression *scope_;
 
1349     CYWith(CYExpression *scope, CYStatement *code) :
 
1355     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1361     CYExpression *value_;
 
1364     CYSwitch(CYExpression *value, CYClause *clauses) :
 
1370     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1373 struct CYCondition :
 
1376     CYExpression *test_;
 
1377     CYExpression *true_;
 
1378     CYExpression *false_;
 
1380     CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
 
1389     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1392 struct CYAddressOf :
 
1395     CYAddressOf(CYExpression *rhs) :
 
1400     virtual const char *Operator() const {
 
1407     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1413     CYIndirect(CYExpression *rhs) :
 
1418     virtual const char *Operator() const {
 
1425     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1428 #define CYPostfix_(op, name) \
 
1429     struct CY ## name : \
 
1432         CY ## name(CYExpression *lhs) : \
 
1439         virtual const char *Operator() const { \
 
1444 #define CYPrefix_(alphabetic, op, name) \
 
1445     struct CY ## name : \
 
1448         CY ## name(CYExpression *rhs) : \
 
1453         CYAlphabetic(alphabetic) \
 
1456         virtual const char *Operator() const { \
 
1461 #define CYInfix_(alphabetic, precedence, op, name) \
 
1462     struct CY ## name : \
 
1465         CY ## name(CYExpression *lhs, CYExpression *rhs) : \
 
1470         CYAlphabetic(alphabetic) \
 
1471         CYPrecedence(precedence) \
 
1473         virtual const char *Operator() const { \
 
1478 #define CYAssignment_(op, name) \
 
1479     struct CY ## name ## Assign : \
 
1482         CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
 
1483             CYAssignment(lhs, rhs) \
 
1489         virtual const char *Operator() const { \
 
1494 CYPostfix_("++", PostIncrement)
 
1495 CYPostfix_("--", PostDecrement)
 
1497 CYPrefix_(true, "delete", Delete)
 
1498 CYPrefix_(true, "void", Void)
 
1499 CYPrefix_(true, "typeof", TypeOf)
 
1500 CYPrefix_(false, "++", PreIncrement)
 
1501 CYPrefix_(false, "--", PreDecrement)
 
1502 CYPrefix_(false, "-", Negate)
 
1503 CYPrefix_(false, "~", BitwiseNot)
 
1504 CYPrefix_(false, "!", LogicalNot)
 
1506 CYInfix_(false, 5, "*", Multiply)
 
1507 CYInfix_(false, 5, "/", Divide)
 
1508 CYInfix_(false, 5, "%", Modulus)
 
1509 CYInfix_(false, 6, "+", Add)
 
1510 CYInfix_(false, 6, "-", Subtract)
 
1511 CYInfix_(false, 7, "<<", ShiftLeft)
 
1512 CYInfix_(false, 7, ">>", ShiftRightSigned)
 
1513 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
 
1514 CYInfix_(false, 8, "<", Less)
 
1515 CYInfix_(false, 8, ">", Greater)
 
1516 CYInfix_(false, 8, "<=", LessOrEqual)
 
1517 CYInfix_(false, 8, ">=", GreaterOrEqual)
 
1518 CYInfix_(true, 8, "instanceof", InstanceOf)
 
1519 CYInfix_(true, 8, "in", In)
 
1520 CYInfix_(false, 9, "==", Equal)
 
1521 CYInfix_(false, 9, "!=", NotEqual)
 
1522 CYInfix_(false, 9, "===", Identical)
 
1523 CYInfix_(false, 9, "!==", NotIdentical)
 
1524 CYInfix_(false, 10, "&", BitwiseAnd)
 
1525 CYInfix_(false, 11, "^", BitwiseXOr)
 
1526 CYInfix_(false, 12, "|", BitwiseOr)
 
1527 CYInfix_(false, 13, "&&", LogicalAnd)
 
1528 CYInfix_(false, 14, "||", LogicalOr)
 
1530 CYAssignment_("=", )
 
1531 CYAssignment_("*=", Multiply)
 
1532 CYAssignment_("/=", Divide)
 
1533 CYAssignment_("%=", Modulus)
 
1534 CYAssignment_("+=", Add)
 
1535 CYAssignment_("-=", Subtract)
 
1536 CYAssignment_("<<=", ShiftLeft)
 
1537 CYAssignment_(">>=", ShiftRightSigned)
 
1538 CYAssignment_(">>>=", ShiftRightUnsigned)
 
1539 CYAssignment_("&=", BitwiseAnd)
 
1540 CYAssignment_("^=", BitwiseXOr)
 
1541 CYAssignment_("|=", BitwiseOr)
 
1543 #endif/*CYPARSER_HPP*/