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?!
55 #include "location.hh"
56 #include "Pooling.hpp"
57 #include "Options.hpp"
61 template <typename Type_>
75 void SetNext(Type_ *next) {
84 virtual void Output(struct CYOutput &out) const = 0;
102 CYOutput(std::ostream &out, CYOptions &options) :
112 void Check(char value);
115 CYOutput &operator <<(char rhs);
116 CYOutput &operator <<(const char *rhs);
118 _finline CYOutput &operator <<(const CYThing *rhs) {
124 _finline CYOutput &operator <<(const CYThing &rhs) {
130 struct CYPropertyName {
131 virtual void PropertyName(CYOutput &out) const = 0;
133 virtual ~CYPropertyName() {
147 CYNoBrace = (1 << 0),
148 CYNoFunction = (1 << 1),
151 CYNoRightHand = (1 << 4),
152 CYNoDangle = (1 << 5),
153 CYNoInteger = (1 << 6),
154 CYNoBF = (CYNoBrace | CYNoFunction),
160 virtual ~CYStatement() {
163 void Single(CYOutput &out, CYFlags flags) const;
164 void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
166 CYStatement *ReplaceAll(CYContext &context);
167 virtual CYStatement *Collapse(CYContext &context);
169 virtual CYStatement *Replace(CYContext &context) = 0;
172 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
175 struct CYStatements {
185 operator CYStatement *() const {
189 CYStatements &operator ->*(CYStatement *next) {
191 if (first_ == NULL) {
194 } else for (;; last_ = last_->next_)
195 if (last_->next_ == NULL) {
205 virtual ~CYClassName() {
208 virtual CYExpression *ClassName(CYContext &context, bool object) = 0;
209 virtual void ClassName(CYOutput &out, bool object) const = 0;
219 CYWord(const char *word) :
224 void Set(const char *value) {
228 virtual const char *Word() const;
229 virtual void Output(CYOutput &out) const;
231 virtual CYExpression *ClassName(CYContext &context, bool object);
232 virtual void ClassName(CYOutput &out, bool object) const;
233 virtual void PropertyName(CYOutput &out) const;
236 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
238 return lhs << rhs.Word();
241 struct CYIdentifier :
242 CYNext<CYIdentifier>,
245 CYIdentifier *replace_;
248 CYIdentifier(const char *word) :
255 virtual const char *Word() const;
256 CYIdentifier *Replace(CYContext &context);
264 CYComment(const char *value) :
269 virtual CYStatement *Replace(CYContext &context);
270 virtual void Output(CYOutput &out, CYFlags flags) const;
277 CYStatement *statement_;
279 CYLabel(CYIdentifier *name, CYStatement *statement) :
281 statement_(statement)
285 virtual CYStatement *Replace(CYContext &context);
286 virtual void Output(CYOutput &out, CYFlags flags) const;
289 struct CYCStringLess :
290 std::binary_function<const char *, const char *, bool>
292 _finline bool operator ()(const char *lhs, const char *rhs) const {
293 return strcmp(lhs, rhs) < 0;
297 struct CYIdentifierValueLess :
298 std::binary_function<CYIdentifier *, CYIdentifier *, bool>
300 _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
301 return CYCStringLess()(lhs->Word(), rhs->Word());
305 enum CYIdentifierFlags {
306 CYIdentifierArgument,
307 CYIdentifierVariable,
312 typedef std::set<const char *, CYCStringLess> CYCStringSet;
313 typedef std::set<CYIdentifier *, CYIdentifierValueLess> CYIdentifierValueSet;
314 typedef std::vector<CYIdentifier *> CYIdentifierAddressVector;
315 typedef std::map<CYIdentifier *, CYIdentifierFlags> CYIdentifierAddressFlagsMap;
319 CYIdentifierAddressFlagsMap internal_;
321 CYIdentifierValueSet identifiers_;
328 void Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags);
329 virtual CYIdentifier *Lookup(CYContext &context, CYIdentifier *identifier);
330 void Merge(CYContext &context, CYIdentifier *identifier);
331 void Scope(CYContext &context, CYStatement *&statements);
338 CYStatement *statements_;
339 CYIdentifierAddressVector rename_;
341 CYProgram(CYStatement *statements) :
342 statements_(statements)
346 virtual void Replace(CYContext &context);
347 virtual void Output(CYOutput &out) const;
358 CYContext(apr_pool_t *pool, CYOptions &options) :
366 template <typename Type_>
367 void Replace(Type_ *&value) {
368 for (;;) if (value == NULL)
371 Type_ *replace(value->Replace(*this));
372 if (replace != value)
383 CYStatement *statements_;
386 CYBlock(CYStatement *statements, CYScope *scope = NULL) :
387 statements_(statements),
392 operator CYStatement *() const {
396 void AddPrev(CYStatement *statement) {
397 CYStatement *last(statement);
398 while (last->next_ != NULL)
400 last->SetNext(statements_);
401 statements_ = statement;
404 virtual CYStatement *Replace(CYContext &context);
406 virtual void Output(CYOutput &out) const;
407 virtual void Output(CYOutput &out, CYFlags flags) const;
435 std::string filename_;
439 cy::location location_;
440 std::string message_;
443 typedef std::vector<Error> Errors;
450 void ScannerDestroy();
453 CYDriver(const std::string &filename);
456 Condition GetCondition();
457 void SetCondition(Condition condition);
459 void PushCondition(Condition condition);
462 void Warning(const cy::location &location, const char *message);
465 struct CYForInitialiser {
466 virtual ~CYForInitialiser() {
469 virtual void For(CYOutput &out) const = 0;
470 virtual CYExpression *Replace(CYContext &context) = 0;
473 struct CYForInInitialiser {
474 virtual ~CYForInInitialiser() {
477 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
478 virtual const char *ForEachIn() const = 0;
479 virtual CYExpression *ForEachIn(CYContext &out) = 0;
480 virtual CYExpression *Replace(CYContext &context) = 0;
486 struct CYExpression :
487 CYNext<CYExpression>,
493 virtual unsigned Precedence() const = 0;
495 virtual bool RightHand() const {
499 virtual void For(CYOutput &out) const;
500 virtual void ForIn(CYOutput &out, CYFlags flags) const;
502 virtual const char *ForEachIn() const;
503 virtual CYExpression *ForEachIn(CYContext &out);
505 virtual void Output(CYOutput &out) const;
506 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
507 void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
509 virtual CYExpression *ClassName(CYContext &context, bool object);
510 virtual void ClassName(CYOutput &out, bool object) const;
512 CYExpression *ReplaceAll(CYContext &context);
514 virtual CYExpression *Replace(CYContext &context) = 0;
516 virtual CYExpression *Primitive(CYContext &context) {
520 virtual CYNumber *Number(CYContext &context) {
524 virtual CYString *String(CYContext &context) {
528 virtual const char *Word() const {
533 #define CYAlphabetic(value) \
534 virtual bool Alphabetic() const { \
538 #define CYPrecedence(value) \
539 virtual unsigned Precedence() const { \
543 #define CYRightHand(value) \
544 virtual bool RightHand() const { \
551 CYExpression *expressions_;
553 CYCompound(CYExpression *expressions = NULL) :
554 expressions_(expressions)
558 void AddPrev(CYExpression *expression) {
559 CYExpression *last(expression);
560 while (last->next_ != NULL)
562 last->SetNext(expressions_);
563 expressions_ = expression;
568 virtual CYExpression *Replace(CYContext &context);
569 void Output(CYOutput &out, CYFlags flags) const;
572 struct CYFunctionParameter :
573 CYNext<CYFunctionParameter>,
578 CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next = NULL) :
579 CYNext<CYFunctionParameter>(next),
584 void Replace(CYContext &context);
585 virtual void Output(CYOutput &out) const;
588 struct CYComprehension :
589 CYNext<CYComprehension>,
592 virtual const char *Name() const = 0;
594 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
595 CYFunctionParameter *Parameters(CYContext &context) const;
596 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
597 virtual void Output(CYOutput &out) const = 0;
600 struct CYForInComprehension :
606 CYForInComprehension(CYIdentifier *name, CYExpression *set) :
612 virtual const char *Name() const {
613 return name_->Word();
616 virtual CYFunctionParameter *Parameter(CYContext &context) const;
617 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
618 virtual void Output(CYOutput &out) const;
621 struct CYForEachInComprehension :
627 CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
633 virtual const char *Name() const {
634 return name_->Word();
637 virtual CYFunctionParameter *Parameter(CYContext &context) const;
638 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
639 virtual void Output(CYOutput &out) const;
642 struct CYIfComprehension :
647 CYIfComprehension(CYExpression *test) :
652 virtual const char *Name() const {
656 virtual CYFunctionParameter *Parameter(CYContext &context) const;
657 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
658 virtual void Output(CYOutput &out) const;
661 struct CYArrayComprehension :
664 CYExpression *expression_;
665 CYComprehension *comprehensions_;
667 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
668 expression_(expression),
669 comprehensions_(comprehensions)
675 virtual CYExpression *Replace(CYContext &context);
676 virtual void Output(CYOutput &out, CYFlags flags) const;
689 virtual CYExpression *Replace(CYContext &context);
703 CYRange(uint64_t lo, uint64_t hi) :
708 bool operator [](uint8_t value) const {
709 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
712 void operator()(uint8_t value) {
715 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
719 extern CYRange DigitRange_;
720 extern CYRange WordStartRange_;
721 extern CYRange WordEndRange_;
736 CYString(const char *value) :
742 CYString(const char *value, size_t size) :
748 CYString(const CYWord *word) :
749 value_(word->Word()),
750 size_(strlen(value_))
754 const char *Value() const {
758 virtual const char *Word() const;
760 virtual CYNumber *Number(CYContext &context);
761 virtual CYString *String(CYContext &context);
763 CYString *Concat(CYContext &out, CYString *rhs) const;
764 virtual void Output(CYOutput &out, CYFlags flags) const;
765 virtual void PropertyName(CYOutput &out) const;
774 CYNumber(double value) :
779 double Value() const {
783 virtual CYNumber *Number(CYContext &context);
784 virtual CYString *String(CYContext &context);
786 virtual void Output(CYOutput &out, CYFlags flags) const;
787 virtual void PropertyName(CYOutput &out) const;
795 CYRegEx(const char *value) :
800 const char *Value() const {
804 virtual void Output(CYOutput &out, CYFlags flags) const;
816 virtual CYNumber *Number(CYContext &context);
817 virtual CYString *String(CYContext &context);
819 virtual void Output(CYOutput &out, CYFlags flags) const;
831 virtual CYExpression *Replace(CYContext &context);
832 virtual void Output(CYOutput &out, CYFlags flags) const;
838 virtual bool Value() const = 0;
839 virtual void Output(CYOutput &out, CYFlags flags) const;
851 virtual bool Value() const {
855 virtual CYNumber *Number(CYContext &context);
856 virtual CYString *String(CYContext &context);
868 virtual bool Value() const {
872 virtual CYNumber *Number(CYContext &context);
873 virtual CYString *String(CYContext &context);
881 CYVariable(CYIdentifier *name) :
889 virtual CYExpression *Replace(CYContext &context);
890 virtual void Output(CYOutput &out, CYFlags flags) const;
898 CYPrefix(CYExpression *rhs) :
903 virtual bool Alphabetic() const = 0;
904 virtual const char *Operator() const = 0;
908 virtual CYExpression *Replace(CYContext &context);
909 virtual void Output(CYOutput &out, CYFlags flags) const;
918 CYInfix(CYExpression *lhs, CYExpression *rhs) :
924 void SetLeft(CYExpression *lhs) {
928 virtual bool Alphabetic() const = 0;
929 virtual const char *Operator() const = 0;
931 virtual CYExpression *Replace(CYContext &context);
932 virtual void Output(CYOutput &out, CYFlags flags) const;
940 CYPostfix(CYExpression *lhs) :
945 virtual const char *Operator() const = 0;
949 virtual CYExpression *Replace(CYContext &context);
950 virtual void Output(CYOutput &out, CYFlags flags) const;
953 struct CYAssignment :
959 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
965 void SetLeft(CYExpression *lhs) {
969 virtual const char *Operator() const = 0;
973 virtual CYExpression *Replace(CYContext &context);
974 virtual void Output(CYOutput &out, CYFlags flags) const;
982 CYExpression *value_;
984 CYArgument(CYExpression *value, CYArgument *next = NULL) :
985 CYNext<CYArgument>(next),
991 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
992 CYNext<CYArgument>(next),
998 void Replace(CYContext &context);
999 void Output(CYOutput &out) const;
1015 CYExpression *case_;
1016 CYStatement *statements_;
1018 CYClause(CYExpression *_case, CYStatement *statements) :
1020 statements_(statements)
1024 void Replace(CYContext &context);
1025 virtual void Output(CYOutput &out) const;
1032 CYExpression *value_;
1034 CYElement(CYExpression *value, CYElement *next) :
1035 CYNext<CYElement>(next),
1040 void Replace(CYContext &context);
1041 void Output(CYOutput &out) const;
1047 CYElement *elements_;
1049 CYArray(CYElement *elements = NULL) :
1054 virtual CYExpression *Replace(CYContext &context);
1055 virtual void Output(CYOutput &out, CYFlags flags) const;
1062 CYPropertyName *name_;
1063 CYExpression *value_;
1065 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1066 CYNext<CYProperty>(next),
1072 void Replace(CYContext &context);
1073 virtual void Output(CYOutput &out) const;
1076 struct CYDeclaration :
1079 CYIdentifier *identifier_;
1080 CYExpression *initialiser_;
1082 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
1083 identifier_(identifier),
1084 initialiser_(initialiser)
1088 virtual void ForIn(CYOutput &out, CYFlags flags) const;
1090 virtual const char *ForEachIn() const;
1091 virtual CYExpression *ForEachIn(CYContext &out);
1093 virtual CYExpression *Replace(CYContext &context);
1094 virtual CYAssignment *Assignment(CYContext &context);
1096 virtual void Output(CYOutput &out, CYFlags flags) const;
1099 struct CYDeclarations :
1100 CYNext<CYDeclarations>,
1104 CYDeclaration *declaration_;
1106 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1107 CYNext<CYDeclarations>(next),
1108 declaration_(declaration)
1112 virtual void For(CYOutput &out) const;
1114 virtual CYCompound *Replace(CYContext &context);
1115 CYProperty *Property(CYContext &context);
1117 virtual void Output(CYOutput &out) const;
1118 virtual void Output(CYOutput &out, CYFlags flags) const;
1124 CYDeclarations *declarations_;
1126 CYVar(CYDeclarations *declarations) :
1127 declarations_(declarations)
1131 virtual CYStatement *Replace(CYContext &context);
1132 virtual void Output(CYOutput &out, CYFlags flags) const;
1138 CYDeclarations *declarations_;
1141 CYLet(CYDeclarations *declarations, CYStatement *statements) :
1142 declarations_(declarations),
1147 virtual CYStatement *Replace(CYContext &context);
1148 virtual void Output(CYOutput &out, CYFlags flags) const;
1154 CYForInitialiser *initialiser_;
1155 CYExpression *test_;
1156 CYExpression *increment_;
1159 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1160 initialiser_(initialiser),
1162 increment_(increment),
1167 virtual CYStatement *Replace(CYContext &context);
1168 virtual void Output(CYOutput &out, CYFlags flags) const;
1174 CYForInInitialiser *initialiser_;
1178 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1179 initialiser_(initialiser),
1185 virtual CYStatement *Replace(CYContext &context);
1186 virtual void Output(CYOutput &out, CYFlags flags) const;
1189 struct CYForEachIn :
1192 CYForInInitialiser *initialiser_;
1196 CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1197 initialiser_(initialiser),
1203 virtual CYStatement *Replace(CYContext &context);
1204 virtual void Output(CYOutput &out, CYFlags flags) const;
1210 CYProperty *properties_;
1212 CYObject(CYProperty *properties) :
1213 properties_(properties)
1217 virtual CYExpression *Replace(CYContext &context);
1218 void Output(CYOutput &out, CYFlags flags) const;
1224 CYExpression *object_;
1225 CYExpression *property_;
1227 CYMember(CYExpression *object, CYExpression *property) :
1233 void SetLeft(CYExpression *object) {
1237 void Replace_(CYContext &context);
1240 struct CYDirectMember :
1243 CYDirectMember(CYExpression *object, CYExpression *property) :
1244 CYMember(object, property)
1251 virtual CYExpression *Replace(CYContext &context);
1252 virtual void Output(CYOutput &out, CYFlags flags) const;
1255 struct CYIndirectMember :
1258 CYIndirectMember(CYExpression *object, CYExpression *property) :
1259 CYMember(object, property)
1266 virtual CYExpression *Replace(CYContext &context);
1267 virtual void Output(CYOutput &out, CYFlags flags) const;
1273 CYExpression *constructor_;
1274 CYArgument *arguments_;
1276 CYNew(CYExpression *constructor, CYArgument *arguments) :
1277 constructor_(constructor),
1278 arguments_(arguments)
1282 virtual unsigned Precedence() const {
1283 return arguments_ == NULL ? 2 : 1;
1288 virtual CYExpression *Replace(CYContext &context);
1289 virtual void Output(CYOutput &out, CYFlags flags) const;
1295 CYExpression *function_;
1296 CYArgument *arguments_;
1298 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1299 function_(function),
1300 arguments_(arguments)
1307 virtual CYExpression *Replace(CYContext &context);
1308 virtual void Output(CYOutput &out, CYFlags flags) const;
1314 CYExpression *test_;
1316 CYStatement *false_;
1318 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1325 virtual CYStatement *Replace(CYContext &context);
1326 virtual void Output(CYOutput &out, CYFlags flags) const;
1332 CYExpression *test_;
1335 CYDoWhile(CYExpression *test, CYStatement *code) :
1341 virtual CYStatement *Replace(CYContext &context);
1342 virtual void Output(CYOutput &out, CYFlags flags) const;
1348 CYExpression *test_;
1351 CYWhile(CYExpression *test, CYStatement *code) :
1357 virtual CYStatement *Replace(CYContext &context);
1358 virtual void Output(CYOutput &out, CYFlags flags) const;
1364 CYIdentifier *name_;
1365 CYFunctionParameter *parameters_;
1368 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1370 parameters_(parameters),
1371 code_(statements, this)
1375 virtual ~CYFunction() {
1378 void Inject(CYContext &context);
1379 virtual void Replace_(CYContext &context, bool outer);
1380 virtual void Output(CYOutput &out, CYFlags flags) const;
1383 struct CYFunctionExpression :
1387 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1388 CYFunction(name, parameters, statements)
1395 virtual CYExpression *Replace(CYContext &context);
1396 virtual void Output(CYOutput &out, CYFlags flags) const;
1399 struct CYFunctionStatement :
1403 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1404 CYFunction(name, parameters, statements)
1408 virtual CYStatement *Replace(CYContext &context);
1409 virtual void Output(CYOutput &out, CYFlags flags) const;
1415 CYExpression *expression_;
1417 CYExpress(CYExpression *expression) :
1418 expression_(expression)
1420 if (expression == NULL)
1424 virtual CYStatement *Collapse(CYContext &context);
1425 virtual CYStatement *Replace(CYContext &context);
1426 virtual void Output(CYOutput &out, CYFlags flags) const;
1432 CYIdentifier *label_;
1434 CYContinue(CYIdentifier *label) :
1439 virtual CYStatement *Replace(CYContext &context);
1440 virtual void Output(CYOutput &out, CYFlags flags) const;
1446 CYIdentifier *label_;
1448 CYBreak(CYIdentifier *label) :
1453 virtual CYStatement *Replace(CYContext &context);
1454 virtual void Output(CYOutput &out, CYFlags flags) const;
1460 CYExpression *value_;
1462 CYReturn(CYExpression *value) :
1467 virtual CYStatement *Replace(CYContext &context);
1468 virtual void Output(CYOutput &out, CYFlags flags) const;
1474 virtual CYStatement *Collapse(CYContext &context);
1475 virtual CYStatement *Replace(CYContext &context);
1476 virtual void Output(CYOutput &out, CYFlags flags) const;
1484 CYFinally(CYStatement *statements) :
1489 void Replace(CYContext &context);
1490 virtual void Output(CYOutput &out) const;
1499 CYIdentifier *name_;
1502 Catch(CYIdentifier *name, CYStatement *statements) :
1508 void Replace(CYContext &context);
1509 virtual void Output(CYOutput &out) const;
1517 CYFinally *finally_;
1519 Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
1526 virtual CYStatement *Replace(CYContext &context);
1527 virtual void Output(CYOutput &out, CYFlags flags) const;
1533 CYExpression *value_;
1535 Throw(CYExpression *value) :
1540 virtual CYStatement *Replace(CYContext &context);
1541 virtual void Output(CYOutput &out, CYFlags flags) const;
1549 CYExpression *scope_;
1552 CYWith(CYExpression *scope, CYStatement *code) :
1558 virtual CYStatement *Replace(CYContext &context);
1559 virtual void Output(CYOutput &out, CYFlags flags) const;
1565 CYExpression *value_;
1568 CYSwitch(CYExpression *value, CYClause *clauses) :
1574 virtual CYStatement *Replace(CYContext &context);
1575 virtual void Output(CYOutput &out, CYFlags flags) const;
1578 struct CYCondition :
1581 CYExpression *test_;
1582 CYExpression *true_;
1583 CYExpression *false_;
1585 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
1594 virtual CYExpression *Replace(CYContext &context);
1595 virtual void Output(CYOutput &out, CYFlags flags) const;
1598 struct CYAddressOf :
1601 CYAddressOf(CYExpression *rhs) :
1606 virtual const char *Operator() const {
1612 virtual CYExpression *Replace(CYContext &context);
1618 CYIndirect(CYExpression *rhs) :
1623 virtual const char *Operator() const {
1629 virtual CYExpression *Replace(CYContext &context);
1633 virtual CYExpression *Replace(CYContext &context);
1635 #define CYPostfix_(op, name, args...) \
1636 struct CY ## name : \
1639 CY ## name(CYExpression *lhs) : \
1644 virtual const char *Operator() const { \
1649 #define CYPrefix_(alphabetic, op, name, args...) \
1650 struct CY ## name : \
1653 CY ## name(CYExpression *rhs) : \
1658 CYAlphabetic(alphabetic) \
1660 virtual const char *Operator() const { \
1665 #define CYInfix_(alphabetic, precedence, op, name, args...) \
1666 struct CY ## name : \
1669 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
1674 CYAlphabetic(alphabetic) \
1675 CYPrecedence(precedence) \
1677 virtual const char *Operator() const { \
1682 #define CYAssignment_(op, name, args...) \
1683 struct CY ## name ## Assign : \
1686 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
1687 CYAssignment(lhs, rhs) \
1691 virtual const char *Operator() const { \
1696 CYPostfix_("++", PostIncrement)
1697 CYPostfix_("--", PostDecrement)
1699 CYPrefix_(true, "delete", Delete)
1700 CYPrefix_(true, "void", Void)
1701 CYPrefix_(true, "typeof", TypeOf)
1702 CYPrefix_(false, "++", PreIncrement)
1703 CYPrefix_(false, "--", PreDecrement)
1704 CYPrefix_(false, "+", Affirm)
1705 CYPrefix_(false, "-", Negate)
1706 CYPrefix_(false, "~", BitwiseNot)
1707 CYPrefix_(false, "!", LogicalNot)
1709 CYInfix_(false, 5, "*", Multiply)
1710 CYInfix_(false, 5, "/", Divide)
1711 CYInfix_(false, 5, "%", Modulus)
1712 CYInfix_(false, 6, "+", Add, CYReplace)
1713 CYInfix_(false, 6, "-", Subtract)
1714 CYInfix_(false, 7, "<<", ShiftLeft)
1715 CYInfix_(false, 7, ">>", ShiftRightSigned)
1716 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
1717 CYInfix_(false, 8, "<", Less)
1718 CYInfix_(false, 8, ">", Greater)
1719 CYInfix_(false, 8, "<=", LessOrEqual)
1720 CYInfix_(false, 8, ">=", GreaterOrEqual)
1721 CYInfix_(true, 8, "instanceof", InstanceOf)
1722 CYInfix_(true, 8, "in", In)
1723 CYInfix_(false, 9, "==", Equal)
1724 CYInfix_(false, 9, "!=", NotEqual)
1725 CYInfix_(false, 9, "===", Identical)
1726 CYInfix_(false, 9, "!==", NotIdentical)
1727 CYInfix_(false, 10, "&", BitwiseAnd)
1728 CYInfix_(false, 11, "^", BitwiseXOr)
1729 CYInfix_(false, 12, "|", BitwiseOr)
1730 CYInfix_(false, 13, "&&", LogicalAnd)
1731 CYInfix_(false, 14, "||", LogicalOr)
1733 CYAssignment_("=", )
1734 CYAssignment_("*=", Multiply)
1735 CYAssignment_("/=", Divide)
1736 CYAssignment_("%=", Modulus)
1737 CYAssignment_("+=", Add)
1738 CYAssignment_("-=", Subtract)
1739 CYAssignment_("<<=", ShiftLeft)
1740 CYAssignment_(">>=", ShiftRightSigned)
1741 CYAssignment_(">>>=", ShiftRightUnsigned)
1742 CYAssignment_("&=", BitwiseAnd)
1743 CYAssignment_("^=", BitwiseXOr)
1744 CYAssignment_("|=", BitwiseOr)
1746 #endif/*CYPARSER_HPP*/