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;
85 CYOutput(std::ostream &out) :
93 void Check(char value);
95 CYOutput &operator <<(char rhs);
96 CYOutput &operator <<(const char *rhs);
98 _finline CYOutput &operator <<(const CYThing *rhs) {
104 _finline CYOutput &operator <<(const CYThing &rhs) {
113 struct CYPropertyName {
114 virtual void PropertyName(CYOutput &out) const = 0;
118 virtual void ClassName(CYOutput &out, bool object) const = 0;
128 CYWord(const char *word) :
133 const char *Value() const {
137 virtual void Output(CYOutput &out) const;
139 virtual void ClassName(CYOutput &out, bool object) const;
140 virtual void PropertyName(CYOutput &out) const;
143 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
144 return lhs << rhs.Value();
147 struct CYIdentifier :
150 CYIdentifier(const char *word) :
161 CYLabel(CYIdentifier *name, CYLabel *next) :
162 CYNext<CYLabel>(next),
176 CYNoBrace = (1 << 0),
177 CYNoFunction = (1 << 1),
180 CYNoRightHand = (1 << 4),
181 CYNoDangle = (1 << 5),
182 CYNoBF = (CYNoBrace | CYNoFunction),
195 void AddLabel(CYIdentifier *identifier) {
196 labels_ = new CYLabel(identifier, labels_);
199 virtual bool IsBlock() const {
200 return next_ != NULL;
203 virtual void Single(CYOutput &out, CYFlags flags) const;
204 virtual void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
207 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
213 CYStatement *statements_;
215 CYBlock(CYStatement *statements) :
216 statements_(statements)
220 virtual bool IsBlock() const {
224 virtual void Output(CYOutput &out, CYFlags flags) const;
251 std::string filename_;
255 cy::location location_;
256 std::string message_;
259 typedef std::vector<Error> Errors;
261 CYStatement *program_;
266 void ScannerDestroy();
269 CYDriver(const std::string &filename);
272 void SetCondition(Condition condition);
274 void Warning(const cy::location &location, const char *message);
277 struct CYForInitialiser {
278 virtual void For(CYOutput &out) const = 0;
281 struct CYForInInitialiser {
282 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
283 virtual const char *ForEachIn() const = 0;
284 virtual void ForEachIn(CYOutput &out) const = 0;
287 struct CYExpression :
288 CYNext<CYExpression>,
294 virtual unsigned Precedence() const = 0;
296 virtual bool RightHand() const {
300 virtual void For(CYOutput &out) const;
301 virtual void ForIn(CYOutput &out, CYFlags flags) const;
303 virtual const char *ForEachIn() const;
304 virtual void ForEachIn(CYOutput &out) const;
306 virtual void Output(CYOutput &out) const;
307 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
308 void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
310 virtual void ClassName(CYOutput &out, bool object) const;
312 virtual const char *Word() const {
317 #define CYAlphabetic(value) \
318 virtual bool Alphabetic() const { \
322 #define CYPrecedence(value) \
323 virtual unsigned Precedence() const { \
327 #define CYRightHand(value) \
328 virtual bool RightHand() const { \
335 CYExpression *expressions_;
337 CYCompound(CYExpression *expressions) :
338 expressions_(expressions)
342 void AddPrev(CYExpression *expression) {
343 CYExpression *last(expression);
344 while (last->next_ != NULL)
346 last->SetNext(expressions_);
347 expressions_ = expression;
352 void Output(CYOutput &out, CYFlags flags) const;
355 struct CYComprehension :
356 CYNext<CYComprehension>,
359 void Output(CYOutput &out) const;
360 virtual const char *Name() const = 0;
362 virtual void Begin_(CYOutput &out) const = 0;
364 virtual void End_(CYOutput &out) const {
368 struct CYForInComprehension :
374 CYForInComprehension(CYIdentifier *name, CYExpression *set) :
380 virtual const char *Name() const {
381 return name_->Value();
384 virtual void Begin_(CYOutput &out) const;
387 struct CYForEachInComprehension :
393 CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
399 virtual const char *Name() const {
400 return name_->Value();
403 virtual void Begin_(CYOutput &out) const;
404 virtual void End_(CYOutput &out) const;
407 struct CYIfComprehension :
412 CYIfComprehension(CYExpression *test) :
417 virtual const char *Name() const {
421 virtual void Begin_(CYOutput &out) const;
424 struct CYArrayComprehension :
427 CYExpression *expression_;
428 CYComprehension *comprehensions_;
430 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
431 expression_(expression),
432 comprehensions_(comprehensions)
438 virtual void Output(CYOutput &out, CYFlags flags) const;
455 struct CYSelectorPart :
456 CYNext<CYSelectorPart>,
462 CYSelectorPart(CYWord *name, bool value, CYSelectorPart *next) :
463 CYNext<CYSelectorPart>(next),
469 virtual void Output(CYOutput &out) const;
475 CYSelectorPart *name_;
477 CYSelector(CYSelectorPart *name) :
484 virtual void Output(CYOutput &out, CYFlags flags) const;
491 CYRange(uint64_t lo, uint64_t hi) :
496 bool operator [](uint8_t value) const {
497 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
500 void operator()(uint8_t value) {
503 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
507 extern CYRange DigitRange_;
508 extern CYRange WordStartRange_;
509 extern CYRange WordEndRange_;
518 CYString(const char *value, size_t size) :
524 CYString(const CYIdentifier *identifier) :
525 value_(identifier->Value()),
526 size_(strlen(value_))
530 const char *Value() const {
534 virtual const char *Word() const;
536 virtual void Output(CYOutput &out, CYFlags flags) const;
537 virtual void PropertyName(CYOutput &out) const;
546 CYNumber(double value) :
551 double Value() const {
555 virtual void Output(CYOutput &out, CYFlags flags) const;
556 virtual void PropertyName(CYOutput &out) const;
564 CYRegEx(const char *value) :
569 const char *Value() const {
573 virtual void Output(CYOutput &out, CYFlags flags) const;
585 virtual void Output(CYOutput &out, CYFlags flags) const;
597 virtual void Output(CYOutput &out, CYFlags flags) const;
603 virtual bool Value() const = 0;
604 virtual void Output(CYOutput &out, CYFlags flags) const;
616 virtual bool Value() const {
630 virtual bool Value() const {
640 CYVariable(CYIdentifier *name) :
648 virtual void Output(CYOutput &out, CYFlags flags) const;
656 CYPrefix(CYExpression *rhs) :
661 virtual bool Alphabetic() const = 0;
662 virtual const char *Operator() const = 0;
664 virtual void Output(CYOutput &out, CYFlags flags) const;
673 CYInfix(CYExpression *lhs, CYExpression *rhs) :
679 void SetLeft(CYExpression *lhs) {
683 virtual bool Alphabetic() const = 0;
684 virtual const char *Operator() const = 0;
686 virtual void Output(CYOutput &out, CYFlags flags) const;
694 CYPostfix(CYExpression *lhs) :
699 virtual const char *Operator() const = 0;
701 virtual void Output(CYOutput &out, CYFlags flags) const;
704 struct CYAssignment :
710 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
716 void SetLeft(CYExpression *lhs) {
720 virtual const char *Operator() const = 0;
722 virtual void Output(CYOutput &out, CYFlags flags) const;
730 CYExpression *value_;
732 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
733 CYNext<CYArgument>(next),
739 void Output(CYOutput &out) const;
758 CYClause(CYExpression *_case, CYStatement *code) :
764 virtual void Output(CYOutput &out) const;
771 CYExpression *value_;
773 CYElement(CYExpression *value, CYElement *next) :
774 CYNext<CYElement>(next),
779 void Output(CYOutput &out) const;
785 CYElement *elements_;
787 CYArray(CYElement *elements) :
792 virtual void Output(CYOutput &out, CYFlags flags) const;
795 struct CYDeclaration :
798 CYIdentifier *identifier_;
799 CYExpression *initialiser_;
801 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser) :
802 identifier_(identifier),
803 initialiser_(initialiser)
807 virtual void ForIn(CYOutput &out, CYFlags flags) const;
809 virtual const char *ForEachIn() const;
810 virtual void ForEachIn(CYOutput &out) const;
812 virtual void Output(CYOutput &out, CYFlags flags) const;
815 struct CYDeclarations :
816 CYNext<CYDeclarations>,
820 CYDeclaration *declaration_;
822 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next) :
823 CYNext<CYDeclarations>(next),
824 declaration_(declaration)
828 virtual void For(CYOutput &out) const;
830 virtual void Output(CYOutput &out) const;
831 virtual void Output(CYOutput &out, CYFlags flags) const;
837 CYDeclarations *declarations_;
839 CYVar(CYDeclarations *declarations) :
840 declarations_(declarations)
844 virtual void Output(CYOutput &out, CYFlags flags) const;
850 CYDeclarations *declarations_;
851 CYStatement *statements_;
853 CYLet(CYDeclarations *declarations, CYStatement *statements) :
854 declarations_(declarations),
855 statements_(statements)
859 virtual void Output(CYOutput &out, CYFlags flags) const;
865 virtual void Output(CYOutput &out) const;
868 struct CYMessageParameter :
869 CYNext<CYMessageParameter>
875 CYMessageParameter(CYWord *tag, CYExpression *type, CYIdentifier *name) :
888 CYMessageParameter *parameter_;
891 CYMessage(bool instance, CYExpression *type, CYMessageParameter *parameter, CYStatement *body) :
894 parameter_(parameter),
899 virtual void Output(CYOutput &out, bool replace) const;
904 CYExpression *super_;
906 CYMessage *messages_;
908 CYClass(CYClassName *name, CYExpression *super, CYField *fields, CYMessage *messages) :
916 virtual void Output(CYOutput &out, CYFlags flags) const;
919 struct CYClassExpression :
923 CYClassExpression(CYClassName *name, CYExpression *super, CYField *fields, CYMessage *messages) :
924 CYClass(name, super, fields, messages)
930 virtual void Output(CYOutput &out, CYFlags flags) const;
933 struct CYClassStatement :
937 CYClassStatement(CYClassName *name, CYExpression *super, CYField *fields, CYMessage *messages) :
938 CYClass(name, super, fields, messages)
942 virtual void Output(CYOutput &out, CYFlags flags) const;
949 CYMessage *messages_;
951 CYCategory(CYClassName *name, CYMessage *messages) :
957 virtual void Output(CYOutput &out, CYFlags flags) const;
960 struct CYFunctionParameter :
961 CYNext<CYFunctionParameter>,
966 CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next) :
967 CYNext<CYFunctionParameter>(next),
972 virtual void Output(CYOutput &out) const;
978 CYForInitialiser *initialiser_;
980 CYExpression *increment_;
983 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
984 initialiser_(initialiser),
986 increment_(increment),
991 virtual void Output(CYOutput &out, CYFlags flags) const;
997 CYForInInitialiser *initialiser_;
1001 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1002 initialiser_(initialiser),
1008 virtual void Output(CYOutput &out, CYFlags flags) const;
1011 struct CYForEachIn :
1014 CYForInInitialiser *initialiser_;
1018 CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1019 initialiser_(initialiser),
1025 virtual void Output(CYOutput &out, CYFlags flags) const;
1032 CYPropertyName *name_;
1033 CYExpression *value_;
1035 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next) :
1036 CYNext<CYProperty>(next),
1042 virtual void Output(CYOutput &out) const;
1048 CYProperty *property_;
1050 CYObject(CYProperty *property) :
1055 void Output(CYOutput &out, CYFlags flags) const;
1061 CYIdentifier *name_;
1064 CYCatch(CYIdentifier *name, CYStatement *code) :
1070 virtual void Output(CYOutput &out) const;
1076 CYExpression *self_;
1077 CYArgument *arguments_;
1079 CYSend(CYExpression *self, CYArgument *arguments) :
1081 arguments_(arguments)
1087 virtual void Output(CYOutput &out, CYFlags flags) const;
1093 CYExpression *object_;
1094 CYExpression *property_;
1096 CYMember(CYExpression *object, CYExpression *property) :
1102 void SetLeft(CYExpression *object) {
1107 struct CYDirectMember :
1110 CYDirectMember(CYExpression *object, CYExpression *property) :
1111 CYMember(object, property)
1118 virtual void Output(CYOutput &out, CYFlags flags) const;
1121 struct CYIndirectMember :
1124 CYIndirectMember(CYExpression *object, CYExpression *property) :
1125 CYMember(object, property)
1132 virtual void Output(CYOutput &out, CYFlags flags) const;
1138 CYExpression *constructor_;
1139 CYArgument *arguments_;
1141 CYNew(CYExpression *constructor, CYArgument *arguments) :
1142 constructor_(constructor),
1143 arguments_(arguments)
1147 virtual unsigned Precedence() const {
1148 return arguments_ == NULL ? 2 : 1;
1153 virtual void Output(CYOutput &out, CYFlags flags) const;
1159 CYExpression *function_;
1160 CYArgument *arguments_;
1162 CYCall(CYExpression *function, CYArgument *arguments) :
1163 function_(function),
1164 arguments_(arguments)
1171 virtual void Output(CYOutput &out, CYFlags flags) const;
1177 CYExpression *test_;
1179 CYStatement *false_;
1181 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false) :
1188 virtual void Output(CYOutput &out, CYFlags flags) const;
1194 CYExpression *test_;
1197 CYDoWhile(CYExpression *test, CYStatement *code) :
1203 virtual void Output(CYOutput &out, CYFlags flags) const;
1209 CYExpression *test_;
1212 CYWhile(CYExpression *test, CYStatement *code) :
1218 virtual void Output(CYOutput &out, CYFlags flags) const;
1222 CYIdentifier *name_;
1223 CYFunctionParameter *parameters_;
1226 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *body) :
1228 parameters_(parameters),
1233 virtual void Output(CYOutput &out, CYFlags flags) const;
1236 struct CYFunctionExpression :
1240 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *body) :
1241 CYFunction(name, parameters, body)
1248 virtual void Output(CYOutput &out, CYFlags flags) const;
1251 struct CYFunctionStatement :
1255 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *body) :
1256 CYFunction(name, parameters, body)
1260 virtual void Output(CYOutput &out, CYFlags flags) const;
1266 CYExpression *expression_;
1268 CYExpress(CYExpression *expression) :
1269 expression_(expression)
1273 virtual void Output(CYOutput &out, CYFlags flags) const;
1279 CYIdentifier *label_;
1281 CYContinue(CYIdentifier *label) :
1286 virtual void Output(CYOutput &out, CYFlags flags) const;
1292 CYIdentifier *label_;
1294 CYBreak(CYIdentifier *label) :
1299 virtual void Output(CYOutput &out, CYFlags flags) const;
1305 CYExpression *value_;
1307 CYReturn(CYExpression *value) :
1312 virtual void Output(CYOutput &out, CYFlags flags) const;
1318 virtual void Output(CYOutput &out, CYFlags flags) const;
1326 CYFinally(CYStatement *code) :
1331 virtual void Output(CYOutput &out) const;
1339 CYFinally *finally_;
1341 CYTry(CYStatement *code, CYCatch *_catch, CYFinally *finally) :
1348 virtual void Output(CYOutput &out, CYFlags flags) const;
1354 CYExpression *value_;
1356 CYThrow(CYExpression *value) :
1361 virtual void Output(CYOutput &out, CYFlags flags) const;
1367 CYExpression *scope_;
1370 CYWith(CYExpression *scope, CYStatement *code) :
1376 virtual void Output(CYOutput &out, CYFlags flags) const;
1382 CYExpression *value_;
1385 CYSwitch(CYExpression *value, CYClause *clauses) :
1391 virtual void Output(CYOutput &out, CYFlags flags) const;
1394 struct CYCondition :
1397 CYExpression *test_;
1398 CYExpression *true_;
1399 CYExpression *false_;
1401 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
1410 virtual void Output(CYOutput &out, CYFlags flags) const;
1413 struct CYAddressOf :
1416 CYAddressOf(CYExpression *rhs) :
1421 virtual const char *Operator() const {
1428 virtual void Output(CYOutput &out, CYFlags flags) const;
1434 CYIndirect(CYExpression *rhs) :
1439 virtual const char *Operator() const {
1446 virtual void Output(CYOutput &out, CYFlags flags) const;
1449 #define CYPostfix_(op, name) \
1450 struct CY ## name : \
1453 CY ## name(CYExpression *lhs) : \
1460 virtual const char *Operator() const { \
1465 #define CYPrefix_(alphabetic, op, name) \
1466 struct CY ## name : \
1469 CY ## name(CYExpression *rhs) : \
1474 CYAlphabetic(alphabetic) \
1477 virtual const char *Operator() const { \
1482 #define CYInfix_(alphabetic, precedence, op, name) \
1483 struct CY ## name : \
1486 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
1491 CYAlphabetic(alphabetic) \
1492 CYPrecedence(precedence) \
1494 virtual const char *Operator() const { \
1499 #define CYAssignment_(op, name) \
1500 struct CY ## name ## Assign : \
1503 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
1504 CYAssignment(lhs, rhs) \
1510 virtual const char *Operator() const { \
1515 CYPostfix_("++", PostIncrement)
1516 CYPostfix_("--", PostDecrement)
1518 CYPrefix_(true, "delete", Delete)
1519 CYPrefix_(true, "void", Void)
1520 CYPrefix_(true, "typeof", TypeOf)
1521 CYPrefix_(false, "++", PreIncrement)
1522 CYPrefix_(false, "--", PreDecrement)
1523 CYPrefix_(false, "-", Negate)
1524 CYPrefix_(false, "~", BitwiseNot)
1525 CYPrefix_(false, "!", LogicalNot)
1527 CYInfix_(false, 5, "*", Multiply)
1528 CYInfix_(false, 5, "/", Divide)
1529 CYInfix_(false, 5, "%", Modulus)
1530 CYInfix_(false, 6, "+", Add)
1531 CYInfix_(false, 6, "-", Subtract)
1532 CYInfix_(false, 7, "<<", ShiftLeft)
1533 CYInfix_(false, 7, ">>", ShiftRightSigned)
1534 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
1535 CYInfix_(false, 8, "<", Less)
1536 CYInfix_(false, 8, ">", Greater)
1537 CYInfix_(false, 8, "<=", LessOrEqual)
1538 CYInfix_(false, 8, ">=", GreaterOrEqual)
1539 CYInfix_(true, 8, "instanceof", InstanceOf)
1540 CYInfix_(true, 8, "in", In)
1541 CYInfix_(false, 9, "==", Equal)
1542 CYInfix_(false, 9, "!=", NotEqual)
1543 CYInfix_(false, 9, "===", Identical)
1544 CYInfix_(false, 9, "!==", NotIdentical)
1545 CYInfix_(false, 10, "&", BitwiseAnd)
1546 CYInfix_(false, 11, "^", BitwiseXOr)
1547 CYInfix_(false, 12, "|", BitwiseOr)
1548 CYInfix_(false, 13, "&&", LogicalAnd)
1549 CYInfix_(false, 14, "||", LogicalOr)
1551 CYAssignment_("=", )
1552 CYAssignment_("*=", Multiply)
1553 CYAssignment_("/=", Divide)
1554 CYAssignment_("%=", Modulus)
1555 CYAssignment_("+=", Add)
1556 CYAssignment_("-=", Subtract)
1557 CYAssignment_("<<=", ShiftLeft)
1558 CYAssignment_(">>=", ShiftRightSigned)
1559 CYAssignment_(">>>=", ShiftRightUnsigned)
1560 CYAssignment_("&=", BitwiseAnd)
1561 CYAssignment_("^=", BitwiseXOr)
1562 CYAssignment_("|=", BitwiseOr)
1564 #endif/*CYPARSER_HPP*/