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_;
249 CYIdentifier(const char *word) :
257 virtual const char *Word() const;
258 CYIdentifier *Replace(CYContext &context);
266 CYComment(const char *value) :
271 virtual CYStatement *Replace(CYContext &context);
272 virtual void Output(CYOutput &out, CYFlags flags) const;
279 CYStatement *statement_;
281 CYLabel(CYIdentifier *name, CYStatement *statement) :
283 statement_(statement)
287 virtual CYStatement *Replace(CYContext &context);
288 virtual void Output(CYOutput &out, CYFlags flags) const;
291 struct CYCStringLess :
292 std::binary_function<const char *, const char *, bool>
294 _finline bool operator ()(const char *lhs, const char *rhs) const {
295 return strcmp(lhs, rhs) < 0;
299 struct CYIdentifierValueLess :
300 std::binary_function<CYIdentifier *, CYIdentifier *, bool>
302 _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
303 return CYCStringLess()(lhs->Word(), rhs->Word());
307 enum CYIdentifierFlags {
308 CYIdentifierArgument,
309 CYIdentifierVariable,
314 typedef std::set<const char *, CYCStringLess> CYCStringSet;
315 typedef std::set<CYIdentifier *, CYIdentifierValueLess> CYIdentifierValueSet;
316 typedef std::map<CYIdentifier *, CYIdentifierFlags> CYIdentifierAddressFlagsMap;
318 struct CYIdentifierUsage {
319 CYIdentifier *identifier_;
323 typedef std::vector<CYIdentifierUsage> CYIdentifierUsageVector;
328 CYIdentifierAddressFlagsMap internal_;
329 CYIdentifierValueSet identifiers_;
339 void Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags);
340 virtual CYIdentifier *Lookup(CYContext &context, CYIdentifier *identifier);
341 void Merge(CYContext &context, CYIdentifier *identifier);
342 void Scope(CYContext &context, CYStatement *&statements);
348 CYStatement *statements_;
350 CYProgram(CYStatement *statements) :
351 statements_(statements)
355 virtual void Replace(CYContext &context);
356 virtual void Output(CYOutput &out) const;
365 CYIdentifierUsageVector rename_;
367 CYContext(apr_pool_t *pool, CYOptions &options) :
374 virtual ~CYContext() {
377 template <typename Type_>
378 void Replace(Type_ *&value) {
379 for (;;) if (value == NULL)
382 Type_ *replace(value->Replace(*this));
383 if (replace != value)
394 CYStatement *statements_;
396 CYBlock(CYStatement *statements) :
397 statements_(statements)
401 operator CYStatement *() const {
405 void AddPrev(CYStatement *statement) {
406 CYStatement *last(statement);
407 while (last->next_ != NULL)
409 last->SetNext(statements_);
410 statements_ = statement;
413 virtual CYStatement *Replace(CYContext &context);
415 virtual void Output(CYOutput &out) const;
416 virtual void Output(CYOutput &out, CYFlags flags) const;
444 std::string filename_;
448 cy::location location_;
449 std::string message_;
452 typedef std::vector<Error> Errors;
459 void ScannerDestroy();
462 CYDriver(const std::string &filename);
465 Condition GetCondition();
466 void SetCondition(Condition condition);
468 void PushCondition(Condition condition);
471 void Warning(const cy::location &location, const char *message);
474 struct CYForInitialiser {
475 virtual ~CYForInitialiser() {
478 virtual void For(CYOutput &out) const = 0;
479 virtual CYExpression *Replace(CYContext &context) = 0;
482 struct CYForInInitialiser {
483 virtual ~CYForInInitialiser() {
486 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
487 virtual const char *ForEachIn() const = 0;
488 virtual CYExpression *ForEachIn(CYContext &out) = 0;
489 virtual CYExpression *Replace(CYContext &context) = 0;
495 struct CYExpression :
496 CYNext<CYExpression>,
502 virtual unsigned Precedence() const = 0;
504 virtual bool RightHand() const {
508 virtual void For(CYOutput &out) const;
509 virtual void ForIn(CYOutput &out, CYFlags flags) const;
511 virtual const char *ForEachIn() const;
512 virtual CYExpression *ForEachIn(CYContext &out);
514 virtual void Output(CYOutput &out) const;
515 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
516 void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
518 virtual CYExpression *ClassName(CYContext &context, bool object);
519 virtual void ClassName(CYOutput &out, bool object) const;
521 CYExpression *ReplaceAll(CYContext &context);
523 virtual CYExpression *Replace(CYContext &context) = 0;
525 virtual CYExpression *Primitive(CYContext &context) {
529 virtual CYNumber *Number(CYContext &context) {
533 virtual CYString *String(CYContext &context) {
537 virtual const char *Word() const {
542 #define CYAlphabetic(value) \
543 virtual bool Alphabetic() const { \
547 #define CYPrecedence(value) \
548 virtual unsigned Precedence() const { \
552 #define CYRightHand(value) \
553 virtual bool RightHand() const { \
560 CYExpression *expressions_;
562 CYCompound(CYExpression *expressions = NULL) :
563 expressions_(expressions)
567 void AddPrev(CYExpression *expression) {
568 CYExpression *last(expression);
569 while (last->next_ != NULL)
571 last->SetNext(expressions_);
572 expressions_ = expression;
577 virtual CYExpression *Replace(CYContext &context);
578 void Output(CYOutput &out, CYFlags flags) const;
581 struct CYFunctionParameter :
582 CYNext<CYFunctionParameter>,
587 CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next = NULL) :
588 CYNext<CYFunctionParameter>(next),
593 void Replace(CYContext &context);
594 virtual void Output(CYOutput &out) const;
597 struct CYComprehension :
598 CYNext<CYComprehension>,
601 virtual const char *Name() const = 0;
603 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
604 CYFunctionParameter *Parameters(CYContext &context) const;
605 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
606 virtual void Output(CYOutput &out) const = 0;
609 struct CYForInComprehension :
615 CYForInComprehension(CYIdentifier *name, CYExpression *set) :
621 virtual const char *Name() const {
622 return name_->Word();
625 virtual CYFunctionParameter *Parameter(CYContext &context) const;
626 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
627 virtual void Output(CYOutput &out) const;
630 struct CYForEachInComprehension :
636 CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
642 virtual const char *Name() const {
643 return name_->Word();
646 virtual CYFunctionParameter *Parameter(CYContext &context) const;
647 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
648 virtual void Output(CYOutput &out) const;
651 struct CYIfComprehension :
656 CYIfComprehension(CYExpression *test) :
661 virtual const char *Name() const {
665 virtual CYFunctionParameter *Parameter(CYContext &context) const;
666 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
667 virtual void Output(CYOutput &out) const;
670 struct CYArrayComprehension :
673 CYExpression *expression_;
674 CYComprehension *comprehensions_;
676 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
677 expression_(expression),
678 comprehensions_(comprehensions)
684 virtual CYExpression *Replace(CYContext &context);
685 virtual void Output(CYOutput &out, CYFlags flags) const;
698 virtual CYExpression *Replace(CYContext &context);
712 CYRange(uint64_t lo, uint64_t hi) :
717 bool operator [](uint8_t value) const {
718 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
721 void operator()(uint8_t value) {
724 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
728 extern CYRange DigitRange_;
729 extern CYRange WordStartRange_;
730 extern CYRange WordEndRange_;
745 CYString(const char *value) :
751 CYString(const char *value, size_t size) :
757 CYString(const CYWord *word) :
758 value_(word->Word()),
759 size_(strlen(value_))
763 const char *Value() const {
767 virtual const char *Word() const;
769 virtual CYNumber *Number(CYContext &context);
770 virtual CYString *String(CYContext &context);
772 CYString *Concat(CYContext &out, CYString *rhs) const;
773 virtual void Output(CYOutput &out, CYFlags flags) const;
774 virtual void PropertyName(CYOutput &out) const;
783 CYNumber(double value) :
788 double Value() const {
792 virtual CYNumber *Number(CYContext &context);
793 virtual CYString *String(CYContext &context);
795 virtual void Output(CYOutput &out, CYFlags flags) const;
796 virtual void PropertyName(CYOutput &out) const;
804 CYRegEx(const char *value) :
809 const char *Value() const {
813 virtual void Output(CYOutput &out, CYFlags flags) const;
825 virtual CYNumber *Number(CYContext &context);
826 virtual CYString *String(CYContext &context);
828 virtual void Output(CYOutput &out, CYFlags flags) const;
840 virtual CYExpression *Replace(CYContext &context);
841 virtual void Output(CYOutput &out, CYFlags flags) const;
847 virtual bool Value() const = 0;
848 virtual void Output(CYOutput &out, CYFlags flags) const;
860 virtual bool Value() const {
864 virtual CYNumber *Number(CYContext &context);
865 virtual CYString *String(CYContext &context);
877 virtual bool Value() const {
881 virtual CYNumber *Number(CYContext &context);
882 virtual CYString *String(CYContext &context);
890 CYVariable(CYIdentifier *name) :
898 virtual CYExpression *Replace(CYContext &context);
899 virtual void Output(CYOutput &out, CYFlags flags) const;
907 CYPrefix(CYExpression *rhs) :
912 virtual bool Alphabetic() const = 0;
913 virtual const char *Operator() const = 0;
917 virtual CYExpression *Replace(CYContext &context);
918 virtual void Output(CYOutput &out, CYFlags flags) const;
927 CYInfix(CYExpression *lhs, CYExpression *rhs) :
933 void SetLeft(CYExpression *lhs) {
937 virtual bool Alphabetic() const = 0;
938 virtual const char *Operator() const = 0;
940 virtual CYExpression *Replace(CYContext &context);
941 virtual void Output(CYOutput &out, CYFlags flags) const;
949 CYPostfix(CYExpression *lhs) :
954 virtual const char *Operator() const = 0;
958 virtual CYExpression *Replace(CYContext &context);
959 virtual void Output(CYOutput &out, CYFlags flags) const;
962 struct CYAssignment :
968 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
974 void SetLeft(CYExpression *lhs) {
978 virtual const char *Operator() const = 0;
982 virtual CYExpression *Replace(CYContext &context);
983 virtual void Output(CYOutput &out, CYFlags flags) const;
991 CYExpression *value_;
993 CYArgument(CYExpression *value, CYArgument *next = NULL) :
994 CYNext<CYArgument>(next),
1000 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
1001 CYNext<CYArgument>(next),
1007 void Replace(CYContext &context);
1008 void Output(CYOutput &out) const;
1024 CYExpression *case_;
1025 CYStatement *statements_;
1027 CYClause(CYExpression *_case, CYStatement *statements) :
1029 statements_(statements)
1033 void Replace(CYContext &context);
1034 virtual void Output(CYOutput &out) const;
1041 CYExpression *value_;
1043 CYElement(CYExpression *value, CYElement *next) :
1044 CYNext<CYElement>(next),
1049 void Replace(CYContext &context);
1050 void Output(CYOutput &out) const;
1056 CYElement *elements_;
1058 CYArray(CYElement *elements = NULL) :
1063 virtual CYExpression *Replace(CYContext &context);
1064 virtual void Output(CYOutput &out, CYFlags flags) const;
1071 CYPropertyName *name_;
1072 CYExpression *value_;
1074 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1075 CYNext<CYProperty>(next),
1081 void Replace(CYContext &context);
1082 virtual void Output(CYOutput &out) const;
1085 struct CYDeclaration :
1088 CYIdentifier *identifier_;
1089 CYExpression *initialiser_;
1091 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
1092 identifier_(identifier),
1093 initialiser_(initialiser)
1097 virtual void ForIn(CYOutput &out, CYFlags flags) const;
1099 virtual const char *ForEachIn() const;
1100 virtual CYExpression *ForEachIn(CYContext &out);
1102 virtual CYExpression *Replace(CYContext &context);
1103 virtual CYAssignment *Assignment(CYContext &context);
1105 virtual void Output(CYOutput &out, CYFlags flags) const;
1108 struct CYDeclarations :
1109 CYNext<CYDeclarations>,
1113 CYDeclaration *declaration_;
1115 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1116 CYNext<CYDeclarations>(next),
1117 declaration_(declaration)
1121 virtual void For(CYOutput &out) const;
1123 virtual CYCompound *Replace(CYContext &context);
1124 CYProperty *Property(CYContext &context);
1126 virtual void Output(CYOutput &out) const;
1127 virtual void Output(CYOutput &out, CYFlags flags) const;
1133 CYDeclarations *declarations_;
1135 CYVar(CYDeclarations *declarations) :
1136 declarations_(declarations)
1140 virtual CYStatement *Replace(CYContext &context);
1141 virtual void Output(CYOutput &out, CYFlags flags) const;
1147 CYDeclarations *declarations_;
1150 CYLet(CYDeclarations *declarations, CYStatement *statements) :
1151 declarations_(declarations),
1156 virtual CYStatement *Replace(CYContext &context);
1157 virtual void Output(CYOutput &out, CYFlags flags) const;
1163 CYForInitialiser *initialiser_;
1164 CYExpression *test_;
1165 CYExpression *increment_;
1168 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1169 initialiser_(initialiser),
1171 increment_(increment),
1176 virtual CYStatement *Replace(CYContext &context);
1177 virtual void Output(CYOutput &out, CYFlags flags) const;
1183 CYForInInitialiser *initialiser_;
1187 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1188 initialiser_(initialiser),
1194 virtual CYStatement *Replace(CYContext &context);
1195 virtual void Output(CYOutput &out, CYFlags flags) const;
1198 struct CYForEachIn :
1201 CYForInInitialiser *initialiser_;
1205 CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1206 initialiser_(initialiser),
1212 virtual CYStatement *Replace(CYContext &context);
1213 virtual void Output(CYOutput &out, CYFlags flags) const;
1219 CYProperty *properties_;
1221 CYObject(CYProperty *properties) :
1222 properties_(properties)
1226 virtual CYExpression *Replace(CYContext &context);
1227 void Output(CYOutput &out, CYFlags flags) const;
1233 CYExpression *object_;
1234 CYExpression *property_;
1236 CYMember(CYExpression *object, CYExpression *property) :
1242 void SetLeft(CYExpression *object) {
1246 void Replace_(CYContext &context);
1249 struct CYDirectMember :
1252 CYDirectMember(CYExpression *object, CYExpression *property) :
1253 CYMember(object, property)
1260 virtual CYExpression *Replace(CYContext &context);
1261 virtual void Output(CYOutput &out, CYFlags flags) const;
1264 struct CYIndirectMember :
1267 CYIndirectMember(CYExpression *object, CYExpression *property) :
1268 CYMember(object, property)
1275 virtual CYExpression *Replace(CYContext &context);
1276 virtual void Output(CYOutput &out, CYFlags flags) const;
1282 CYExpression *constructor_;
1283 CYArgument *arguments_;
1285 CYNew(CYExpression *constructor, CYArgument *arguments) :
1286 constructor_(constructor),
1287 arguments_(arguments)
1291 virtual unsigned Precedence() const {
1292 return arguments_ == NULL ? 2 : 1;
1297 virtual CYExpression *Replace(CYContext &context);
1298 virtual void Output(CYOutput &out, CYFlags flags) const;
1304 CYExpression *function_;
1305 CYArgument *arguments_;
1307 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1308 function_(function),
1309 arguments_(arguments)
1316 virtual CYExpression *Replace(CYContext &context);
1317 virtual void Output(CYOutput &out, CYFlags flags) const;
1323 CYExpression *test_;
1325 CYStatement *false_;
1327 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1334 virtual CYStatement *Replace(CYContext &context);
1335 virtual void Output(CYOutput &out, CYFlags flags) const;
1341 CYExpression *test_;
1344 CYDoWhile(CYExpression *test, CYStatement *code) :
1350 virtual CYStatement *Replace(CYContext &context);
1351 virtual void Output(CYOutput &out, CYFlags flags) const;
1357 CYExpression *test_;
1360 CYWhile(CYExpression *test, CYStatement *code) :
1366 virtual CYStatement *Replace(CYContext &context);
1367 virtual void Output(CYOutput &out, CYFlags flags) const;
1371 CYIdentifier *name_;
1372 CYFunctionParameter *parameters_;
1375 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1377 parameters_(parameters),
1382 virtual ~CYFunction() {
1385 void Inject(CYContext &context);
1386 virtual void Replace_(CYContext &context, bool outer);
1387 virtual void Output(CYOutput &out, CYFlags flags) const;
1390 struct CYFunctionExpression :
1394 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1395 CYFunction(name, parameters, statements)
1402 virtual CYExpression *Replace(CYContext &context);
1403 virtual void Output(CYOutput &out, CYFlags flags) const;
1406 struct CYFunctionStatement :
1410 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1411 CYFunction(name, parameters, statements)
1415 virtual CYStatement *Replace(CYContext &context);
1416 virtual void Output(CYOutput &out, CYFlags flags) const;
1422 CYExpression *expression_;
1424 CYExpress(CYExpression *expression) :
1425 expression_(expression)
1427 if (expression == NULL)
1431 virtual CYStatement *Collapse(CYContext &context);
1432 virtual CYStatement *Replace(CYContext &context);
1433 virtual void Output(CYOutput &out, CYFlags flags) const;
1439 CYIdentifier *label_;
1441 CYContinue(CYIdentifier *label) :
1446 virtual CYStatement *Replace(CYContext &context);
1447 virtual void Output(CYOutput &out, CYFlags flags) const;
1453 CYIdentifier *label_;
1455 CYBreak(CYIdentifier *label) :
1460 virtual CYStatement *Replace(CYContext &context);
1461 virtual void Output(CYOutput &out, CYFlags flags) const;
1467 CYExpression *value_;
1469 CYReturn(CYExpression *value) :
1474 virtual CYStatement *Replace(CYContext &context);
1475 virtual void Output(CYOutput &out, CYFlags flags) const;
1481 virtual CYStatement *Collapse(CYContext &context);
1482 virtual CYStatement *Replace(CYContext &context);
1483 virtual void Output(CYOutput &out, CYFlags flags) const;
1491 CYFinally(CYStatement *statements) :
1496 void Replace(CYContext &context);
1497 virtual void Output(CYOutput &out) const;
1506 CYIdentifier *name_;
1509 Catch(CYIdentifier *name, CYStatement *statements) :
1515 void Replace(CYContext &context);
1516 virtual void Output(CYOutput &out) const;
1524 CYFinally *finally_;
1526 Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
1533 virtual CYStatement *Replace(CYContext &context);
1534 virtual void Output(CYOutput &out, CYFlags flags) const;
1540 CYExpression *value_;
1542 Throw(CYExpression *value) :
1547 virtual CYStatement *Replace(CYContext &context);
1548 virtual void Output(CYOutput &out, CYFlags flags) const;
1556 CYExpression *scope_;
1559 CYWith(CYExpression *scope, CYStatement *code) :
1565 virtual CYStatement *Replace(CYContext &context);
1566 virtual void Output(CYOutput &out, CYFlags flags) const;
1572 CYExpression *value_;
1575 CYSwitch(CYExpression *value, CYClause *clauses) :
1581 virtual CYStatement *Replace(CYContext &context);
1582 virtual void Output(CYOutput &out, CYFlags flags) const;
1585 struct CYCondition :
1588 CYExpression *test_;
1589 CYExpression *true_;
1590 CYExpression *false_;
1592 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
1601 virtual CYExpression *Replace(CYContext &context);
1602 virtual void Output(CYOutput &out, CYFlags flags) const;
1605 struct CYAddressOf :
1608 CYAddressOf(CYExpression *rhs) :
1613 virtual const char *Operator() const {
1619 virtual CYExpression *Replace(CYContext &context);
1625 CYIndirect(CYExpression *rhs) :
1630 virtual const char *Operator() const {
1636 virtual CYExpression *Replace(CYContext &context);
1640 virtual CYExpression *Replace(CYContext &context);
1642 #define CYPostfix_(op, name, args...) \
1643 struct CY ## name : \
1646 CY ## name(CYExpression *lhs) : \
1651 virtual const char *Operator() const { \
1656 #define CYPrefix_(alphabetic, op, name, args...) \
1657 struct CY ## name : \
1660 CY ## name(CYExpression *rhs) : \
1665 CYAlphabetic(alphabetic) \
1667 virtual const char *Operator() const { \
1672 #define CYInfix_(alphabetic, precedence, op, name, args...) \
1673 struct CY ## name : \
1676 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
1681 CYAlphabetic(alphabetic) \
1682 CYPrecedence(precedence) \
1684 virtual const char *Operator() const { \
1689 #define CYAssignment_(op, name, args...) \
1690 struct CY ## name ## Assign : \
1693 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
1694 CYAssignment(lhs, rhs) \
1698 virtual const char *Operator() const { \
1703 CYPostfix_("++", PostIncrement)
1704 CYPostfix_("--", PostDecrement)
1706 CYPrefix_(true, "delete", Delete)
1707 CYPrefix_(true, "void", Void)
1708 CYPrefix_(true, "typeof", TypeOf)
1709 CYPrefix_(false, "++", PreIncrement)
1710 CYPrefix_(false, "--", PreDecrement)
1711 CYPrefix_(false, "+", Affirm)
1712 CYPrefix_(false, "-", Negate)
1713 CYPrefix_(false, "~", BitwiseNot)
1714 CYPrefix_(false, "!", LogicalNot)
1716 CYInfix_(false, 5, "*", Multiply)
1717 CYInfix_(false, 5, "/", Divide)
1718 CYInfix_(false, 5, "%", Modulus)
1719 CYInfix_(false, 6, "+", Add, CYReplace)
1720 CYInfix_(false, 6, "-", Subtract)
1721 CYInfix_(false, 7, "<<", ShiftLeft)
1722 CYInfix_(false, 7, ">>", ShiftRightSigned)
1723 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
1724 CYInfix_(false, 8, "<", Less)
1725 CYInfix_(false, 8, ">", Greater)
1726 CYInfix_(false, 8, "<=", LessOrEqual)
1727 CYInfix_(false, 8, ">=", GreaterOrEqual)
1728 CYInfix_(true, 8, "instanceof", InstanceOf)
1729 CYInfix_(true, 8, "in", In)
1730 CYInfix_(false, 9, "==", Equal)
1731 CYInfix_(false, 9, "!=", NotEqual)
1732 CYInfix_(false, 9, "===", Identical)
1733 CYInfix_(false, 9, "!==", NotIdentical)
1734 CYInfix_(false, 10, "&", BitwiseAnd)
1735 CYInfix_(false, 11, "^", BitwiseXOr)
1736 CYInfix_(false, 12, "|", BitwiseOr)
1737 CYInfix_(false, 13, "&&", LogicalAnd)
1738 CYInfix_(false, 14, "||", LogicalOr)
1740 CYAssignment_("=", )
1741 CYAssignment_("*=", Multiply)
1742 CYAssignment_("/=", Divide)
1743 CYAssignment_("%=", Modulus)
1744 CYAssignment_("+=", Add)
1745 CYAssignment_("-=", Subtract)
1746 CYAssignment_("<<=", ShiftLeft)
1747 CYAssignment_(">>=", ShiftRightSigned)
1748 CYAssignment_(">>>=", ShiftRightUnsigned)
1749 CYAssignment_("&=", BitwiseAnd)
1750 CYAssignment_("^=", BitwiseXOr)
1751 CYAssignment_("|=", BitwiseOr)
1753 #endif/*CYPARSER_HPP*/