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;
327 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);
349 CYStatement *statements_;
350 CYIdentifierUsageVector rename_;
352 CYProgram(CYStatement *statements) :
353 statements_(statements)
357 virtual void Replace(CYContext &context);
358 virtual void Output(CYOutput &out) const;
369 CYContext(apr_pool_t *pool, CYOptions &options) :
377 virtual ~CYContext() {
380 template <typename Type_>
381 void Replace(Type_ *&value) {
382 for (;;) if (value == NULL)
385 Type_ *replace(value->Replace(*this));
386 if (replace != value)
397 CYStatement *statements_;
400 CYBlock(CYStatement *statements, CYScope *scope = NULL) :
401 statements_(statements),
406 operator CYStatement *() const {
410 void AddPrev(CYStatement *statement) {
411 CYStatement *last(statement);
412 while (last->next_ != NULL)
414 last->SetNext(statements_);
415 statements_ = statement;
418 virtual CYStatement *Replace(CYContext &context);
420 virtual void Output(CYOutput &out) const;
421 virtual void Output(CYOutput &out, CYFlags flags) const;
449 std::string filename_;
453 cy::location location_;
454 std::string message_;
457 typedef std::vector<Error> Errors;
464 void ScannerDestroy();
467 CYDriver(const std::string &filename);
470 Condition GetCondition();
471 void SetCondition(Condition condition);
473 void PushCondition(Condition condition);
476 void Warning(const cy::location &location, const char *message);
479 struct CYForInitialiser {
480 virtual ~CYForInitialiser() {
483 virtual void For(CYOutput &out) const = 0;
484 virtual CYExpression *Replace(CYContext &context) = 0;
487 struct CYForInInitialiser {
488 virtual ~CYForInInitialiser() {
491 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
492 virtual const char *ForEachIn() const = 0;
493 virtual CYExpression *ForEachIn(CYContext &out) = 0;
494 virtual CYExpression *Replace(CYContext &context) = 0;
500 struct CYExpression :
501 CYNext<CYExpression>,
507 virtual unsigned Precedence() const = 0;
509 virtual bool RightHand() const {
513 virtual void For(CYOutput &out) const;
514 virtual void ForIn(CYOutput &out, CYFlags flags) const;
516 virtual const char *ForEachIn() const;
517 virtual CYExpression *ForEachIn(CYContext &out);
519 virtual void Output(CYOutput &out) const;
520 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
521 void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
523 virtual CYExpression *ClassName(CYContext &context, bool object);
524 virtual void ClassName(CYOutput &out, bool object) const;
526 CYExpression *ReplaceAll(CYContext &context);
528 virtual CYExpression *Replace(CYContext &context) = 0;
530 virtual CYExpression *Primitive(CYContext &context) {
534 virtual CYNumber *Number(CYContext &context) {
538 virtual CYString *String(CYContext &context) {
542 virtual const char *Word() const {
547 #define CYAlphabetic(value) \
548 virtual bool Alphabetic() const { \
552 #define CYPrecedence(value) \
553 virtual unsigned Precedence() const { \
557 #define CYRightHand(value) \
558 virtual bool RightHand() const { \
565 CYExpression *expressions_;
567 CYCompound(CYExpression *expressions = NULL) :
568 expressions_(expressions)
572 void AddPrev(CYExpression *expression) {
573 CYExpression *last(expression);
574 while (last->next_ != NULL)
576 last->SetNext(expressions_);
577 expressions_ = expression;
582 virtual CYExpression *Replace(CYContext &context);
583 void Output(CYOutput &out, CYFlags flags) const;
586 struct CYFunctionParameter :
587 CYNext<CYFunctionParameter>,
592 CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next = NULL) :
593 CYNext<CYFunctionParameter>(next),
598 void Replace(CYContext &context);
599 virtual void Output(CYOutput &out) const;
602 struct CYComprehension :
603 CYNext<CYComprehension>,
606 virtual const char *Name() const = 0;
608 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
609 CYFunctionParameter *Parameters(CYContext &context) const;
610 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
611 virtual void Output(CYOutput &out) const = 0;
614 struct CYForInComprehension :
620 CYForInComprehension(CYIdentifier *name, CYExpression *set) :
626 virtual const char *Name() const {
627 return name_->Word();
630 virtual CYFunctionParameter *Parameter(CYContext &context) const;
631 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
632 virtual void Output(CYOutput &out) const;
635 struct CYForEachInComprehension :
641 CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
647 virtual const char *Name() const {
648 return name_->Word();
651 virtual CYFunctionParameter *Parameter(CYContext &context) const;
652 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
653 virtual void Output(CYOutput &out) const;
656 struct CYIfComprehension :
661 CYIfComprehension(CYExpression *test) :
666 virtual const char *Name() const {
670 virtual CYFunctionParameter *Parameter(CYContext &context) const;
671 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
672 virtual void Output(CYOutput &out) const;
675 struct CYArrayComprehension :
678 CYExpression *expression_;
679 CYComprehension *comprehensions_;
681 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
682 expression_(expression),
683 comprehensions_(comprehensions)
689 virtual CYExpression *Replace(CYContext &context);
690 virtual void Output(CYOutput &out, CYFlags flags) const;
703 virtual CYExpression *Replace(CYContext &context);
717 CYRange(uint64_t lo, uint64_t hi) :
722 bool operator [](uint8_t value) const {
723 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
726 void operator()(uint8_t value) {
729 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
733 extern CYRange DigitRange_;
734 extern CYRange WordStartRange_;
735 extern CYRange WordEndRange_;
750 CYString(const char *value) :
756 CYString(const char *value, size_t size) :
762 CYString(const CYWord *word) :
763 value_(word->Word()),
764 size_(strlen(value_))
768 const char *Value() const {
772 virtual const char *Word() const;
774 virtual CYNumber *Number(CYContext &context);
775 virtual CYString *String(CYContext &context);
777 CYString *Concat(CYContext &out, CYString *rhs) const;
778 virtual void Output(CYOutput &out, CYFlags flags) const;
779 virtual void PropertyName(CYOutput &out) const;
788 CYNumber(double value) :
793 double Value() const {
797 virtual CYNumber *Number(CYContext &context);
798 virtual CYString *String(CYContext &context);
800 virtual void Output(CYOutput &out, CYFlags flags) const;
801 virtual void PropertyName(CYOutput &out) const;
809 CYRegEx(const char *value) :
814 const char *Value() const {
818 virtual void Output(CYOutput &out, CYFlags flags) const;
830 virtual CYNumber *Number(CYContext &context);
831 virtual CYString *String(CYContext &context);
833 virtual void Output(CYOutput &out, CYFlags flags) const;
845 virtual CYExpression *Replace(CYContext &context);
846 virtual void Output(CYOutput &out, CYFlags flags) const;
852 virtual bool Value() const = 0;
853 virtual void Output(CYOutput &out, CYFlags flags) const;
865 virtual bool Value() const {
869 virtual CYNumber *Number(CYContext &context);
870 virtual CYString *String(CYContext &context);
882 virtual bool Value() const {
886 virtual CYNumber *Number(CYContext &context);
887 virtual CYString *String(CYContext &context);
895 CYVariable(CYIdentifier *name) :
903 virtual CYExpression *Replace(CYContext &context);
904 virtual void Output(CYOutput &out, CYFlags flags) const;
912 CYPrefix(CYExpression *rhs) :
917 virtual bool Alphabetic() const = 0;
918 virtual const char *Operator() const = 0;
922 virtual CYExpression *Replace(CYContext &context);
923 virtual void Output(CYOutput &out, CYFlags flags) const;
932 CYInfix(CYExpression *lhs, CYExpression *rhs) :
938 void SetLeft(CYExpression *lhs) {
942 virtual bool Alphabetic() const = 0;
943 virtual const char *Operator() const = 0;
945 virtual CYExpression *Replace(CYContext &context);
946 virtual void Output(CYOutput &out, CYFlags flags) const;
954 CYPostfix(CYExpression *lhs) :
959 virtual const char *Operator() const = 0;
963 virtual CYExpression *Replace(CYContext &context);
964 virtual void Output(CYOutput &out, CYFlags flags) const;
967 struct CYAssignment :
973 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
979 void SetLeft(CYExpression *lhs) {
983 virtual const char *Operator() const = 0;
987 virtual CYExpression *Replace(CYContext &context);
988 virtual void Output(CYOutput &out, CYFlags flags) const;
996 CYExpression *value_;
998 CYArgument(CYExpression *value, CYArgument *next = NULL) :
999 CYNext<CYArgument>(next),
1005 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
1006 CYNext<CYArgument>(next),
1012 void Replace(CYContext &context);
1013 void Output(CYOutput &out) const;
1029 CYExpression *case_;
1030 CYStatement *statements_;
1032 CYClause(CYExpression *_case, CYStatement *statements) :
1034 statements_(statements)
1038 void Replace(CYContext &context);
1039 virtual void Output(CYOutput &out) const;
1046 CYExpression *value_;
1048 CYElement(CYExpression *value, CYElement *next) :
1049 CYNext<CYElement>(next),
1054 void Replace(CYContext &context);
1055 void Output(CYOutput &out) const;
1061 CYElement *elements_;
1063 CYArray(CYElement *elements = NULL) :
1068 virtual CYExpression *Replace(CYContext &context);
1069 virtual void Output(CYOutput &out, CYFlags flags) const;
1076 CYPropertyName *name_;
1077 CYExpression *value_;
1079 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1080 CYNext<CYProperty>(next),
1086 void Replace(CYContext &context);
1087 virtual void Output(CYOutput &out) const;
1090 struct CYDeclaration :
1093 CYIdentifier *identifier_;
1094 CYExpression *initialiser_;
1096 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
1097 identifier_(identifier),
1098 initialiser_(initialiser)
1102 virtual void ForIn(CYOutput &out, CYFlags flags) const;
1104 virtual const char *ForEachIn() const;
1105 virtual CYExpression *ForEachIn(CYContext &out);
1107 virtual CYExpression *Replace(CYContext &context);
1108 virtual CYAssignment *Assignment(CYContext &context);
1110 virtual void Output(CYOutput &out, CYFlags flags) const;
1113 struct CYDeclarations :
1114 CYNext<CYDeclarations>,
1118 CYDeclaration *declaration_;
1120 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1121 CYNext<CYDeclarations>(next),
1122 declaration_(declaration)
1126 virtual void For(CYOutput &out) const;
1128 virtual CYCompound *Replace(CYContext &context);
1129 CYProperty *Property(CYContext &context);
1131 virtual void Output(CYOutput &out) const;
1132 virtual void Output(CYOutput &out, CYFlags flags) const;
1138 CYDeclarations *declarations_;
1140 CYVar(CYDeclarations *declarations) :
1141 declarations_(declarations)
1145 virtual CYStatement *Replace(CYContext &context);
1146 virtual void Output(CYOutput &out, CYFlags flags) const;
1152 CYDeclarations *declarations_;
1155 CYLet(CYDeclarations *declarations, CYStatement *statements) :
1156 declarations_(declarations),
1161 virtual CYStatement *Replace(CYContext &context);
1162 virtual void Output(CYOutput &out, CYFlags flags) const;
1168 CYForInitialiser *initialiser_;
1169 CYExpression *test_;
1170 CYExpression *increment_;
1173 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1174 initialiser_(initialiser),
1176 increment_(increment),
1181 virtual CYStatement *Replace(CYContext &context);
1182 virtual void Output(CYOutput &out, CYFlags flags) const;
1188 CYForInInitialiser *initialiser_;
1192 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1193 initialiser_(initialiser),
1199 virtual CYStatement *Replace(CYContext &context);
1200 virtual void Output(CYOutput &out, CYFlags flags) const;
1203 struct CYForEachIn :
1206 CYForInInitialiser *initialiser_;
1210 CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1211 initialiser_(initialiser),
1217 virtual CYStatement *Replace(CYContext &context);
1218 virtual void Output(CYOutput &out, CYFlags flags) const;
1224 CYProperty *properties_;
1226 CYObject(CYProperty *properties) :
1227 properties_(properties)
1231 virtual CYExpression *Replace(CYContext &context);
1232 void Output(CYOutput &out, CYFlags flags) const;
1238 CYExpression *object_;
1239 CYExpression *property_;
1241 CYMember(CYExpression *object, CYExpression *property) :
1247 void SetLeft(CYExpression *object) {
1251 void Replace_(CYContext &context);
1254 struct CYDirectMember :
1257 CYDirectMember(CYExpression *object, CYExpression *property) :
1258 CYMember(object, property)
1265 virtual CYExpression *Replace(CYContext &context);
1266 virtual void Output(CYOutput &out, CYFlags flags) const;
1269 struct CYIndirectMember :
1272 CYIndirectMember(CYExpression *object, CYExpression *property) :
1273 CYMember(object, property)
1280 virtual CYExpression *Replace(CYContext &context);
1281 virtual void Output(CYOutput &out, CYFlags flags) const;
1287 CYExpression *constructor_;
1288 CYArgument *arguments_;
1290 CYNew(CYExpression *constructor, CYArgument *arguments) :
1291 constructor_(constructor),
1292 arguments_(arguments)
1296 virtual unsigned Precedence() const {
1297 return arguments_ == NULL ? 2 : 1;
1302 virtual CYExpression *Replace(CYContext &context);
1303 virtual void Output(CYOutput &out, CYFlags flags) const;
1309 CYExpression *function_;
1310 CYArgument *arguments_;
1312 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1313 function_(function),
1314 arguments_(arguments)
1321 virtual CYExpression *Replace(CYContext &context);
1322 virtual void Output(CYOutput &out, CYFlags flags) const;
1328 CYExpression *test_;
1330 CYStatement *false_;
1332 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1339 virtual CYStatement *Replace(CYContext &context);
1340 virtual void Output(CYOutput &out, CYFlags flags) const;
1346 CYExpression *test_;
1349 CYDoWhile(CYExpression *test, CYStatement *code) :
1355 virtual CYStatement *Replace(CYContext &context);
1356 virtual void Output(CYOutput &out, CYFlags flags) const;
1362 CYExpression *test_;
1365 CYWhile(CYExpression *test, CYStatement *code) :
1371 virtual CYStatement *Replace(CYContext &context);
1372 virtual void Output(CYOutput &out, CYFlags flags) const;
1378 CYIdentifier *name_;
1379 CYFunctionParameter *parameters_;
1382 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1384 parameters_(parameters),
1385 code_(statements, this)
1389 virtual ~CYFunction() {
1392 void Inject(CYContext &context);
1393 virtual void Replace_(CYContext &context, bool outer);
1394 virtual void Output(CYOutput &out, CYFlags flags) const;
1397 struct CYFunctionExpression :
1401 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1402 CYFunction(name, parameters, statements)
1409 virtual CYExpression *Replace(CYContext &context);
1410 virtual void Output(CYOutput &out, CYFlags flags) const;
1413 struct CYFunctionStatement :
1417 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1418 CYFunction(name, parameters, statements)
1422 virtual CYStatement *Replace(CYContext &context);
1423 virtual void Output(CYOutput &out, CYFlags flags) const;
1429 CYExpression *expression_;
1431 CYExpress(CYExpression *expression) :
1432 expression_(expression)
1434 if (expression == NULL)
1438 virtual CYStatement *Collapse(CYContext &context);
1439 virtual CYStatement *Replace(CYContext &context);
1440 virtual void Output(CYOutput &out, CYFlags flags) const;
1446 CYIdentifier *label_;
1448 CYContinue(CYIdentifier *label) :
1453 virtual CYStatement *Replace(CYContext &context);
1454 virtual void Output(CYOutput &out, CYFlags flags) const;
1460 CYIdentifier *label_;
1462 CYBreak(CYIdentifier *label) :
1467 virtual CYStatement *Replace(CYContext &context);
1468 virtual void Output(CYOutput &out, CYFlags flags) const;
1474 CYExpression *value_;
1476 CYReturn(CYExpression *value) :
1481 virtual CYStatement *Replace(CYContext &context);
1482 virtual void Output(CYOutput &out, CYFlags flags) const;
1488 virtual CYStatement *Collapse(CYContext &context);
1489 virtual CYStatement *Replace(CYContext &context);
1490 virtual void Output(CYOutput &out, CYFlags flags) const;
1498 CYFinally(CYStatement *statements) :
1503 void Replace(CYContext &context);
1504 virtual void Output(CYOutput &out) const;
1513 CYIdentifier *name_;
1516 Catch(CYIdentifier *name, CYStatement *statements) :
1522 void Replace(CYContext &context);
1523 virtual void Output(CYOutput &out) const;
1531 CYFinally *finally_;
1533 Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
1540 virtual CYStatement *Replace(CYContext &context);
1541 virtual void Output(CYOutput &out, CYFlags flags) const;
1547 CYExpression *value_;
1549 Throw(CYExpression *value) :
1554 virtual CYStatement *Replace(CYContext &context);
1555 virtual void Output(CYOutput &out, CYFlags flags) const;
1563 CYExpression *scope_;
1566 CYWith(CYExpression *scope, CYStatement *code) :
1572 virtual CYStatement *Replace(CYContext &context);
1573 virtual void Output(CYOutput &out, CYFlags flags) const;
1579 CYExpression *value_;
1582 CYSwitch(CYExpression *value, CYClause *clauses) :
1588 virtual CYStatement *Replace(CYContext &context);
1589 virtual void Output(CYOutput &out, CYFlags flags) const;
1592 struct CYCondition :
1595 CYExpression *test_;
1596 CYExpression *true_;
1597 CYExpression *false_;
1599 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
1608 virtual CYExpression *Replace(CYContext &context);
1609 virtual void Output(CYOutput &out, CYFlags flags) const;
1612 struct CYAddressOf :
1615 CYAddressOf(CYExpression *rhs) :
1620 virtual const char *Operator() const {
1626 virtual CYExpression *Replace(CYContext &context);
1632 CYIndirect(CYExpression *rhs) :
1637 virtual const char *Operator() const {
1643 virtual CYExpression *Replace(CYContext &context);
1647 virtual CYExpression *Replace(CYContext &context);
1649 #define CYPostfix_(op, name, args...) \
1650 struct CY ## name : \
1653 CY ## name(CYExpression *lhs) : \
1658 virtual const char *Operator() const { \
1663 #define CYPrefix_(alphabetic, op, name, args...) \
1664 struct CY ## name : \
1667 CY ## name(CYExpression *rhs) : \
1672 CYAlphabetic(alphabetic) \
1674 virtual const char *Operator() const { \
1679 #define CYInfix_(alphabetic, precedence, op, name, args...) \
1680 struct CY ## name : \
1683 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
1688 CYAlphabetic(alphabetic) \
1689 CYPrecedence(precedence) \
1691 virtual const char *Operator() const { \
1696 #define CYAssignment_(op, name, args...) \
1697 struct CY ## name ## Assign : \
1700 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
1701 CYAssignment(lhs, rhs) \
1705 virtual const char *Operator() const { \
1710 CYPostfix_("++", PostIncrement)
1711 CYPostfix_("--", PostDecrement)
1713 CYPrefix_(true, "delete", Delete)
1714 CYPrefix_(true, "void", Void)
1715 CYPrefix_(true, "typeof", TypeOf)
1716 CYPrefix_(false, "++", PreIncrement)
1717 CYPrefix_(false, "--", PreDecrement)
1718 CYPrefix_(false, "+", Affirm)
1719 CYPrefix_(false, "-", Negate)
1720 CYPrefix_(false, "~", BitwiseNot)
1721 CYPrefix_(false, "!", LogicalNot)
1723 CYInfix_(false, 5, "*", Multiply)
1724 CYInfix_(false, 5, "/", Divide)
1725 CYInfix_(false, 5, "%", Modulus)
1726 CYInfix_(false, 6, "+", Add, CYReplace)
1727 CYInfix_(false, 6, "-", Subtract)
1728 CYInfix_(false, 7, "<<", ShiftLeft)
1729 CYInfix_(false, 7, ">>", ShiftRightSigned)
1730 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
1731 CYInfix_(false, 8, "<", Less)
1732 CYInfix_(false, 8, ">", Greater)
1733 CYInfix_(false, 8, "<=", LessOrEqual)
1734 CYInfix_(false, 8, ">=", GreaterOrEqual)
1735 CYInfix_(true, 8, "instanceof", InstanceOf)
1736 CYInfix_(true, 8, "in", In)
1737 CYInfix_(false, 9, "==", Equal)
1738 CYInfix_(false, 9, "!=", NotEqual)
1739 CYInfix_(false, 9, "===", Identical)
1740 CYInfix_(false, 9, "!==", NotIdentical)
1741 CYInfix_(false, 10, "&", BitwiseAnd)
1742 CYInfix_(false, 11, "^", BitwiseXOr)
1743 CYInfix_(false, 12, "|", BitwiseOr)
1744 CYInfix_(false, 13, "&&", LogicalAnd)
1745 CYInfix_(false, 14, "||", LogicalOr)
1747 CYAssignment_("=", )
1748 CYAssignment_("*=", Multiply)
1749 CYAssignment_("/=", Divide)
1750 CYAssignment_("%=", Modulus)
1751 CYAssignment_("+=", Add)
1752 CYAssignment_("-=", Subtract)
1753 CYAssignment_("<<=", ShiftLeft)
1754 CYAssignment_(">>=", ShiftRightSigned)
1755 CYAssignment_(">>>=", ShiftRightUnsigned)
1756 CYAssignment_("&=", BitwiseAnd)
1757 CYAssignment_("^=", BitwiseXOr)
1758 CYAssignment_("|=", BitwiseOr)
1760 #endif/*CYPARSER_HPP*/