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;
363 CYIdentifierUsageVector rename_;
365 CYContext(apr_pool_t *pool, CYOptions &options) :
372 virtual ~CYContext() {
375 template <typename Type_>
376 void Replace(Type_ *&value) {
377 for (;;) if (value == NULL)
380 Type_ *replace(value->Replace(*this));
381 if (replace != value)
392 CYStatement *statements_;
394 CYBlock(CYStatement *statements) :
395 statements_(statements)
399 operator CYStatement *() const {
403 void AddPrev(CYStatement *statement) {
404 CYStatement *last(statement);
405 while (last->next_ != NULL)
407 last->SetNext(statements_);
408 statements_ = statement;
411 virtual CYStatement *Replace(CYContext &context);
413 virtual void Output(CYOutput &out) const;
414 virtual void Output(CYOutput &out, CYFlags flags) const;
442 std::string filename_;
446 cy::location location_;
447 std::string message_;
450 typedef std::vector<Error> Errors;
457 void ScannerDestroy();
460 CYDriver(const std::string &filename);
463 Condition GetCondition();
464 void SetCondition(Condition condition);
466 void PushCondition(Condition condition);
469 void Warning(const cy::location &location, const char *message);
472 struct CYForInitialiser {
473 virtual ~CYForInitialiser() {
476 virtual void For(CYOutput &out) const = 0;
477 virtual CYExpression *Replace(CYContext &context) = 0;
480 struct CYForInInitialiser {
481 virtual ~CYForInInitialiser() {
484 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
485 virtual const char *ForEachIn() const = 0;
486 virtual CYExpression *ForEachIn(CYContext &out) = 0;
487 virtual CYExpression *Replace(CYContext &context) = 0;
493 struct CYExpression :
494 CYNext<CYExpression>,
500 virtual unsigned Precedence() const = 0;
502 virtual bool RightHand() const {
506 virtual void For(CYOutput &out) const;
507 virtual void ForIn(CYOutput &out, CYFlags flags) const;
509 virtual const char *ForEachIn() const;
510 virtual CYExpression *ForEachIn(CYContext &out);
512 virtual void Output(CYOutput &out) const;
513 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
514 void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
516 virtual CYExpression *ClassName(CYContext &context, bool object);
517 virtual void ClassName(CYOutput &out, bool object) const;
519 CYExpression *ReplaceAll(CYContext &context);
521 virtual CYExpression *Replace(CYContext &context) = 0;
523 virtual CYExpression *Primitive(CYContext &context) {
527 virtual CYNumber *Number(CYContext &context) {
531 virtual CYString *String(CYContext &context) {
535 virtual const char *Word() const {
540 #define CYAlphabetic(value) \
541 virtual bool Alphabetic() const { \
545 #define CYPrecedence(value) \
546 virtual unsigned Precedence() const { \
550 #define CYRightHand(value) \
551 virtual bool RightHand() const { \
558 CYExpression *expressions_;
560 CYCompound(CYExpression *expressions = NULL) :
561 expressions_(expressions)
565 void AddPrev(CYExpression *expression) {
566 CYExpression *last(expression);
567 while (last->next_ != NULL)
569 last->SetNext(expressions_);
570 expressions_ = expression;
575 virtual CYExpression *Replace(CYContext &context);
576 void Output(CYOutput &out, CYFlags flags) const;
579 struct CYFunctionParameter :
580 CYNext<CYFunctionParameter>,
585 CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next = NULL) :
586 CYNext<CYFunctionParameter>(next),
591 void Replace(CYContext &context);
592 virtual void Output(CYOutput &out) const;
595 struct CYComprehension :
596 CYNext<CYComprehension>,
599 virtual const char *Name() const = 0;
601 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
602 CYFunctionParameter *Parameters(CYContext &context) const;
603 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
604 virtual void Output(CYOutput &out) const = 0;
607 struct CYForInComprehension :
613 CYForInComprehension(CYIdentifier *name, CYExpression *set) :
619 virtual const char *Name() const {
620 return name_->Word();
623 virtual CYFunctionParameter *Parameter(CYContext &context) const;
624 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
625 virtual void Output(CYOutput &out) const;
628 struct CYForEachInComprehension :
634 CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
640 virtual const char *Name() const {
641 return name_->Word();
644 virtual CYFunctionParameter *Parameter(CYContext &context) const;
645 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
646 virtual void Output(CYOutput &out) const;
649 struct CYIfComprehension :
654 CYIfComprehension(CYExpression *test) :
659 virtual const char *Name() const {
663 virtual CYFunctionParameter *Parameter(CYContext &context) const;
664 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
665 virtual void Output(CYOutput &out) const;
668 struct CYArrayComprehension :
671 CYExpression *expression_;
672 CYComprehension *comprehensions_;
674 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
675 expression_(expression),
676 comprehensions_(comprehensions)
682 virtual CYExpression *Replace(CYContext &context);
683 virtual void Output(CYOutput &out, CYFlags flags) const;
696 virtual CYExpression *Replace(CYContext &context);
710 CYRange(uint64_t lo, uint64_t hi) :
715 bool operator [](uint8_t value) const {
716 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
719 void operator()(uint8_t value) {
722 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
726 extern CYRange DigitRange_;
727 extern CYRange WordStartRange_;
728 extern CYRange WordEndRange_;
743 CYString(const char *value) :
749 CYString(const char *value, size_t size) :
755 CYString(const CYWord *word) :
756 value_(word->Word()),
757 size_(strlen(value_))
761 const char *Value() const {
765 virtual const char *Word() const;
767 virtual CYNumber *Number(CYContext &context);
768 virtual CYString *String(CYContext &context);
770 CYString *Concat(CYContext &out, CYString *rhs) const;
771 virtual void Output(CYOutput &out, CYFlags flags) const;
772 virtual void PropertyName(CYOutput &out) const;
781 CYNumber(double value) :
786 double Value() const {
790 virtual CYNumber *Number(CYContext &context);
791 virtual CYString *String(CYContext &context);
793 virtual void Output(CYOutput &out, CYFlags flags) const;
794 virtual void PropertyName(CYOutput &out) const;
802 CYRegEx(const char *value) :
807 const char *Value() const {
811 virtual void Output(CYOutput &out, CYFlags flags) const;
823 virtual CYNumber *Number(CYContext &context);
824 virtual CYString *String(CYContext &context);
826 virtual void Output(CYOutput &out, CYFlags flags) const;
838 virtual CYExpression *Replace(CYContext &context);
839 virtual void Output(CYOutput &out, CYFlags flags) const;
845 virtual bool Value() const = 0;
846 virtual void Output(CYOutput &out, CYFlags flags) const;
858 virtual bool Value() const {
862 virtual CYNumber *Number(CYContext &context);
863 virtual CYString *String(CYContext &context);
875 virtual bool Value() const {
879 virtual CYNumber *Number(CYContext &context);
880 virtual CYString *String(CYContext &context);
888 CYVariable(CYIdentifier *name) :
896 virtual CYExpression *Replace(CYContext &context);
897 virtual void Output(CYOutput &out, CYFlags flags) const;
905 CYPrefix(CYExpression *rhs) :
910 virtual bool Alphabetic() const = 0;
911 virtual const char *Operator() const = 0;
915 virtual CYExpression *Replace(CYContext &context);
916 virtual void Output(CYOutput &out, CYFlags flags) const;
925 CYInfix(CYExpression *lhs, CYExpression *rhs) :
931 void SetLeft(CYExpression *lhs) {
935 virtual bool Alphabetic() const = 0;
936 virtual const char *Operator() const = 0;
938 virtual CYExpression *Replace(CYContext &context);
939 virtual void Output(CYOutput &out, CYFlags flags) const;
947 CYPostfix(CYExpression *lhs) :
952 virtual const char *Operator() const = 0;
956 virtual CYExpression *Replace(CYContext &context);
957 virtual void Output(CYOutput &out, CYFlags flags) const;
960 struct CYAssignment :
966 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
972 void SetLeft(CYExpression *lhs) {
976 virtual const char *Operator() const = 0;
980 virtual CYExpression *Replace(CYContext &context);
981 virtual void Output(CYOutput &out, CYFlags flags) const;
989 CYExpression *value_;
991 CYArgument(CYExpression *value, CYArgument *next = NULL) :
992 CYNext<CYArgument>(next),
998 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
999 CYNext<CYArgument>(next),
1005 void Replace(CYContext &context);
1006 void Output(CYOutput &out) const;
1022 CYExpression *case_;
1023 CYStatement *statements_;
1025 CYClause(CYExpression *_case, CYStatement *statements) :
1027 statements_(statements)
1031 void Replace(CYContext &context);
1032 virtual void Output(CYOutput &out) const;
1039 CYExpression *value_;
1041 CYElement(CYExpression *value, CYElement *next) :
1042 CYNext<CYElement>(next),
1047 void Replace(CYContext &context);
1048 void Output(CYOutput &out) const;
1054 CYElement *elements_;
1056 CYArray(CYElement *elements = NULL) :
1061 virtual CYExpression *Replace(CYContext &context);
1062 virtual void Output(CYOutput &out, CYFlags flags) const;
1069 CYPropertyName *name_;
1070 CYExpression *value_;
1072 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1073 CYNext<CYProperty>(next),
1079 void Replace(CYContext &context);
1080 virtual void Output(CYOutput &out) const;
1083 struct CYDeclaration :
1086 CYIdentifier *identifier_;
1087 CYExpression *initialiser_;
1089 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
1090 identifier_(identifier),
1091 initialiser_(initialiser)
1095 virtual void ForIn(CYOutput &out, CYFlags flags) const;
1097 virtual const char *ForEachIn() const;
1098 virtual CYExpression *ForEachIn(CYContext &out);
1100 virtual CYExpression *Replace(CYContext &context);
1101 virtual CYAssignment *Assignment(CYContext &context);
1103 virtual void Output(CYOutput &out, CYFlags flags) const;
1106 struct CYDeclarations :
1107 CYNext<CYDeclarations>,
1111 CYDeclaration *declaration_;
1113 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1114 CYNext<CYDeclarations>(next),
1115 declaration_(declaration)
1119 virtual void For(CYOutput &out) const;
1121 virtual CYCompound *Replace(CYContext &context);
1122 CYProperty *Property(CYContext &context);
1124 virtual void Output(CYOutput &out) const;
1125 virtual void Output(CYOutput &out, CYFlags flags) const;
1131 CYDeclarations *declarations_;
1133 CYVar(CYDeclarations *declarations) :
1134 declarations_(declarations)
1138 virtual CYStatement *Replace(CYContext &context);
1139 virtual void Output(CYOutput &out, CYFlags flags) const;
1145 CYDeclarations *declarations_;
1148 CYLet(CYDeclarations *declarations, CYStatement *statements) :
1149 declarations_(declarations),
1154 virtual CYStatement *Replace(CYContext &context);
1155 virtual void Output(CYOutput &out, CYFlags flags) const;
1161 CYForInitialiser *initialiser_;
1162 CYExpression *test_;
1163 CYExpression *increment_;
1166 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1167 initialiser_(initialiser),
1169 increment_(increment),
1174 virtual CYStatement *Replace(CYContext &context);
1175 virtual void Output(CYOutput &out, CYFlags flags) const;
1181 CYForInInitialiser *initialiser_;
1185 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1186 initialiser_(initialiser),
1192 virtual CYStatement *Replace(CYContext &context);
1193 virtual void Output(CYOutput &out, CYFlags flags) const;
1196 struct CYForEachIn :
1199 CYForInInitialiser *initialiser_;
1203 CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1204 initialiser_(initialiser),
1210 virtual CYStatement *Replace(CYContext &context);
1211 virtual void Output(CYOutput &out, CYFlags flags) const;
1217 CYProperty *properties_;
1219 CYObject(CYProperty *properties) :
1220 properties_(properties)
1224 virtual CYExpression *Replace(CYContext &context);
1225 void Output(CYOutput &out, CYFlags flags) const;
1231 CYExpression *object_;
1232 CYExpression *property_;
1234 CYMember(CYExpression *object, CYExpression *property) :
1240 void SetLeft(CYExpression *object) {
1244 void Replace_(CYContext &context);
1247 struct CYDirectMember :
1250 CYDirectMember(CYExpression *object, CYExpression *property) :
1251 CYMember(object, property)
1258 virtual CYExpression *Replace(CYContext &context);
1259 virtual void Output(CYOutput &out, CYFlags flags) const;
1262 struct CYIndirectMember :
1265 CYIndirectMember(CYExpression *object, CYExpression *property) :
1266 CYMember(object, property)
1273 virtual CYExpression *Replace(CYContext &context);
1274 virtual void Output(CYOutput &out, CYFlags flags) const;
1280 CYExpression *constructor_;
1281 CYArgument *arguments_;
1283 CYNew(CYExpression *constructor, CYArgument *arguments) :
1284 constructor_(constructor),
1285 arguments_(arguments)
1289 virtual unsigned Precedence() const {
1290 return arguments_ == NULL ? 2 : 1;
1295 virtual CYExpression *Replace(CYContext &context);
1296 virtual void Output(CYOutput &out, CYFlags flags) const;
1302 CYExpression *function_;
1303 CYArgument *arguments_;
1305 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1306 function_(function),
1307 arguments_(arguments)
1314 virtual CYExpression *Replace(CYContext &context);
1315 virtual void Output(CYOutput &out, CYFlags flags) const;
1321 CYExpression *test_;
1323 CYStatement *false_;
1325 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1332 virtual CYStatement *Replace(CYContext &context);
1333 virtual void Output(CYOutput &out, CYFlags flags) const;
1339 CYExpression *test_;
1342 CYDoWhile(CYExpression *test, CYStatement *code) :
1348 virtual CYStatement *Replace(CYContext &context);
1349 virtual void Output(CYOutput &out, CYFlags flags) const;
1355 CYExpression *test_;
1358 CYWhile(CYExpression *test, CYStatement *code) :
1364 virtual CYStatement *Replace(CYContext &context);
1365 virtual void Output(CYOutput &out, CYFlags flags) const;
1369 CYIdentifier *name_;
1370 CYFunctionParameter *parameters_;
1373 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1375 parameters_(parameters),
1380 virtual ~CYFunction() {
1383 void Inject(CYContext &context);
1384 virtual void Replace_(CYContext &context, bool outer);
1385 virtual void Output(CYOutput &out, CYFlags flags) const;
1388 struct CYFunctionExpression :
1392 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1393 CYFunction(name, parameters, statements)
1400 virtual CYExpression *Replace(CYContext &context);
1401 virtual void Output(CYOutput &out, CYFlags flags) const;
1404 struct CYFunctionStatement :
1408 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1409 CYFunction(name, parameters, statements)
1413 virtual CYStatement *Replace(CYContext &context);
1414 virtual void Output(CYOutput &out, CYFlags flags) const;
1420 CYExpression *expression_;
1422 CYExpress(CYExpression *expression) :
1423 expression_(expression)
1425 if (expression == NULL)
1429 virtual CYStatement *Collapse(CYContext &context);
1430 virtual CYStatement *Replace(CYContext &context);
1431 virtual void Output(CYOutput &out, CYFlags flags) const;
1437 CYIdentifier *label_;
1439 CYContinue(CYIdentifier *label) :
1444 virtual CYStatement *Replace(CYContext &context);
1445 virtual void Output(CYOutput &out, CYFlags flags) const;
1451 CYIdentifier *label_;
1453 CYBreak(CYIdentifier *label) :
1458 virtual CYStatement *Replace(CYContext &context);
1459 virtual void Output(CYOutput &out, CYFlags flags) const;
1465 CYExpression *value_;
1467 CYReturn(CYExpression *value) :
1472 virtual CYStatement *Replace(CYContext &context);
1473 virtual void Output(CYOutput &out, CYFlags flags) const;
1479 virtual CYStatement *Collapse(CYContext &context);
1480 virtual CYStatement *Replace(CYContext &context);
1481 virtual void Output(CYOutput &out, CYFlags flags) const;
1489 CYFinally(CYStatement *statements) :
1494 void Replace(CYContext &context);
1495 virtual void Output(CYOutput &out) const;
1504 CYIdentifier *name_;
1507 Catch(CYIdentifier *name, CYStatement *statements) :
1513 void Replace(CYContext &context);
1514 virtual void Output(CYOutput &out) const;
1522 CYFinally *finally_;
1524 Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
1531 virtual CYStatement *Replace(CYContext &context);
1532 virtual void Output(CYOutput &out, CYFlags flags) const;
1538 CYExpression *value_;
1540 Throw(CYExpression *value) :
1545 virtual CYStatement *Replace(CYContext &context);
1546 virtual void Output(CYOutput &out, CYFlags flags) const;
1554 CYExpression *scope_;
1557 CYWith(CYExpression *scope, CYStatement *code) :
1563 virtual CYStatement *Replace(CYContext &context);
1564 virtual void Output(CYOutput &out, CYFlags flags) const;
1570 CYExpression *value_;
1573 CYSwitch(CYExpression *value, CYClause *clauses) :
1579 virtual CYStatement *Replace(CYContext &context);
1580 virtual void Output(CYOutput &out, CYFlags flags) const;
1583 struct CYCondition :
1586 CYExpression *test_;
1587 CYExpression *true_;
1588 CYExpression *false_;
1590 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
1599 virtual CYExpression *Replace(CYContext &context);
1600 virtual void Output(CYOutput &out, CYFlags flags) const;
1603 struct CYAddressOf :
1606 CYAddressOf(CYExpression *rhs) :
1611 virtual const char *Operator() const {
1617 virtual CYExpression *Replace(CYContext &context);
1623 CYIndirect(CYExpression *rhs) :
1628 virtual const char *Operator() const {
1634 virtual CYExpression *Replace(CYContext &context);
1638 virtual CYExpression *Replace(CYContext &context);
1640 #define CYPostfix_(op, name, args...) \
1641 struct CY ## name : \
1644 CY ## name(CYExpression *lhs) : \
1649 virtual const char *Operator() const { \
1654 #define CYPrefix_(alphabetic, op, name, args...) \
1655 struct CY ## name : \
1658 CY ## name(CYExpression *rhs) : \
1663 CYAlphabetic(alphabetic) \
1665 virtual const char *Operator() const { \
1670 #define CYInfix_(alphabetic, precedence, op, name, args...) \
1671 struct CY ## name : \
1674 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
1679 CYAlphabetic(alphabetic) \
1680 CYPrecedence(precedence) \
1682 virtual const char *Operator() const { \
1687 #define CYAssignment_(op, name, args...) \
1688 struct CY ## name ## Assign : \
1691 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
1692 CYAssignment(lhs, rhs) \
1696 virtual const char *Operator() const { \
1701 CYPostfix_("++", PostIncrement)
1702 CYPostfix_("--", PostDecrement)
1704 CYPrefix_(true, "delete", Delete)
1705 CYPrefix_(true, "void", Void)
1706 CYPrefix_(true, "typeof", TypeOf)
1707 CYPrefix_(false, "++", PreIncrement)
1708 CYPrefix_(false, "--", PreDecrement)
1709 CYPrefix_(false, "+", Affirm)
1710 CYPrefix_(false, "-", Negate)
1711 CYPrefix_(false, "~", BitwiseNot)
1712 CYPrefix_(false, "!", LogicalNot)
1714 CYInfix_(false, 5, "*", Multiply)
1715 CYInfix_(false, 5, "/", Divide)
1716 CYInfix_(false, 5, "%", Modulus)
1717 CYInfix_(false, 6, "+", Add, CYReplace)
1718 CYInfix_(false, 6, "-", Subtract)
1719 CYInfix_(false, 7, "<<", ShiftLeft)
1720 CYInfix_(false, 7, ">>", ShiftRightSigned)
1721 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
1722 CYInfix_(false, 8, "<", Less)
1723 CYInfix_(false, 8, ">", Greater)
1724 CYInfix_(false, 8, "<=", LessOrEqual)
1725 CYInfix_(false, 8, ">=", GreaterOrEqual)
1726 CYInfix_(true, 8, "instanceof", InstanceOf)
1727 CYInfix_(true, 8, "in", In)
1728 CYInfix_(false, 9, "==", Equal)
1729 CYInfix_(false, 9, "!=", NotEqual)
1730 CYInfix_(false, 9, "===", Identical)
1731 CYInfix_(false, 9, "!==", NotIdentical)
1732 CYInfix_(false, 10, "&", BitwiseAnd)
1733 CYInfix_(false, 11, "^", BitwiseXOr)
1734 CYInfix_(false, 12, "|", BitwiseOr)
1735 CYInfix_(false, 13, "&&", LogicalAnd)
1736 CYInfix_(false, 14, "||", LogicalOr)
1738 CYAssignment_("=", )
1739 CYAssignment_("*=", Multiply)
1740 CYAssignment_("/=", Divide)
1741 CYAssignment_("%=", Modulus)
1742 CYAssignment_("+=", Add)
1743 CYAssignment_("-=", Subtract)
1744 CYAssignment_("<<=", ShiftLeft)
1745 CYAssignment_(">>=", ShiftRightSigned)
1746 CYAssignment_(">>>=", ShiftRightUnsigned)
1747 CYAssignment_("&=", BitwiseAnd)
1748 CYAssignment_("^=", BitwiseXOr)
1749 CYAssignment_("|=", BitwiseOr)
1751 #endif/*CYPARSER_HPP*/