1 /* Cycript - Optimizing JavaScript Compiler/Runtime
2 * Copyright (C) 2009-2010 Jay Freeman (saurik)
5 /* GNU Lesser General Public License, Version 3 {{{ */
7 * Cycript is free software: you can redistribute it and/or modify it under
8 * the terms of the GNU Lesser General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
12 * Cycript is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 * License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with Cycript. If not, see <http://www.gnu.org/licenses/>.
25 // XXX: wtf is this here?!
38 #include "location.hh"
39 #include "Pooling.hpp"
40 #include "Options.hpp"
44 template <typename Type_>
58 void SetNext(Type_ *next) {
67 virtual void Output(struct CYOutput &out) const = 0;
85 CYOutput(std::ostream &out, CYOptions &options) :
95 void Check(char value);
98 CYOutput &operator <<(char rhs);
99 CYOutput &operator <<(const char *rhs);
101 _finline CYOutput &operator <<(const CYThing *rhs) {
107 _finline CYOutput &operator <<(const CYThing &rhs) {
113 struct CYPropertyName {
114 virtual void PropertyName(CYOutput &out) const = 0;
116 virtual ~CYPropertyName() {
130 CYNoBrace = (1 << 0),
131 CYNoFunction = (1 << 1),
134 CYNoRightHand = (1 << 4),
135 CYNoDangle = (1 << 5),
136 CYNoInteger = (1 << 6),
137 CYNoBF = (CYNoBrace | CYNoFunction),
143 virtual ~CYStatement() {
146 void Single(CYOutput &out, CYFlags flags) const;
147 void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
149 CYStatement *ReplaceAll(CYContext &context);
150 virtual CYStatement *Collapse(CYContext &context);
152 virtual CYStatement *Replace(CYContext &context) = 0;
155 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
158 struct CYStatements {
168 operator CYStatement *() const {
172 CYStatements &operator ->*(CYStatement *next) {
174 if (first_ == NULL) {
177 } else for (;; last_ = last_->next_)
178 if (last_->next_ == NULL) {
188 virtual ~CYClassName() {
191 virtual CYExpression *ClassName(CYContext &context, bool object) = 0;
192 virtual void ClassName(CYOutput &out, bool object) const = 0;
202 CYWord(const char *word) :
207 void Set(const char *value) {
211 virtual const char *Word() const;
212 virtual void Output(CYOutput &out) const;
214 virtual CYExpression *ClassName(CYContext &context, bool object);
215 virtual void ClassName(CYOutput &out, bool object) const;
216 virtual void PropertyName(CYOutput &out) const;
219 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
221 return lhs << rhs.Word();
224 struct CYIdentifier :
225 CYNext<CYIdentifier>,
228 CYIdentifier *replace_;
232 CYIdentifier(const char *word) :
240 virtual const char *Word() const;
241 CYIdentifier *Replace(CYContext &context);
249 CYComment(const char *value) :
254 virtual CYStatement *Replace(CYContext &context);
255 virtual void Output(CYOutput &out, CYFlags flags) const;
262 CYStatement *statement_;
264 CYLabel(CYIdentifier *name, CYStatement *statement) :
266 statement_(statement)
270 virtual CYStatement *Replace(CYContext &context);
271 virtual void Output(CYOutput &out, CYFlags flags) const;
274 struct CYCStringLess :
275 std::binary_function<const char *, const char *, bool>
277 _finline bool operator ()(const char *lhs, const char *rhs) const {
278 return strcmp(lhs, rhs) < 0;
282 struct CYIdentifierValueLess :
283 std::binary_function<CYIdentifier *, CYIdentifier *, bool>
285 _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
286 return CYCStringLess()(lhs->Word(), rhs->Word());
290 enum CYIdentifierFlags {
291 CYIdentifierArgument,
292 CYIdentifierVariable,
298 typedef std::set<const char *, CYCStringLess> CYCStringSet;
299 typedef std::set<CYIdentifier *, CYIdentifierValueLess> CYIdentifierValueSet;
300 typedef std::map<CYIdentifier *, CYIdentifierFlags> CYIdentifierAddressFlagsMap;
302 struct CYIdentifierUsage {
303 CYIdentifier *identifier_;
307 typedef std::vector<CYIdentifierUsage> CYIdentifierUsageVector;
309 // XXX: strategy pattern, maybe subclass
320 CYStatement *&statements_;
324 CYIdentifierAddressFlagsMap internal_;
325 CYIdentifierValueSet identifiers_;
327 CYScope(CYScopeType type, CYContext &context, CYStatement *&statements);
331 void Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags);
332 virtual CYIdentifier *Lookup(CYContext &context, CYIdentifier *identifier);
333 void Merge(CYContext &context, CYIdentifier *identifier);
334 void Scope(CYContext &context, CYStatement *&statements);
340 CYStatement *statements_;
342 CYProgram(CYStatement *statements) :
343 statements_(statements)
347 virtual void Replace(CYContext &context);
348 virtual void Output(CYOutput &out) const;
357 CYIdentifierUsageVector rename_;
359 CYNonLocal *nonlocal_;
360 CYNonLocal *nextlocal_;
363 CYContext(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)
387 void NonLocal(CYStatement *&statements);
388 CYIdentifier *Unique();
392 CYIdentifier *identifier_;
399 CYIdentifier *Target(CYContext &context) {
400 if (identifier_ == NULL)
401 identifier_ = context.Unique();
410 CYStatement *statements_;
412 CYBlock(CYStatement *statements) :
413 statements_(statements)
417 operator CYStatement *() const {
421 void AddPrev(CYStatement *statement) {
422 CYStatement *last(statement);
423 while (last->next_ != NULL)
425 last->SetNext(statements_);
426 statements_ = statement;
429 virtual CYStatement *Replace(CYContext &context);
431 virtual void Output(CYOutput &out) const;
432 virtual void Output(CYOutput &out, CYFlags flags) const;
458 std::string filename_;
462 cy::location location_;
463 std::string message_;
466 typedef std::vector<Error> Errors;
474 CYExpression *context_;
476 Context(CYExpression *context) :
481 typedef std::vector<CYWord *> Words;
485 typedef std::vector<Context> Contexts;
488 CYExpression *context_;
500 void ScannerDestroy();
503 CYDriver(const std::string &filename = "");
506 Condition GetCondition();
507 void SetCondition(Condition condition);
509 void PushCondition(Condition condition);
512 void Warning(const cy::location &location, const char *message);
515 struct CYForInitialiser {
516 virtual ~CYForInitialiser() {
519 virtual void For(CYOutput &out) const = 0;
520 virtual CYExpression *Replace(CYContext &context) = 0;
523 struct CYForInInitialiser {
524 virtual ~CYForInInitialiser() {
527 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
528 virtual const char *ForEachIn() const = 0;
529 virtual CYExpression *ForEachIn(CYContext &out) = 0;
530 virtual CYExpression *Replace(CYContext &context) = 0;
536 struct CYExpression :
537 CYNext<CYExpression>,
543 virtual unsigned Precedence() const = 0;
545 virtual bool RightHand() const {
549 virtual void For(CYOutput &out) const;
550 virtual void ForIn(CYOutput &out, CYFlags flags) const;
552 virtual const char *ForEachIn() const;
553 virtual CYExpression *ForEachIn(CYContext &out);
555 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
557 virtual void Output(CYOutput &out) const;
558 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
559 void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
561 virtual CYExpression *ClassName(CYContext &context, bool object);
562 virtual void ClassName(CYOutput &out, bool object) const;
564 CYExpression *ReplaceAll(CYContext &context);
566 virtual CYExpression *Replace(CYContext &context) = 0;
568 virtual CYExpression *Primitive(CYContext &context) {
572 virtual CYNumber *Number(CYContext &context) {
576 virtual CYString *String(CYContext &context) {
580 virtual const char *Word() const {
585 #define CYAlphabetic(value) \
586 virtual bool Alphabetic() const { \
590 #define CYPrecedence(value) \
591 virtual unsigned Precedence() const { \
595 #define CYRightHand(value) \
596 virtual bool RightHand() const { \
603 CYExpression *expressions_;
605 CYCompound(CYExpression *expressions = NULL) :
606 expressions_(expressions)
610 void AddPrev(CYExpression *expression) {
611 CYExpression *last(expression);
612 while (last->next_ != NULL)
614 last->SetNext(expressions_);
615 expressions_ = expression;
620 virtual CYExpression *Replace(CYContext &context);
621 void Output(CYOutput &out, CYFlags flags) const;
624 struct CYFunctionParameter :
625 CYNext<CYFunctionParameter>,
630 CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next = NULL) :
631 CYNext<CYFunctionParameter>(next),
636 virtual CYFunctionParameter *Replace(CYContext &context, CYBlock &code);
637 virtual void Output(CYOutput &out) const;
640 struct CYOptionalFunctionParameter :
643 CYExpression *initializer_;
645 CYOptionalFunctionParameter(CYIdentifier *name, CYExpression *initializer, CYFunctionParameter *next = NULL) :
646 CYFunctionParameter(name, next),
647 initializer_(initializer)
651 virtual CYFunctionParameter *Replace(CYContext &context, CYBlock &code);
652 virtual void Output(CYOutput &out) const;
655 struct CYComprehension :
656 CYNext<CYComprehension>,
659 virtual const char *Name() const = 0;
661 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
662 CYFunctionParameter *Parameters(CYContext &context) const;
663 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
664 virtual void Output(CYOutput &out) const = 0;
667 struct CYForInComprehension :
673 CYForInComprehension(CYIdentifier *name, CYExpression *set) :
679 virtual const char *Name() const {
680 return name_->Word();
683 virtual CYFunctionParameter *Parameter(CYContext &context) const;
684 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
685 virtual void Output(CYOutput &out) const;
688 struct CYForEachInComprehension :
694 CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
700 virtual const char *Name() const {
701 return name_->Word();
704 virtual CYFunctionParameter *Parameter(CYContext &context) const;
705 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
706 virtual void Output(CYOutput &out) const;
709 struct CYIfComprehension :
714 CYIfComprehension(CYExpression *test) :
719 virtual const char *Name() const {
723 virtual CYFunctionParameter *Parameter(CYContext &context) const;
724 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
725 virtual void Output(CYOutput &out) const;
728 struct CYArrayComprehension :
731 CYExpression *expression_;
732 CYComprehension *comprehensions_;
734 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
735 expression_(expression),
736 comprehensions_(comprehensions)
742 virtual CYExpression *Replace(CYContext &context);
743 virtual void Output(CYOutput &out, CYFlags flags) const;
756 virtual CYExpression *Replace(CYContext &context);
770 CYRange(uint64_t lo, uint64_t hi) :
775 bool operator [](uint8_t value) const {
776 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
779 void operator()(uint8_t value) {
782 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
786 extern CYRange DigitRange_;
787 extern CYRange WordStartRange_;
788 extern CYRange WordEndRange_;
803 CYString(const char *value) :
809 CYString(const char *value, size_t size) :
815 CYString(const CYWord *word) :
816 value_(word->Word()),
817 size_(strlen(value_))
821 const char *Value() const {
825 virtual const char *Word() const;
827 virtual CYNumber *Number(CYContext &context);
828 virtual CYString *String(CYContext &context);
830 CYString *Concat(CYContext &out, CYString *rhs) const;
831 virtual void Output(CYOutput &out, CYFlags flags) const;
832 virtual void PropertyName(CYOutput &out) const;
841 CYNumber(double value) :
846 double Value() const {
850 virtual CYNumber *Number(CYContext &context);
851 virtual CYString *String(CYContext &context);
853 virtual void Output(CYOutput &out, CYFlags flags) const;
854 virtual void PropertyName(CYOutput &out) const;
862 CYRegEx(const char *value) :
867 const char *Value() const {
871 virtual void Output(CYOutput &out, CYFlags flags) const;
883 virtual CYNumber *Number(CYContext &context);
884 virtual CYString *String(CYContext &context);
886 virtual void Output(CYOutput &out, CYFlags flags) const;
898 virtual CYExpression *Replace(CYContext &context);
899 virtual void Output(CYOutput &out, CYFlags flags) const;
905 virtual bool Value() const = 0;
906 virtual void Output(CYOutput &out, CYFlags flags) const;
918 virtual bool Value() const {
922 virtual CYNumber *Number(CYContext &context);
923 virtual CYString *String(CYContext &context);
935 virtual bool Value() const {
939 virtual CYNumber *Number(CYContext &context);
940 virtual CYString *String(CYContext &context);
948 CYVariable(CYIdentifier *name) :
953 CYVariable(const char *name) :
954 name_(new($pool) CYIdentifier(name))
961 virtual CYExpression *Replace(CYContext &context);
962 virtual void Output(CYOutput &out, CYFlags flags) const;
970 CYPrefix(CYExpression *rhs) :
975 virtual bool Alphabetic() const = 0;
976 virtual const char *Operator() const = 0;
980 virtual CYExpression *Replace(CYContext &context);
981 virtual void Output(CYOutput &out, CYFlags flags) const;
990 CYInfix(CYExpression *lhs, CYExpression *rhs) :
996 void SetLeft(CYExpression *lhs) {
1000 virtual bool Alphabetic() const = 0;
1001 virtual const char *Operator() const = 0;
1003 virtual CYExpression *Replace(CYContext &context);
1004 virtual void Output(CYOutput &out, CYFlags flags) const;
1012 CYPostfix(CYExpression *lhs) :
1017 virtual const char *Operator() const = 0;
1021 virtual CYExpression *Replace(CYContext &context);
1022 virtual void Output(CYOutput &out, CYFlags flags) const;
1025 struct CYAssignment :
1031 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
1037 void SetLeft(CYExpression *lhs) {
1041 virtual const char *Operator() const = 0;
1045 virtual CYExpression *Replace(CYContext &context);
1046 virtual void Output(CYOutput &out, CYFlags flags) const;
1054 CYExpression *value_;
1056 CYArgument(CYExpression *value, CYArgument *next = NULL) :
1057 CYNext<CYArgument>(next),
1063 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
1064 CYNext<CYArgument>(next),
1070 void Replace(CYContext &context);
1071 void Output(CYOutput &out) const;
1087 CYExpression *case_;
1088 CYStatement *statements_;
1090 CYClause(CYExpression *_case, CYStatement *statements) :
1092 statements_(statements)
1096 void Replace(CYContext &context);
1097 virtual void Output(CYOutput &out) const;
1104 CYExpression *value_;
1106 CYElement(CYExpression *value, CYElement *next) :
1107 CYNext<CYElement>(next),
1112 void Replace(CYContext &context);
1113 void Output(CYOutput &out) const;
1119 CYElement *elements_;
1121 CYArray(CYElement *elements = NULL) :
1126 virtual CYExpression *Replace(CYContext &context);
1127 virtual void Output(CYOutput &out, CYFlags flags) const;
1134 CYPropertyName *name_;
1135 CYExpression *value_;
1137 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1138 CYNext<CYProperty>(next),
1144 void Replace(CYContext &context);
1145 virtual void Output(CYOutput &out) const;
1148 struct CYDeclaration :
1151 CYIdentifier *identifier_;
1152 CYExpression *initialiser_;
1154 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
1155 identifier_(identifier),
1156 initialiser_(initialiser)
1160 virtual void ForIn(CYOutput &out, CYFlags flags) const;
1162 virtual const char *ForEachIn() const;
1163 virtual CYExpression *ForEachIn(CYContext &out);
1165 virtual CYExpression *Replace(CYContext &context);
1166 virtual CYAssignment *Assignment(CYContext &context);
1168 virtual void Output(CYOutput &out, CYFlags flags) const;
1171 struct CYDeclarations :
1172 CYNext<CYDeclarations>,
1176 CYDeclaration *declaration_;
1178 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1179 CYNext<CYDeclarations>(next),
1180 declaration_(declaration)
1184 virtual void For(CYOutput &out) const;
1186 virtual CYCompound *Replace(CYContext &context);
1187 CYProperty *Property(CYContext &context);
1189 virtual void Output(CYOutput &out) const;
1190 virtual void Output(CYOutput &out, CYFlags flags) const;
1196 CYDeclarations *declarations_;
1198 CYVar(CYDeclarations *declarations) :
1199 declarations_(declarations)
1203 virtual CYStatement *Replace(CYContext &context);
1204 virtual void Output(CYOutput &out, CYFlags flags) const;
1210 CYDeclarations *declarations_;
1213 CYLet(CYDeclarations *declarations, CYStatement *statements) :
1214 declarations_(declarations),
1219 virtual CYStatement *Replace(CYContext &context);
1220 virtual void Output(CYOutput &out, CYFlags flags) const;
1226 CYForInitialiser *initialiser_;
1227 CYExpression *test_;
1228 CYExpression *increment_;
1231 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1232 initialiser_(initialiser),
1234 increment_(increment),
1239 virtual CYStatement *Replace(CYContext &context);
1240 virtual void Output(CYOutput &out, CYFlags flags) const;
1246 CYForInInitialiser *initialiser_;
1250 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1251 initialiser_(initialiser),
1257 virtual CYStatement *Replace(CYContext &context);
1258 virtual void Output(CYOutput &out, CYFlags flags) const;
1261 struct CYForEachIn :
1264 CYForInInitialiser *initialiser_;
1268 CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1269 initialiser_(initialiser),
1275 virtual CYStatement *Replace(CYContext &context);
1276 virtual void Output(CYOutput &out, CYFlags flags) const;
1282 CYProperty *properties_;
1284 CYObject(CYProperty *properties = NULL) :
1285 properties_(properties)
1289 virtual CYExpression *Replace(CYContext &context);
1290 void Output(CYOutput &out, CYFlags flags) const;
1296 CYExpression *object_;
1297 CYExpression *property_;
1299 CYMember(CYExpression *object, CYExpression *property) :
1305 void SetLeft(CYExpression *object) {
1309 void Replace_(CYContext &context);
1312 struct CYDirectMember :
1315 CYDirectMember(CYExpression *object, CYExpression *property) :
1316 CYMember(object, property)
1323 virtual CYExpression *Replace(CYContext &context);
1324 virtual void Output(CYOutput &out, CYFlags flags) const;
1327 struct CYIndirectMember :
1330 CYIndirectMember(CYExpression *object, CYExpression *property) :
1331 CYMember(object, property)
1338 virtual CYExpression *Replace(CYContext &context);
1339 virtual void Output(CYOutput &out, CYFlags flags) const;
1348 CYExpression *constructor_;
1349 CYArgument *arguments_;
1351 New(CYExpression *constructor, CYArgument *arguments) :
1352 constructor_(constructor),
1353 arguments_(arguments)
1357 virtual unsigned Precedence() const {
1358 return arguments_ == NULL ? 2 : 1;
1363 virtual CYExpression *Replace(CYContext &context);
1364 virtual void Output(CYOutput &out, CYFlags flags) const;
1366 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1374 CYExpression *function_;
1375 CYArgument *arguments_;
1377 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1378 function_(function),
1379 arguments_(arguments)
1386 virtual CYExpression *Replace(CYContext &context);
1387 virtual void Output(CYOutput &out, CYFlags flags) const;
1389 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1394 struct CYRubyBlock :
1397 CYExpression *call_;
1400 CYRubyBlock(CYExpression *call, CYRubyProc *proc) :
1409 virtual CYExpression *Replace(CYContext &context);
1410 virtual void Output(CYOutput &out, CYFlags flags) const;
1416 CYExpression *test_;
1418 CYStatement *false_;
1420 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1427 virtual CYStatement *Replace(CYContext &context);
1428 virtual void Output(CYOutput &out, CYFlags flags) const;
1434 CYExpression *test_;
1437 CYDoWhile(CYExpression *test, CYStatement *code) :
1443 virtual CYStatement *Replace(CYContext &context);
1444 virtual void Output(CYOutput &out, CYFlags flags) const;
1450 CYExpression *test_;
1453 CYWhile(CYExpression *test, CYStatement *code) :
1459 virtual CYStatement *Replace(CYContext &context);
1460 virtual void Output(CYOutput &out, CYFlags flags) const;
1463 // XXX: this should be split up into CYAnonymousFunction and CYNamedFunction (subclass)
1465 CYIdentifier *name_;
1466 CYFunctionParameter *parameters_;
1468 CYNonLocal *nonlocal_;
1470 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1472 parameters_(parameters),
1478 virtual ~CYFunction() {
1481 void Inject(CYContext &context);
1482 virtual void Replace_(CYContext &context, bool outer);
1483 virtual void Output(CYOutput &out, CYFlags flags) const;
1486 // XXX: this should be split up into CYAnonymousFunctionExpression and CYNamedFunctionExpression
1487 struct CYFunctionExpression :
1491 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1492 CYFunction(name, parameters, statements)
1499 virtual CYExpression *Replace(CYContext &context);
1500 virtual void Output(CYOutput &out, CYFlags flags) const;
1503 // XXX: this should derive from CYAnonymousFunctionExpression
1505 CYFunctionExpression
1507 CYRubyProc(CYFunctionParameter *parameters, CYStatement *statements) :
1508 CYFunctionExpression(NULL, parameters, statements)
1512 virtual CYExpression *Replace(CYContext &context);
1513 virtual void Output(CYOutput &out, CYFlags flags) const;
1516 // XXX: this should derive from CYNamedFunction
1517 struct CYFunctionStatement :
1521 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1522 CYFunction(name, parameters, statements)
1526 virtual CYStatement *Replace(CYContext &context);
1527 virtual void Output(CYOutput &out, CYFlags flags) const;
1533 CYExpression *expression_;
1535 CYExpress(CYExpression *expression) :
1536 expression_(expression)
1538 if (expression == NULL)
1542 virtual CYStatement *Collapse(CYContext &context);
1543 virtual CYStatement *Replace(CYContext &context);
1544 virtual void Output(CYOutput &out, CYFlags flags) const;
1550 CYIdentifier *label_;
1552 CYContinue(CYIdentifier *label) :
1557 virtual CYStatement *Replace(CYContext &context);
1558 virtual void Output(CYOutput &out, CYFlags flags) const;
1564 CYIdentifier *label_;
1566 CYBreak(CYIdentifier *label) :
1571 virtual CYStatement *Replace(CYContext &context);
1572 virtual void Output(CYOutput &out, CYFlags flags) const;
1578 CYExpression *value_;
1580 CYReturn(CYExpression *value) :
1585 virtual CYStatement *Replace(CYContext &context);
1586 virtual void Output(CYOutput &out, CYFlags flags) const;
1592 virtual CYStatement *Collapse(CYContext &context);
1593 virtual CYStatement *Replace(CYContext &context);
1594 virtual void Output(CYOutput &out, CYFlags flags) const;
1602 CYFinally(CYStatement *statements) :
1607 void Replace(CYContext &context);
1608 virtual void Output(CYOutput &out) const;
1617 CYIdentifier *name_;
1620 Catch(CYIdentifier *name, CYStatement *statements) :
1626 void Replace(CYContext &context);
1627 virtual void Output(CYOutput &out) const;
1635 CYFinally *finally_;
1637 Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
1644 virtual CYStatement *Replace(CYContext &context);
1645 virtual void Output(CYOutput &out, CYFlags flags) const;
1651 CYExpression *value_;
1653 Throw(CYExpression *value = NULL) :
1658 virtual CYStatement *Replace(CYContext &context);
1659 virtual void Output(CYOutput &out, CYFlags flags) const;
1667 CYExpression *scope_;
1670 CYWith(CYExpression *scope, CYStatement *code) :
1676 virtual CYStatement *Replace(CYContext &context);
1677 virtual void Output(CYOutput &out, CYFlags flags) const;
1683 CYExpression *value_;
1686 CYSwitch(CYExpression *value, CYClause *clauses) :
1692 virtual CYStatement *Replace(CYContext &context);
1693 virtual void Output(CYOutput &out, CYFlags flags) const;
1696 struct CYCondition :
1699 CYExpression *test_;
1700 CYExpression *true_;
1701 CYExpression *false_;
1703 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
1712 virtual CYExpression *Replace(CYContext &context);
1713 virtual void Output(CYOutput &out, CYFlags flags) const;
1716 struct CYAddressOf :
1719 CYAddressOf(CYExpression *rhs) :
1724 virtual const char *Operator() const {
1730 virtual CYExpression *Replace(CYContext &context);
1736 CYIndirect(CYExpression *rhs) :
1741 virtual const char *Operator() const {
1747 virtual CYExpression *Replace(CYContext &context);
1751 virtual CYExpression *Replace(CYContext &context);
1753 #define CYPostfix_(op, name, args...) \
1754 struct CY ## name : \
1757 CY ## name(CYExpression *lhs) : \
1762 virtual const char *Operator() const { \
1767 #define CYPrefix_(alphabetic, op, name, args...) \
1768 struct CY ## name : \
1771 CY ## name(CYExpression *rhs) : \
1776 CYAlphabetic(alphabetic) \
1778 virtual const char *Operator() const { \
1783 #define CYInfix_(alphabetic, precedence, op, name, args...) \
1784 struct CY ## name : \
1787 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
1792 CYAlphabetic(alphabetic) \
1793 CYPrecedence(precedence) \
1795 virtual const char *Operator() const { \
1800 #define CYAssignment_(op, name, args...) \
1801 struct CY ## name ## Assign : \
1804 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
1805 CYAssignment(lhs, rhs) \
1809 virtual const char *Operator() const { \
1814 CYPostfix_("++", PostIncrement)
1815 CYPostfix_("--", PostDecrement)
1817 CYPrefix_(true, "delete", Delete)
1818 CYPrefix_(true, "void", Void)
1819 CYPrefix_(true, "typeof", TypeOf)
1820 CYPrefix_(false, "++", PreIncrement)
1821 CYPrefix_(false, "--", PreDecrement)
1822 CYPrefix_(false, "+", Affirm)
1823 CYPrefix_(false, "-", Negate)
1824 CYPrefix_(false, "~", BitwiseNot)
1825 CYPrefix_(false, "!", LogicalNot)
1827 CYInfix_(false, 5, "*", Multiply)
1828 CYInfix_(false, 5, "/", Divide)
1829 CYInfix_(false, 5, "%", Modulus)
1830 CYInfix_(false, 6, "+", Add, CYReplace)
1831 CYInfix_(false, 6, "-", Subtract)
1832 CYInfix_(false, 7, "<<", ShiftLeft)
1833 CYInfix_(false, 7, ">>", ShiftRightSigned)
1834 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
1835 CYInfix_(false, 8, "<", Less)
1836 CYInfix_(false, 8, ">", Greater)
1837 CYInfix_(false, 8, "<=", LessOrEqual)
1838 CYInfix_(false, 8, ">=", GreaterOrEqual)
1839 CYInfix_(true, 8, "instanceof", InstanceOf)
1840 CYInfix_(true, 8, "in", In)
1841 CYInfix_(false, 9, "==", Equal)
1842 CYInfix_(false, 9, "!=", NotEqual)
1843 CYInfix_(false, 9, "===", Identical)
1844 CYInfix_(false, 9, "!==", NotIdentical)
1845 CYInfix_(false, 10, "&", BitwiseAnd)
1846 CYInfix_(false, 11, "^", BitwiseXOr)
1847 CYInfix_(false, 12, "|", BitwiseOr)
1848 CYInfix_(false, 13, "&&", LogicalAnd)
1849 CYInfix_(false, 14, "||", LogicalOr)
1851 CYAssignment_("=", )
1852 CYAssignment_("*=", Multiply)
1853 CYAssignment_("/=", Divide)
1854 CYAssignment_("%=", Modulus)
1855 CYAssignment_("+=", Add)
1856 CYAssignment_("-=", Subtract)
1857 CYAssignment_("<<=", ShiftLeft)
1858 CYAssignment_(">>=", ShiftRightSigned)
1859 CYAssignment_(">>>=", ShiftRightUnsigned)
1860 CYAssignment_("&=", BitwiseAnd)
1861 CYAssignment_("^=", BitwiseXOr)
1862 CYAssignment_("|=", BitwiseOr)
1864 #endif/*CYPARSER_HPP*/