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/>.
35 #include "location.hh"
36 #include "Pooling.hpp"
37 #include "Options.hpp"
41 template <typename Type_>
55 void SetNext(Type_ *next) {
64 virtual void Output(struct CYOutput &out) const = 0;
82 CYOutput(std::ostream &out, CYOptions &options) :
92 void Check(char value);
95 CYOutput &operator <<(char rhs);
96 CYOutput &operator <<(const char *rhs);
98 _finline CYOutput &operator <<(const CYThing *rhs) {
104 _finline CYOutput &operator <<(const CYThing &rhs) {
110 struct CYPropertyName {
111 virtual void PropertyName(CYOutput &out) const = 0;
113 virtual ~CYPropertyName() {
127 CYNoBrace = (1 << 0),
128 CYNoFunction = (1 << 1),
131 CYNoRightHand = (1 << 4),
132 CYNoDangle = (1 << 5),
133 CYNoInteger = (1 << 6),
134 CYNoBF = (CYNoBrace | CYNoFunction),
140 virtual ~CYStatement() {
143 void Single(CYOutput &out, CYFlags flags) const;
144 void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
146 CYStatement *ReplaceAll(CYContext &context);
147 virtual CYStatement *Collapse(CYContext &context);
149 virtual CYStatement *Replace(CYContext &context) = 0;
152 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
155 struct CYStatements {
165 operator CYStatement *() const {
169 CYStatements &operator ->*(CYStatement *next) {
171 if (first_ == NULL) {
174 } else for (;; last_ = last_->next_)
175 if (last_->next_ == NULL) {
185 virtual ~CYClassName() {
188 virtual CYExpression *ClassName(CYContext &context, bool object) = 0;
189 virtual void ClassName(CYOutput &out, bool object) const = 0;
199 CYWord(const char *word) :
204 void Set(const char *value) {
208 virtual const char *Word() const;
209 virtual void Output(CYOutput &out) const;
211 virtual CYExpression *ClassName(CYContext &context, bool object);
212 virtual void ClassName(CYOutput &out, bool object) const;
213 virtual void PropertyName(CYOutput &out) const;
216 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
218 return lhs << rhs.Word();
221 struct CYIdentifier :
222 CYNext<CYIdentifier>,
225 CYIdentifier *replace_;
229 CYIdentifier(const char *word) :
237 virtual const char *Word() const;
238 CYIdentifier *Replace(CYContext &context);
246 CYComment(const char *value) :
251 virtual CYStatement *Replace(CYContext &context);
252 virtual void Output(CYOutput &out, CYFlags flags) const;
259 CYStatement *statement_;
261 CYLabel(CYIdentifier *name, CYStatement *statement) :
263 statement_(statement)
267 virtual CYStatement *Replace(CYContext &context);
268 virtual void Output(CYOutput &out, CYFlags flags) const;
271 struct CYCStringLess :
272 std::binary_function<const char *, const char *, bool>
274 _finline bool operator ()(const char *lhs, const char *rhs) const {
275 return strcmp(lhs, rhs) < 0;
279 struct CYIdentifierValueLess :
280 std::binary_function<CYIdentifier *, CYIdentifier *, bool>
282 _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
283 return CYCStringLess()(lhs->Word(), rhs->Word());
287 enum CYIdentifierFlags {
288 CYIdentifierArgument,
289 CYIdentifierVariable,
295 typedef std::set<const char *, CYCStringLess> CYCStringSet;
296 typedef std::set<CYIdentifier *, CYIdentifierValueLess> CYIdentifierValueSet;
297 typedef std::map<CYIdentifier *, CYIdentifierFlags> CYIdentifierAddressFlagsMap;
299 struct CYIdentifierUsage {
300 CYIdentifier *identifier_;
304 typedef std::vector<CYIdentifierUsage> CYIdentifierUsageVector;
306 // XXX: strategy pattern, maybe subclass
317 CYStatement *&statements_;
321 CYIdentifierAddressFlagsMap internal_;
322 CYIdentifierValueSet identifiers_;
324 CYScope(CYScopeType type, CYContext &context, CYStatement *&statements);
328 void Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags);
329 virtual CYIdentifier *Lookup(CYContext &context, CYIdentifier *identifier);
330 void Merge(CYContext &context, CYIdentifier *identifier);
331 void Scope(CYContext &context, CYStatement *&statements);
337 CYStatement *statements_;
339 CYProgram(CYStatement *statements) :
340 statements_(statements)
344 virtual void Replace(CYContext &context);
345 virtual void Output(CYOutput &out) const;
354 CYIdentifierUsageVector rename_;
356 CYNonLocal *nonlocal_;
357 CYNonLocal *nextlocal_;
360 CYContext(CYOptions &options) :
369 virtual ~CYContext() {
372 template <typename Type_>
373 void Replace(Type_ *&value) {
374 for (;;) if (value == NULL)
377 Type_ *replace(value->Replace(*this));
378 if (replace != value)
384 void NonLocal(CYStatement *&statements);
385 CYIdentifier *Unique();
389 CYIdentifier *identifier_;
396 CYIdentifier *Target(CYContext &context) {
397 if (identifier_ == NULL)
398 identifier_ = context.Unique();
407 CYStatement *statements_;
409 CYBlock(CYStatement *statements) :
410 statements_(statements)
414 operator CYStatement *() const {
418 void AddPrev(CYStatement *statement) {
419 CYStatement *last(statement);
420 while (last->next_ != NULL)
422 last->SetNext(statements_);
423 statements_ = statement;
426 virtual CYStatement *Replace(CYContext &context);
428 virtual void Output(CYOutput &out) const;
429 virtual void Output(CYOutput &out, CYFlags flags) const;
455 std::string filename_;
459 cy::location location_;
460 std::string message_;
463 typedef std::vector<Error> Errors;
471 CYExpression *context_;
473 Context(CYExpression *context) :
478 typedef std::vector<CYWord *> Words;
482 typedef std::vector<Context> Contexts;
485 CYExpression *context_;
497 void ScannerDestroy();
500 CYDriver(const std::string &filename = "");
503 Condition GetCondition();
504 void SetCondition(Condition condition);
506 void PushCondition(Condition condition);
509 void Warning(const cy::location &location, const char *message);
512 struct CYForInitialiser {
513 virtual ~CYForInitialiser() {
516 virtual void For(CYOutput &out) const = 0;
517 virtual CYExpression *Replace(CYContext &context) = 0;
520 struct CYForInInitialiser {
521 virtual ~CYForInInitialiser() {
524 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
525 virtual const char *ForEachIn() const = 0;
526 virtual CYExpression *ForEachIn(CYContext &out) = 0;
527 virtual CYExpression *Replace(CYContext &context) = 0;
533 struct CYExpression :
534 CYNext<CYExpression>,
540 virtual unsigned Precedence() const = 0;
542 virtual bool RightHand() const {
546 virtual void For(CYOutput &out) const;
547 virtual void ForIn(CYOutput &out, CYFlags flags) const;
549 virtual const char *ForEachIn() const;
550 virtual CYExpression *ForEachIn(CYContext &out);
552 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
554 virtual void Output(CYOutput &out) const;
555 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
556 void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
558 virtual CYExpression *ClassName(CYContext &context, bool object);
559 virtual void ClassName(CYOutput &out, bool object) const;
561 virtual CYExpression *Replace(CYContext &context) = 0;
563 virtual CYExpression *Primitive(CYContext &context) {
567 virtual CYNumber *Number(CYContext &context) {
571 virtual CYString *String(CYContext &context) {
575 virtual const char *Word() const {
580 #define CYAlphabetic(value) \
581 virtual bool Alphabetic() const { \
585 #define CYPrecedence(value) \
586 static const unsigned Precedence_ = value; \
587 virtual unsigned Precedence() const { \
588 return Precedence_; \
591 #define CYRightHand(value) \
592 virtual bool RightHand() const { \
599 CYExpression *expressions_;
601 CYCompound(CYExpression *expressions = NULL) :
602 expressions_(expressions)
606 void AddPrev(CYExpression *expression) {
607 CYExpression *last(expression);
608 while (last->next_ != NULL)
610 last->SetNext(expressions_);
611 expressions_ = expression;
616 virtual CYExpression *Replace(CYContext &context);
617 void Output(CYOutput &out, CYFlags flags) const;
620 struct CYFunctionParameter :
621 CYNext<CYFunctionParameter>,
626 CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next = NULL) :
627 CYNext<CYFunctionParameter>(next),
632 virtual CYFunctionParameter *Replace(CYContext &context, CYBlock &code);
633 virtual void Output(CYOutput &out) const;
636 struct CYOptionalFunctionParameter :
639 CYExpression *initializer_;
641 CYOptionalFunctionParameter(CYIdentifier *name, CYExpression *initializer, CYFunctionParameter *next = NULL) :
642 CYFunctionParameter(name, next),
643 initializer_(initializer)
647 virtual CYFunctionParameter *Replace(CYContext &context, CYBlock &code);
648 virtual void Output(CYOutput &out) const;
651 struct CYComprehension :
652 CYNext<CYComprehension>,
655 virtual const char *Name() const = 0;
657 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
658 CYFunctionParameter *Parameters(CYContext &context) const;
659 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
660 virtual void Output(CYOutput &out) const = 0;
663 struct CYForInComprehension :
669 CYForInComprehension(CYIdentifier *name, CYExpression *set) :
675 virtual const char *Name() const {
676 return name_->Word();
679 virtual CYFunctionParameter *Parameter(CYContext &context) const;
680 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
681 virtual void Output(CYOutput &out) const;
684 struct CYForEachInComprehension :
690 CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
696 virtual const char *Name() const {
697 return name_->Word();
700 virtual CYFunctionParameter *Parameter(CYContext &context) const;
701 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
702 virtual void Output(CYOutput &out) const;
705 struct CYIfComprehension :
710 CYIfComprehension(CYExpression *test) :
715 virtual const char *Name() const {
719 virtual CYFunctionParameter *Parameter(CYContext &context) const;
720 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
721 virtual void Output(CYOutput &out) const;
724 struct CYArrayComprehension :
727 CYExpression *expression_;
728 CYComprehension *comprehensions_;
730 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
731 expression_(expression),
732 comprehensions_(comprehensions)
738 virtual CYExpression *Replace(CYContext &context);
739 virtual void Output(CYOutput &out, CYFlags flags) const;
752 virtual CYExpression *Replace(CYContext &context);
766 CYRange(uint64_t lo, uint64_t hi) :
771 bool operator [](uint8_t value) const {
772 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
775 void operator()(uint8_t value) {
778 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
782 extern CYRange DigitRange_;
783 extern CYRange WordStartRange_;
784 extern CYRange WordEndRange_;
799 CYString(const char *value) :
805 CYString(const char *value, size_t size) :
811 CYString(const CYWord *word) :
812 value_(word->Word()),
813 size_(strlen(value_))
817 const char *Value() const {
821 virtual const char *Word() const;
823 virtual CYNumber *Number(CYContext &context);
824 virtual CYString *String(CYContext &context);
826 CYString *Concat(CYContext &out, CYString *rhs) const;
827 virtual void Output(CYOutput &out, CYFlags flags) const;
828 virtual void PropertyName(CYOutput &out) const;
837 CYNumber(double value) :
842 double Value() const {
846 virtual CYNumber *Number(CYContext &context);
847 virtual CYString *String(CYContext &context);
849 virtual void Output(CYOutput &out, CYFlags flags) const;
850 virtual void PropertyName(CYOutput &out) const;
858 CYRegEx(const char *value) :
863 const char *Value() const {
867 virtual void Output(CYOutput &out, CYFlags flags) const;
879 virtual CYNumber *Number(CYContext &context);
880 virtual CYString *String(CYContext &context);
882 virtual void Output(CYOutput &out, CYFlags flags) const;
894 virtual CYExpression *Replace(CYContext &context);
895 virtual void Output(CYOutput &out, CYFlags flags) const;
901 virtual bool Value() const = 0;
902 virtual void Output(CYOutput &out, CYFlags flags) const;
914 virtual bool Value() const {
918 virtual CYNumber *Number(CYContext &context);
919 virtual CYString *String(CYContext &context);
931 virtual bool Value() const {
935 virtual CYNumber *Number(CYContext &context);
936 virtual CYString *String(CYContext &context);
944 CYVariable(CYIdentifier *name) :
949 CYVariable(const char *name) :
950 name_(new($pool) CYIdentifier(name))
957 virtual CYExpression *Replace(CYContext &context);
958 virtual void Output(CYOutput &out, CYFlags flags) const;
966 CYPrefix(CYExpression *rhs) :
971 virtual bool Alphabetic() const = 0;
972 virtual const char *Operator() const = 0;
976 virtual CYExpression *Replace(CYContext &context);
977 virtual void Output(CYOutput &out, CYFlags flags) const;
986 CYInfix(CYExpression *lhs, CYExpression *rhs) :
992 void SetLeft(CYExpression *lhs) {
996 virtual bool Alphabetic() const = 0;
997 virtual const char *Operator() const = 0;
999 virtual CYExpression *Replace(CYContext &context);
1000 virtual void Output(CYOutput &out, CYFlags flags) const;
1008 CYPostfix(CYExpression *lhs) :
1013 virtual const char *Operator() const = 0;
1017 virtual CYExpression *Replace(CYContext &context);
1018 virtual void Output(CYOutput &out, CYFlags flags) const;
1021 struct CYAssignment :
1027 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
1033 void SetLeft(CYExpression *lhs) {
1037 virtual const char *Operator() const = 0;
1041 virtual CYExpression *Replace(CYContext &context);
1042 virtual void Output(CYOutput &out, CYFlags flags) const;
1050 CYExpression *value_;
1052 CYArgument(CYExpression *value, CYArgument *next = NULL) :
1053 CYNext<CYArgument>(next),
1059 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
1060 CYNext<CYArgument>(next),
1066 void Replace(CYContext &context);
1067 void Output(CYOutput &out) const;
1083 CYExpression *case_;
1084 CYStatement *statements_;
1086 CYClause(CYExpression *_case, CYStatement *statements) :
1088 statements_(statements)
1092 void Replace(CYContext &context);
1093 virtual void Output(CYOutput &out) const;
1100 CYExpression *value_;
1102 CYElement(CYExpression *value, CYElement *next) :
1103 CYNext<CYElement>(next),
1108 void Replace(CYContext &context);
1109 void Output(CYOutput &out) const;
1115 CYElement *elements_;
1117 CYArray(CYElement *elements = NULL) :
1122 virtual CYExpression *Replace(CYContext &context);
1123 virtual void Output(CYOutput &out, CYFlags flags) const;
1130 CYPropertyName *name_;
1131 CYExpression *value_;
1133 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1134 CYNext<CYProperty>(next),
1140 void Replace(CYContext &context);
1141 virtual void Output(CYOutput &out) const;
1144 struct CYDeclaration :
1147 CYIdentifier *identifier_;
1148 CYExpression *initialiser_;
1150 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
1151 identifier_(identifier),
1152 initialiser_(initialiser)
1156 virtual void ForIn(CYOutput &out, CYFlags flags) const;
1158 virtual const char *ForEachIn() const;
1159 virtual CYExpression *ForEachIn(CYContext &out);
1161 virtual CYExpression *Replace(CYContext &context);
1162 virtual CYAssignment *Assignment(CYContext &context);
1164 virtual void Output(CYOutput &out, CYFlags flags) const;
1167 struct CYDeclarations :
1168 CYNext<CYDeclarations>,
1172 CYDeclaration *declaration_;
1174 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1175 CYNext<CYDeclarations>(next),
1176 declaration_(declaration)
1180 virtual void For(CYOutput &out) const;
1182 virtual CYCompound *Replace(CYContext &context);
1183 CYProperty *Property(CYContext &context);
1185 virtual void Output(CYOutput &out) const;
1186 virtual void Output(CYOutput &out, CYFlags flags) const;
1192 CYDeclarations *declarations_;
1194 CYVar(CYDeclarations *declarations) :
1195 declarations_(declarations)
1199 virtual CYStatement *Replace(CYContext &context);
1200 virtual void Output(CYOutput &out, CYFlags flags) const;
1206 CYDeclarations *declarations_;
1209 CYLet(CYDeclarations *declarations, CYStatement *statements) :
1210 declarations_(declarations),
1215 virtual CYStatement *Replace(CYContext &context);
1216 virtual void Output(CYOutput &out, CYFlags flags) const;
1222 CYForInitialiser *initialiser_;
1223 CYExpression *test_;
1224 CYExpression *increment_;
1227 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1228 initialiser_(initialiser),
1230 increment_(increment),
1235 virtual CYStatement *Replace(CYContext &context);
1236 virtual void Output(CYOutput &out, CYFlags flags) const;
1242 CYForInInitialiser *initialiser_;
1246 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1247 initialiser_(initialiser),
1253 virtual CYStatement *Replace(CYContext &context);
1254 virtual void Output(CYOutput &out, CYFlags flags) const;
1257 struct CYForEachIn :
1260 CYForInInitialiser *initialiser_;
1264 CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1265 initialiser_(initialiser),
1271 virtual CYStatement *Replace(CYContext &context);
1272 virtual void Output(CYOutput &out, CYFlags flags) const;
1278 CYProperty *properties_;
1280 CYObject(CYProperty *properties = NULL) :
1281 properties_(properties)
1285 virtual CYExpression *Replace(CYContext &context);
1286 void Output(CYOutput &out, CYFlags flags) const;
1292 CYExpression *object_;
1293 CYExpression *property_;
1295 CYMember(CYExpression *object, CYExpression *property) :
1301 void SetLeft(CYExpression *object) {
1305 void Replace_(CYContext &context);
1308 struct CYDirectMember :
1311 CYDirectMember(CYExpression *object, CYExpression *property) :
1312 CYMember(object, property)
1319 virtual CYExpression *Replace(CYContext &context);
1320 virtual void Output(CYOutput &out, CYFlags flags) const;
1323 struct CYIndirectMember :
1326 CYIndirectMember(CYExpression *object, CYExpression *property) :
1327 CYMember(object, property)
1334 virtual CYExpression *Replace(CYContext &context);
1335 virtual void Output(CYOutput &out, CYFlags flags) const;
1344 CYExpression *constructor_;
1345 CYArgument *arguments_;
1347 New(CYExpression *constructor, CYArgument *arguments) :
1348 constructor_(constructor),
1349 arguments_(arguments)
1353 virtual unsigned Precedence() const {
1354 return arguments_ == NULL ? 2 : 1;
1359 virtual CYExpression *Replace(CYContext &context);
1360 virtual void Output(CYOutput &out, CYFlags flags) const;
1362 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1370 CYExpression *function_;
1371 CYArgument *arguments_;
1373 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1374 function_(function),
1375 arguments_(arguments)
1382 virtual CYExpression *Replace(CYContext &context);
1383 virtual void Output(CYOutput &out, CYFlags flags) const;
1385 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1390 struct CYRubyBlock :
1393 CYExpression *call_;
1396 CYRubyBlock(CYExpression *call, CYRubyProc *proc) :
1405 virtual CYExpression *Replace(CYContext &context);
1406 virtual void Output(CYOutput &out, CYFlags flags) const;
1412 CYExpression *test_;
1414 CYStatement *false_;
1416 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1423 virtual CYStatement *Replace(CYContext &context);
1424 virtual void Output(CYOutput &out, CYFlags flags) const;
1430 CYExpression *test_;
1433 CYDoWhile(CYExpression *test, CYStatement *code) :
1439 virtual CYStatement *Replace(CYContext &context);
1440 virtual void Output(CYOutput &out, CYFlags flags) const;
1446 CYExpression *test_;
1449 CYWhile(CYExpression *test, CYStatement *code) :
1455 virtual CYStatement *Replace(CYContext &context);
1456 virtual void Output(CYOutput &out, CYFlags flags) const;
1459 // XXX: this should be split up into CYAnonymousFunction and CYNamedFunction (subclass)
1461 CYIdentifier *name_;
1462 CYFunctionParameter *parameters_;
1464 CYNonLocal *nonlocal_;
1466 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1468 parameters_(parameters),
1474 virtual ~CYFunction() {
1477 void Inject(CYContext &context);
1478 virtual void Replace_(CYContext &context, bool outer);
1479 virtual void Output(CYOutput &out, CYFlags flags) const;
1482 // XXX: this should be split up into CYAnonymousFunctionExpression and CYNamedFunctionExpression
1483 struct CYFunctionExpression :
1487 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1488 CYFunction(name, parameters, statements)
1495 virtual CYExpression *Replace(CYContext &context);
1496 virtual void Output(CYOutput &out, CYFlags flags) const;
1499 // XXX: this should derive from CYAnonymousFunctionExpression
1501 CYFunctionExpression
1503 CYRubyProc(CYFunctionParameter *parameters, CYStatement *statements) :
1504 CYFunctionExpression(NULL, parameters, statements)
1508 virtual CYExpression *Replace(CYContext &context);
1509 virtual void Output(CYOutput &out, CYFlags flags) const;
1512 // XXX: this should derive from CYNamedFunction
1513 struct CYFunctionStatement :
1517 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1518 CYFunction(name, parameters, statements)
1522 virtual CYStatement *Replace(CYContext &context);
1523 virtual void Output(CYOutput &out, CYFlags flags) const;
1529 CYExpression *expression_;
1531 CYExpress(CYExpression *expression) :
1532 expression_(expression)
1534 if (expression == NULL)
1538 virtual CYStatement *Collapse(CYContext &context);
1539 virtual CYStatement *Replace(CYContext &context);
1540 virtual void Output(CYOutput &out, CYFlags flags) const;
1546 CYIdentifier *label_;
1548 CYContinue(CYIdentifier *label) :
1553 virtual CYStatement *Replace(CYContext &context);
1554 virtual void Output(CYOutput &out, CYFlags flags) const;
1560 CYIdentifier *label_;
1562 CYBreak(CYIdentifier *label) :
1567 virtual CYStatement *Replace(CYContext &context);
1568 virtual void Output(CYOutput &out, CYFlags flags) const;
1574 CYExpression *value_;
1576 CYReturn(CYExpression *value) :
1581 virtual CYStatement *Replace(CYContext &context);
1582 virtual void Output(CYOutput &out, CYFlags flags) const;
1588 virtual CYStatement *Collapse(CYContext &context);
1589 virtual CYStatement *Replace(CYContext &context);
1590 virtual void Output(CYOutput &out, CYFlags flags) const;
1598 CYFinally(CYStatement *statements) :
1603 void Replace(CYContext &context);
1604 virtual void Output(CYOutput &out) const;
1613 CYIdentifier *name_;
1616 Catch(CYIdentifier *name, CYStatement *statements) :
1622 void Replace(CYContext &context);
1623 virtual void Output(CYOutput &out) const;
1631 CYFinally *finally_;
1633 Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
1640 virtual CYStatement *Replace(CYContext &context);
1641 virtual void Output(CYOutput &out, CYFlags flags) const;
1647 CYExpression *value_;
1649 Throw(CYExpression *value = NULL) :
1654 virtual CYStatement *Replace(CYContext &context);
1655 virtual void Output(CYOutput &out, CYFlags flags) const;
1663 CYExpression *scope_;
1666 CYWith(CYExpression *scope, CYStatement *code) :
1672 virtual CYStatement *Replace(CYContext &context);
1673 virtual void Output(CYOutput &out, CYFlags flags) const;
1679 CYExpression *value_;
1682 CYSwitch(CYExpression *value, CYClause *clauses) :
1688 virtual CYStatement *Replace(CYContext &context);
1689 virtual void Output(CYOutput &out, CYFlags flags) const;
1692 struct CYCondition :
1695 CYExpression *test_;
1696 CYExpression *true_;
1697 CYExpression *false_;
1699 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
1708 virtual CYExpression *Replace(CYContext &context);
1709 virtual void Output(CYOutput &out, CYFlags flags) const;
1712 struct CYAddressOf :
1715 CYAddressOf(CYExpression *rhs) :
1720 virtual const char *Operator() const {
1726 virtual CYExpression *Replace(CYContext &context);
1732 CYIndirect(CYExpression *rhs) :
1737 virtual const char *Operator() const {
1743 virtual CYExpression *Replace(CYContext &context);
1747 virtual CYExpression *Replace(CYContext &context);
1749 #define CYPostfix_(op, name, args...) \
1750 struct CY ## name : \
1753 CY ## name(CYExpression *lhs) : \
1758 virtual const char *Operator() const { \
1763 #define CYPrefix_(alphabetic, op, name, args...) \
1764 struct CY ## name : \
1767 CY ## name(CYExpression *rhs) : \
1772 CYAlphabetic(alphabetic) \
1774 virtual const char *Operator() const { \
1779 #define CYInfix_(alphabetic, precedence, op, name, args...) \
1780 struct CY ## name : \
1783 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
1788 CYAlphabetic(alphabetic) \
1789 CYPrecedence(precedence) \
1791 virtual const char *Operator() const { \
1796 #define CYAssignment_(op, name, args...) \
1797 struct CY ## name ## Assign : \
1800 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
1801 CYAssignment(lhs, rhs) \
1805 virtual const char *Operator() const { \
1810 CYPostfix_("++", PostIncrement)
1811 CYPostfix_("--", PostDecrement)
1813 CYPrefix_(true, "delete", Delete)
1814 CYPrefix_(true, "void", Void)
1815 CYPrefix_(true, "typeof", TypeOf)
1816 CYPrefix_(false, "++", PreIncrement)
1817 CYPrefix_(false, "--", PreDecrement)
1818 CYPrefix_(false, "+", Affirm)
1819 CYPrefix_(false, "-", Negate)
1820 CYPrefix_(false, "~", BitwiseNot)
1821 CYPrefix_(false, "!", LogicalNot)
1823 CYInfix_(false, 5, "*", Multiply)
1824 CYInfix_(false, 5, "/", Divide)
1825 CYInfix_(false, 5, "%", Modulus)
1826 CYInfix_(false, 6, "+", Add, CYReplace)
1827 CYInfix_(false, 6, "-", Subtract)
1828 CYInfix_(false, 7, "<<", ShiftLeft)
1829 CYInfix_(false, 7, ">>", ShiftRightSigned)
1830 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
1831 CYInfix_(false, 8, "<", Less)
1832 CYInfix_(false, 8, ">", Greater)
1833 CYInfix_(false, 8, "<=", LessOrEqual)
1834 CYInfix_(false, 8, ">=", GreaterOrEqual)
1835 CYInfix_(true, 8, "instanceof", InstanceOf)
1836 CYInfix_(true, 8, "in", In)
1837 CYInfix_(false, 9, "==", Equal)
1838 CYInfix_(false, 9, "!=", NotEqual)
1839 CYInfix_(false, 9, "===", Identical)
1840 CYInfix_(false, 9, "!==", NotIdentical)
1841 CYInfix_(false, 10, "&", BitwiseAnd)
1842 CYInfix_(false, 11, "^", BitwiseXOr)
1843 CYInfix_(false, 12, "|", BitwiseOr)
1844 CYInfix_(false, 13, "&&", LogicalAnd)
1845 CYInfix_(false, 14, "||", LogicalOr)
1847 CYAssignment_("=", )
1848 CYAssignment_("*=", Multiply)
1849 CYAssignment_("/=", Divide)
1850 CYAssignment_("%=", Modulus)
1851 CYAssignment_("+=", Add)
1852 CYAssignment_("-=", Subtract)
1853 CYAssignment_("<<=", ShiftLeft)
1854 CYAssignment_(">>=", ShiftRightSigned)
1855 CYAssignment_(">>>=", ShiftRightUnsigned)
1856 CYAssignment_("&=", BitwiseAnd)
1857 CYAssignment_("^=", BitwiseXOr)
1858 CYAssignment_("|=", BitwiseOr)
1860 #endif/*CYPARSER_HPP*/