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(std::ostream &out) const = 0;
 
  73 _finline std::ostream &operator <<(std::ostream &out, const CYThing &rhs) {
 
  81     virtual void Show(std::ostream &out) const;
 
  82     virtual void Output(std::ostream &out) const = 0;
 
  83     virtual void Output(std::ostream &out, bool block) const;
 
  86 struct CYPropertyName {
 
  87     virtual void PropertyName(std::ostream &out) const = 0;
 
  91     virtual void ClassName(std::ostream &out) const = 0;
 
 101     CYWord(const char *word) :
 
 106     const char *Value() const {
 
 110     virtual void Output(std::ostream &out) const;
 
 112     virtual void ClassName(std::ostream &out) const;
 
 113     virtual void PropertyName(std::ostream &out) const;
 
 116 struct CYIdentifier :
 
 119     CYIdentifier(const char *word) :
 
 128     CYIdentifier *identifier_;
 
 130     CYLabel(CYIdentifier *identifier, CYLabel *next) :
 
 131         CYNext<CYLabel>(next),
 
 132         identifier_(identifier)
 
 142     void AddLabel(CYIdentifier *identifier) {
 
 143         label_ = new CYLabel(identifier, label_);
 
 163     std::string filename_;
 
 166         cy::location location_;
 
 167         std::string message_;
 
 170     typedef std::vector<Error> Errors;
 
 177     void ScannerDestroy();
 
 180     CYDriver(const std::string &filename);
 
 185     virtual void Part(std::ostream &out) const = 0;
 
 188 struct CYForInitialiser :
 
 193 struct CYForInInitialiser :
 
 200     CYNoBrace =    (1 << 0),
 
 201     CYNoFunction = (1 << 1),
 
 202     CYNoLeader =   (1 << 2),
 
 203     CYNoTrailer =  (1 << 3),
 
 205     CYNoHyphen =   (1 << 5),
 
 208 struct CYExpression :
 
 209     CYNext<CYExpression>,
 
 214     virtual unsigned Precedence() const = 0;
 
 215     virtual void Part(std::ostream &out) const;
 
 216     virtual void Output(std::ostream &out, CYFlags flags) const = 0;
 
 217     void Output(std::ostream &out, unsigned precedence, CYFlags flags) const;
 
 219     virtual void ClassName(std::ostream &out) const;
 
 221     virtual const char *Word() const {
 
 226 #define CYAlphabetic(value) \
 
 227     virtual bool Alphabetic() const { \
 
 231 #define CYPrecedence(value) \
 
 232     virtual unsigned Precedence() const { \
 
 239     CYExpression *expressions_;
 
 241     CYCompound(CYExpression *expressions) :
 
 242         expressions_(expressions)
 
 246     void AddPrev(CYExpression *expression) {
 
 247         CYExpression *last(expression);
 
 248         while (last->next_ != NULL)
 
 250         last->SetNext(expressions_);
 
 251         expressions_ = expression;
 
 256     void Output(std::ostream &out, CYFlags flags) const;
 
 271 struct CYSelectorPart :
 
 272     CYNext<CYSelectorPart>
 
 277     CYSelectorPart(CYWord *name, bool value, CYSelectorPart *next) :
 
 278         CYNext<CYSelectorPart>(next),
 
 284     virtual void Output(std::ostream &out) const;
 
 290     CYSelectorPart *name_;
 
 292     CYSelector(CYSelectorPart *name) :
 
 299     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 306     CYRange(uint64_t lo, uint64_t hi) :
 
 311     bool operator [](uint8_t value) const {
 
 312         return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
 
 315     void operator()(uint8_t value) {
 
 318         (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
 
 322 extern CYRange DigitRange_;
 
 323 extern CYRange WordStartRange_;
 
 324 extern CYRange WordEndRange_;
 
 333     CYString(const char *value, size_t size) :
 
 339     CYString(const CYIdentifier *identifier) :
 
 340         value_(identifier->Value()),
 
 341         size_(strlen(value_))
 
 345     const char *Value() const {
 
 349     virtual const char *Word() const {
 
 350         if (size_ == 0 || !WordStartRange_[value_[0]])
 
 352         for (size_t i(1); i != size_; ++i)
 
 353             if (!WordEndRange_[value_[i]])
 
 358     virtual void Output(std::ostream &out) const {
 
 359         return Output(out, CYNoFlags);
 
 362     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 363     virtual void PropertyName(std::ostream &out) const;
 
 372     CYNumber(double value) :
 
 377     double Value() const {
 
 381     virtual void Output(std::ostream &out) const {
 
 382         return Output(out, CYNoFlags);
 
 385     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 386     virtual void PropertyName(std::ostream &out) const;
 
 398     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 410     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 416     virtual bool Value() const = 0;
 
 417     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 429     virtual bool Value() const;
 
 441     virtual bool Value() const;
 
 449     CYVariable(CYIdentifier *name) :
 
 456     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 464     CYPrefix(CYExpression *rhs) :
 
 469     virtual bool Alphabetic() const = 0;
 
 470     virtual const char *Operator() const = 0;
 
 472     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 481     CYInfix(CYExpression *lhs, CYExpression *rhs) :
 
 487     void SetLeft(CYExpression *lhs) {
 
 491     virtual bool Alphabetic() const = 0;
 
 492     virtual const char *Operator() const = 0;
 
 494     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 502     CYPostfix(CYExpression *lhs) :
 
 507     virtual const char *Operator() const = 0;
 
 509     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 512 struct CYAssignment :
 
 518     CYAssignment(CYExpression *lhs, CYExpression *rhs) :
 
 524     void SetLeft(CYExpression *lhs) {
 
 528     virtual const char *Operator() const = 0;
 
 530     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 537     CYExpression *value_;
 
 539     CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
 
 540         CYNext<CYArgument>(next),
 
 546     void Output(std::ostream &out) const;
 
 565     CYClause(CYExpression *_case, CYStatement *code) :
 
 571     virtual void Output(std::ostream &out) const;
 
 577     CYExpression *value_;
 
 579     CYElement(CYExpression *value, CYElement *next) :
 
 580         CYNext<CYElement>(next),
 
 585     void Output(std::ostream &out) const;
 
 591     CYElement *elements_;
 
 593     CYArray(CYElement *elements) :
 
 598     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 601 struct CYDeclaration :
 
 605     CYIdentifier *identifier_;
 
 606     CYExpression *initialiser_;
 
 608     CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser) :
 
 609         identifier_(identifier),
 
 610         initialiser_(initialiser)
 
 614     virtual void Part(std::ostream &out) const;
 
 615     virtual void Output(std::ostream &out) const;
 
 618 struct CYDeclarations :
 
 622     CYDeclaration *declaration_;
 
 623     CYDeclarations *next_;
 
 625     CYDeclarations(CYDeclaration *declaration, CYDeclarations *next) :
 
 626         declaration_(declaration),
 
 631     virtual void Part(std::ostream &out) const;
 
 632     virtual void Output(std::ostream &out) const;
 
 638     virtual void Output(std::ostream &out) const;
 
 641 struct CYMessageParameter :
 
 642     CYNext<CYMessageParameter>
 
 648     CYMessageParameter(CYWord *tag, CYExpression *type, CYIdentifier *name) :
 
 661     CYMessageParameter *parameter_;
 
 664     CYMessage(bool instance, CYExpression *type, CYMessageParameter *parameter, CYSource *body) :
 
 667         parameter_(parameter),
 
 672     virtual void Output(std::ostream &out, bool replace) const;
 
 679     CYExpression *super_;
 
 681     CYMessage *messages_;
 
 683     CYClass(CYIdentifier *name, CYExpression *super, CYField *fields, CYMessage *messages) :
 
 691     virtual void Output(std::ostream &out) const;
 
 698     CYMessage *messages_;
 
 700     CYCategory(CYClassName *name, CYMessage *messages) :
 
 706     virtual void Output(std::ostream &out) const;
 
 709 struct CYFunctionParameter :
 
 710     CYNext<CYFunctionParameter>,
 
 715     CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next) :
 
 716         CYNext<CYFunctionParameter>(next),
 
 721     virtual void Output(std::ostream &out) const;
 
 727     CYForInitialiser *initialiser_;
 
 729     CYExpression *increment_;
 
 732     CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
 
 733         initialiser_(initialiser),
 
 735         increment_(increment),
 
 740     virtual void Output(std::ostream &out) const;
 
 746     CYForInInitialiser *initialiser_;
 
 750     CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
 
 751         initialiser_(initialiser),
 
 757     virtual void Output(std::ostream &out) const;
 
 763     CYPropertyName *name_;
 
 764     CYExpression *value_;
 
 766     CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next) :
 
 767         CYNext<CYProperty>(next),
 
 773     virtual void Output(std::ostream &out) const;
 
 779     CYProperty *property_;
 
 781     CYObject(CYProperty *property) :
 
 786     void Output(std::ostream &out, CYFlags flags) const;
 
 795     CYCatch(CYIdentifier *name, CYStatement *code) :
 
 801     virtual void Output(std::ostream &out) const;
 
 808     CYArgument *arguments_;
 
 810     CYSend(CYExpression *self, CYArgument *arguments) :
 
 812         arguments_(arguments)
 
 818     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 824     CYExpression *object_;
 
 825     CYExpression *property_;
 
 827     CYMember(CYExpression *object, CYExpression *property) :
 
 833     void SetLeft(CYExpression *object) {
 
 838 struct CYDirectMember :
 
 841     CYDirectMember(CYExpression *object, CYExpression *property) :
 
 842         CYMember(object, property)
 
 848     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 851 struct CYIndirectMember :
 
 854     CYIndirectMember(CYExpression *object, CYExpression *property) :
 
 855         CYMember(object, property)
 
 861     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 867     CYExpression *constructor_;
 
 868     CYArgument *arguments_;
 
 870     CYNew(CYExpression *constructor, CYArgument *arguments) :
 
 871         constructor_(constructor),
 
 872         arguments_(arguments)
 
 878     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 884     CYExpression *function_;
 
 885     CYArgument *arguments_;
 
 887     CYCall(CYExpression *function, CYArgument *arguments) :
 
 889         arguments_(arguments)
 
 895     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 905     CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false) :
 
 912     virtual void Output(std::ostream &out) const;
 
 921     CYDoWhile(CYExpression *test, CYStatement *code) :
 
 927     virtual void Output(std::ostream &out) const;
 
 936     CYWhile(CYExpression *test, CYStatement *code) :
 
 942     virtual void Output(std::ostream &out) const;
 
 949     CYFunctionParameter *parameters_;
 
 952     CYLambda(CYIdentifier *name, CYFunctionParameter *parameters, CYSource *body) :
 
 954         parameters_(parameters),
 
 961     virtual void Output(std::ostream &out, CYFlags flags) const;
 
 968     CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYSource *body) :
 
 969         CYLambda(name, parameters, body)
 
 973     virtual void Output(std::ostream &out) const;
 
 979     CYExpression *expression_;
 
 981     CYExpress(CYExpression *expression) :
 
 982         expression_(expression)
 
 986     virtual void Output(std::ostream &out) const;
 
 992     CYIdentifier *label_;
 
 994     CYContinue(CYIdentifier *label) :
 
 999     virtual void Output(std::ostream &out) const;
 
1005     CYIdentifier *label_;
 
1007     CYBreak(CYIdentifier *label) :
 
1012     virtual void Output(std::ostream &out) const;
 
1018     CYExpression *value_;
 
1020     CYReturn(CYExpression *value) :
 
1025     virtual void Output(std::ostream &out) const;
 
1031     virtual void Output(std::ostream &out) const;
 
1032     virtual void Output(std::ostream &out, bool block) const;
 
1040     CYStatement *finally_;
 
1042     CYTry(CYStatement *_try, CYCatch *_catch, CYStatement *finally) :
 
1049     virtual void Output(std::ostream &out) const;
 
1055     CYExpression *value_;
 
1057     CYThrow(CYExpression *value) :
 
1062     virtual void Output(std::ostream &out) const;
 
1068     CYExpression *scope_;
 
1071     CYWith(CYExpression *scope, CYStatement *code) :
 
1077     virtual void Output(std::ostream &out) const;
 
1083     CYExpression *value_;
 
1086     CYSwitch(CYExpression *value, CYClause *clauses) :
 
1092     virtual void Output(std::ostream &out) const;
 
1095 struct CYCondition :
 
1098     CYExpression *test_;
 
1099     CYExpression *true_;
 
1100     CYExpression *false_;
 
1102     CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
 
1111     virtual void Output(std::ostream &out, CYFlags flags) const;
 
1114 struct CYAddressOf :
 
1117     CYAddressOf(CYExpression *rhs) :
 
1122     virtual const char *Operator() const {
 
1129     virtual void Output(std::ostream &out, CYFlags flags) const;
 
1135     CYIndirect(CYExpression *rhs) :
 
1140     virtual const char *Operator() const {
 
1147     virtual void Output(std::ostream &out, CYFlags flags) const;
 
1150 #define CYPostfix_(op, name) \
 
1151     struct CY ## name : \
 
1154         CY ## name(CYExpression *lhs) : \
 
1161         virtual const char *Operator() const { \
 
1166 #define CYPrefix_(alphabetic, op, name) \
 
1167     struct CY ## name : \
 
1170         CY ## name(CYExpression *rhs) : \
 
1175         CYAlphabetic(alphabetic) \
 
1178         virtual const char *Operator() const { \
 
1183 #define CYInfix_(alphabetic, precedence, op, name) \
 
1184     struct CY ## name : \
 
1187         CY ## name(CYExpression *lhs, CYExpression *rhs) : \
 
1192         CYAlphabetic(alphabetic) \
 
1193         CYPrecedence(precedence) \
 
1195         virtual const char *Operator() const { \
 
1200 #define CYAssignment_(op, name) \
 
1201     struct CY ## name ## Assign : \
 
1204         CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
 
1205             CYAssignment(lhs, rhs) \
 
1211         virtual const char *Operator() const { \
 
1216 CYPostfix_("++", PostIncrement)
 
1217 CYPostfix_("--", PostDecrement)
 
1219 CYPrefix_(true, "delete", Delete)
 
1220 CYPrefix_(true, "void", Void)
 
1221 CYPrefix_(true, "typeof", TypeOf)
 
1222 CYPrefix_(false, "++", PreIncrement)
 
1223 CYPrefix_(false, "--", PreDecrement)
 
1224 CYPrefix_(false, "-", Negate)
 
1225 CYPrefix_(false, "~", BitwiseNot)
 
1226 CYPrefix_(false, "!", LogicalNot)
 
1228 CYInfix_(false, 5, "*", Multiply)
 
1229 CYInfix_(false, 5, "/", Divide)
 
1230 CYInfix_(false, 5, "%", Modulus)
 
1231 CYInfix_(false, 6, "+", Add)
 
1232 CYInfix_(false, 6, "-", Subtract)
 
1233 CYInfix_(false, 7, "<<", ShiftLeft)
 
1234 CYInfix_(false, 7, ">>", ShiftRightSigned)
 
1235 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
 
1236 CYInfix_(false, 8, "<", Less)
 
1237 CYInfix_(false, 8, ">", Greater)
 
1238 CYInfix_(false, 8, "<=", LessOrEqual)
 
1239 CYInfix_(false, 8, ">=", GreaterOrEqual)
 
1240 CYInfix_(true, 8, "instanceof", InstanceOf)
 
1241 CYInfix_(true, 8, "in", In)
 
1242 CYInfix_(false, 9, "==", Equal)
 
1243 CYInfix_(false, 9, "!=", NotEqual)
 
1244 CYInfix_(false, 9, "===", Identical)
 
1245 CYInfix_(false, 9, "!==", NotIdentical)
 
1246 CYInfix_(false, 10, "&", BitwiseAnd)
 
1247 CYInfix_(false, 11, "^", BitwiseXOr)
 
1248 CYInfix_(false, 12, "|", BitwiseOr)
 
1249 CYInfix_(false, 13, "&&", LogicalAnd)
 
1250 CYInfix_(false, 14, "||", LogicalOr)
 
1252 CYAssignment_("=", )
 
1253 CYAssignment_("*=", Multiply)
 
1254 CYAssignment_("/=", Divide)
 
1255 CYAssignment_("%=", Modulus)
 
1256 CYAssignment_("+=", Add)
 
1257 CYAssignment_("-=", Subtract)
 
1258 CYAssignment_("<<=", ShiftLeft)
 
1259 CYAssignment_(">>=", ShiftRightSigned)
 
1260 CYAssignment_(">>>=", ShiftRightUnsigned)
 
1261 CYAssignment_("&=", BitwiseAnd)
 
1262 CYAssignment_("^=", BitwiseXOr)
 
1263 CYAssignment_("|=", BitwiseOr)
 
1265 #endif/*CYPARSER_HPP*/