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/>.
22 #ifndef CYCRIPT_PARSER_HPP
23 #define CYCRIPT_PARSER_HPP
35 #include "location.hh"
38 #include "Pooling.hpp"
39 #include "Options.hpp"
47 virtual void Output(struct CYOutput &out) const = 0;
65 CYOutput(std::ostream &out, CYOptions &options) :
75 void Check(char value);
78 CYOutput &operator <<(char rhs);
79 CYOutput &operator <<(const char *rhs);
81 _finline CYOutput &operator <<(const CYThing *rhs) {
87 _finline CYOutput &operator <<(const CYThing &rhs) {
93 struct CYPropertyName {
94 virtual void PropertyName(CYOutput &out) const = 0;
96 virtual ~CYPropertyName() {
110 CYNoBrace = (1 << 0),
111 CYNoFunction = (1 << 1),
114 CYNoRightHand = (1 << 4),
115 CYNoDangle = (1 << 5),
116 CYNoInteger = (1 << 6),
117 CYNoBF = (CYNoBrace | CYNoFunction),
123 virtual ~CYStatement() {
126 void Single(CYOutput &out, CYFlags flags) const;
127 void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
129 virtual CYStatement *Collapse(CYContext &context);
130 virtual CYStatement *Replace(CYContext &context) = 0;
133 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
136 struct CYStatements {
146 operator CYStatement *() const {
150 CYStatements &operator ->*(CYStatement *next) {
152 if (first_ == NULL) {
155 } else for (;; last_ = last_->next_)
156 if (last_->next_ == NULL) {
166 virtual ~CYClassName() {
169 virtual CYExpression *ClassName(CYContext &context, bool object) = 0;
170 virtual void ClassName(CYOutput &out, bool object) const = 0;
180 CYWord(const char *word) :
185 void Set(const char *value) {
189 virtual const char *Word() const;
190 virtual void Output(CYOutput &out) const;
192 virtual CYExpression *ClassName(CYContext &context, bool object);
193 virtual void ClassName(CYOutput &out, bool object) const;
194 virtual void PropertyName(CYOutput &out) const;
197 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
199 return lhs << rhs.Word();
202 struct CYIdentifier :
203 CYNext<CYIdentifier>,
206 CYIdentifier *replace_;
210 CYIdentifier(const char *word) :
218 virtual const char *Word() const;
219 CYIdentifier *Replace(CYContext &context);
227 CYComment(const char *value) :
232 virtual CYStatement *Replace(CYContext &context);
233 virtual void Output(CYOutput &out, CYFlags flags) const;
240 CYStatement *statement_;
242 CYLabel(CYIdentifier *name, CYStatement *statement) :
244 statement_(statement)
248 virtual CYStatement *Replace(CYContext &context);
249 virtual void Output(CYOutput &out, CYFlags flags) const;
252 struct CYCStringLess :
253 std::binary_function<const char *, const char *, bool>
255 _finline bool operator ()(const char *lhs, const char *rhs) const {
256 return strcmp(lhs, rhs) < 0;
260 struct CYIdentifierValueLess :
261 std::binary_function<CYIdentifier *, CYIdentifier *, bool>
263 _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
264 return CYCStringLess()(lhs->Word(), rhs->Word());
268 enum CYIdentifierFlags {
269 CYIdentifierArgument,
270 CYIdentifierVariable,
276 typedef std::set<const char *, CYCStringLess> CYCStringSet;
277 typedef std::set<CYIdentifier *, CYIdentifierValueLess> CYIdentifierValueSet;
278 typedef std::map<CYIdentifier *, CYIdentifierFlags> CYIdentifierAddressFlagsMap;
280 struct CYIdentifierUsage {
281 CYIdentifier *identifier_;
285 typedef std::vector<CYIdentifierUsage> CYIdentifierUsageVector;
287 // XXX: strategy pattern, maybe subclass
298 CYStatement *&statements_;
302 CYIdentifierAddressFlagsMap internal_;
303 CYIdentifierValueSet identifiers_;
305 CYScope(CYScopeType type, CYContext &context, CYStatement *&statements);
310 void Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags);
311 virtual CYIdentifier *Lookup(CYContext &context, CYIdentifier *identifier);
312 void Merge(CYContext &context, CYIdentifier *identifier);
313 void Scope(CYContext &context, CYStatement *&statements);
319 CYStatement *statements_;
321 CYProgram(CYStatement *statements) :
322 statements_(statements)
326 virtual void Replace(CYContext &context);
327 virtual void Output(CYOutput &out) const;
336 CYIdentifierUsageVector rename_;
338 CYNonLocal *nonlocal_;
339 CYNonLocal *nextlocal_;
342 CYContext(CYOptions &options) :
351 virtual ~CYContext() {
354 template <typename Type_>
355 void ReplaceAll(Type_ *&values) {
356 Type_ **last(&values);
357 CYForEach (next, values) {
358 Replace(*last = next);
359 last = &(*last)->next_;
363 template <typename Type_>
364 void Replace(Type_ *&value) {
365 for (;;) if (value == NULL)
368 Type_ *replace(value->Replace(*this));
369 if (replace != value)
375 void NonLocal(CYStatement *&statements);
376 CYIdentifier *Unique();
380 CYIdentifier *identifier_;
387 CYIdentifier *Target(CYContext &context) {
388 if (identifier_ == NULL)
389 identifier_ = context.Unique();
398 CYStatement *statements_;
400 CYBlock(CYStatement *statements) :
401 statements_(statements)
405 operator CYStatement *() const {
409 void AddPrev(CYStatement *statement) {
410 CYSetLast(statement, statements_);
411 statements_ = statement;
414 virtual CYStatement *Replace(CYContext &context);
416 virtual void Output(CYOutput &out) const;
417 virtual void Output(CYOutput &out, CYFlags flags) const;
443 std::string filename_;
447 cy::location location_;
448 std::string message_;
451 typedef std::vector<Error> Errors;
459 CYExpression *context_;
461 Context(CYExpression *context) :
466 typedef std::vector<CYWord *> Words;
470 typedef std::vector<Context> Contexts;
473 CYExpression *context_;
485 void ScannerDestroy();
488 CYDriver(const std::string &filename = "");
491 Condition GetCondition();
492 void SetCondition(Condition condition);
494 void PushCondition(Condition condition);
497 void Warning(const cy::location &location, const char *message);
500 struct CYForInitialiser {
501 virtual ~CYForInitialiser() {
504 virtual void For(CYOutput &out) const = 0;
505 virtual CYExpression *Replace(CYContext &context) = 0;
508 struct CYForInInitialiser {
509 virtual ~CYForInInitialiser() {
512 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
513 virtual const char *ForEachIn() const = 0;
514 virtual CYExpression *ForEachIn(CYContext &out) = 0;
515 virtual CYExpression *Replace(CYContext &context) = 0;
521 struct CYExpression :
522 CYNext<CYExpression>,
528 virtual unsigned Precedence() const = 0;
530 virtual bool RightHand() const {
534 virtual void For(CYOutput &out) const;
535 virtual void ForIn(CYOutput &out, CYFlags flags) const;
537 virtual const char *ForEachIn() const;
538 virtual CYExpression *ForEachIn(CYContext &out);
540 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
542 virtual void Output(CYOutput &out) const;
543 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
544 void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
546 virtual CYExpression *ClassName(CYContext &context, bool object);
547 virtual void ClassName(CYOutput &out, bool object) const;
549 virtual CYExpression *Replace(CYContext &context) = 0;
551 virtual CYExpression *Primitive(CYContext &context) {
555 virtual CYNumber *Number(CYContext &context) {
559 virtual CYString *String(CYContext &context) {
563 virtual const char *Word() const {
568 #define CYAlphabetic(value) \
569 virtual bool Alphabetic() const { \
573 #define CYPrecedence(value) \
574 static const unsigned Precedence_ = value; \
575 virtual unsigned Precedence() const { \
576 return Precedence_; \
579 #define CYRightHand(value) \
580 virtual bool RightHand() const { \
587 CYExpression *expressions_;
589 CYCompound(CYExpression *expressions = NULL) :
590 expressions_(expressions)
594 void AddPrev(CYExpression *expression) {
595 CYSetLast(expression, expressions_);
596 expressions_ = expression;
601 virtual CYExpression *Replace(CYContext &context);
602 void Output(CYOutput &out, CYFlags flags) const;
605 struct CYFunctionParameter :
606 CYNext<CYFunctionParameter>,
611 CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next = NULL) :
612 CYNext<CYFunctionParameter>(next),
617 virtual CYFunctionParameter *Replace(CYContext &context, CYBlock &code);
618 virtual void Output(CYOutput &out) const;
621 struct CYOptionalFunctionParameter :
624 CYExpression *initializer_;
626 CYOptionalFunctionParameter(CYIdentifier *name, CYExpression *initializer, CYFunctionParameter *next = NULL) :
627 CYFunctionParameter(name, next),
628 initializer_(initializer)
632 virtual CYFunctionParameter *Replace(CYContext &context, CYBlock &code);
633 virtual void Output(CYOutput &out) const;
636 struct CYComprehension :
637 CYNext<CYComprehension>,
640 virtual const char *Name() const = 0;
642 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
643 CYFunctionParameter *Parameters(CYContext &context) const;
644 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
645 virtual void Output(CYOutput &out) const = 0;
648 struct CYForInComprehension :
654 CYForInComprehension(CYIdentifier *name, CYExpression *set) :
660 virtual const char *Name() const {
661 return name_->Word();
664 virtual CYFunctionParameter *Parameter(CYContext &context) const;
665 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
666 virtual void Output(CYOutput &out) const;
669 struct CYForEachInComprehension :
675 CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
681 virtual const char *Name() const {
682 return name_->Word();
685 virtual CYFunctionParameter *Parameter(CYContext &context) const;
686 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
687 virtual void Output(CYOutput &out) const;
690 struct CYIfComprehension :
695 CYIfComprehension(CYExpression *test) :
700 virtual const char *Name() const {
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 CYArrayComprehension :
712 CYExpression *expression_;
713 CYComprehension *comprehensions_;
715 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
716 expression_(expression),
717 comprehensions_(comprehensions)
723 virtual CYExpression *Replace(CYContext &context);
724 virtual void Output(CYOutput &out, CYFlags flags) const;
737 virtual CYExpression *Replace(CYContext &context);
751 CYRange(uint64_t lo, uint64_t hi) :
756 bool operator [](uint8_t value) const {
757 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
760 void operator()(uint8_t value) {
763 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
767 extern CYRange DigitRange_;
768 extern CYRange WordStartRange_;
769 extern CYRange WordEndRange_;
784 CYString(const char *value) :
790 CYString(const char *value, size_t size) :
796 CYString(const CYWord *word) :
797 value_(word->Word()),
798 size_(strlen(value_))
802 const char *Value() const {
806 virtual const char *Word() const;
808 virtual CYNumber *Number(CYContext &context);
809 virtual CYString *String(CYContext &context);
811 CYString *Concat(CYContext &out, CYString *rhs) const;
812 virtual void Output(CYOutput &out, CYFlags flags) const;
813 virtual void PropertyName(CYOutput &out) const;
822 CYNumber(double value) :
827 double Value() const {
831 virtual CYNumber *Number(CYContext &context);
832 virtual CYString *String(CYContext &context);
834 virtual void Output(CYOutput &out, CYFlags flags) const;
835 virtual void PropertyName(CYOutput &out) const;
843 CYRegEx(const char *value) :
848 const char *Value() const {
852 virtual void Output(CYOutput &out, CYFlags flags) const;
864 virtual CYNumber *Number(CYContext &context);
865 virtual CYString *String(CYContext &context);
867 virtual void Output(CYOutput &out, CYFlags flags) const;
879 virtual CYExpression *Replace(CYContext &context);
880 virtual void Output(CYOutput &out, CYFlags flags) const;
886 virtual bool Value() const = 0;
887 virtual void Output(CYOutput &out, CYFlags flags) const;
899 virtual bool Value() const {
903 virtual CYNumber *Number(CYContext &context);
904 virtual CYString *String(CYContext &context);
916 virtual bool Value() const {
920 virtual CYNumber *Number(CYContext &context);
921 virtual CYString *String(CYContext &context);
929 CYVariable(CYIdentifier *name) :
934 CYVariable(const char *name) :
935 name_(new($pool) CYIdentifier(name))
942 virtual CYExpression *Replace(CYContext &context);
943 virtual void Output(CYOutput &out, CYFlags flags) const;
951 CYPrefix(CYExpression *rhs) :
956 virtual bool Alphabetic() const = 0;
957 virtual const char *Operator() const = 0;
961 virtual CYExpression *Replace(CYContext &context);
962 virtual void Output(CYOutput &out, CYFlags flags) const;
971 CYInfix(CYExpression *lhs, CYExpression *rhs) :
977 void SetLeft(CYExpression *lhs) {
981 virtual bool Alphabetic() const = 0;
982 virtual const char *Operator() const = 0;
984 virtual CYExpression *Replace(CYContext &context);
985 virtual void Output(CYOutput &out, CYFlags flags) const;
993 CYPostfix(CYExpression *lhs) :
998 virtual const char *Operator() const = 0;
1002 virtual CYExpression *Replace(CYContext &context);
1003 virtual void Output(CYOutput &out, CYFlags flags) const;
1006 struct CYAssignment :
1012 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
1018 void SetLeft(CYExpression *lhs) {
1022 virtual const char *Operator() const = 0;
1026 virtual CYExpression *Replace(CYContext &context);
1027 virtual void Output(CYOutput &out, CYFlags flags) const;
1035 CYExpression *value_;
1037 CYArgument(CYExpression *value, CYArgument *next = NULL) :
1038 CYNext<CYArgument>(next),
1044 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
1045 CYNext<CYArgument>(next),
1051 void Replace(CYContext &context);
1052 void Output(CYOutput &out) const;
1068 CYExpression *case_;
1069 CYStatement *statements_;
1071 CYClause(CYExpression *_case, CYStatement *statements) :
1073 statements_(statements)
1077 void Replace(CYContext &context);
1078 virtual void Output(CYOutput &out) const;
1085 CYExpression *value_;
1087 CYElement(CYExpression *value, CYElement *next) :
1088 CYNext<CYElement>(next),
1093 void Replace(CYContext &context);
1094 void Output(CYOutput &out) const;
1100 CYElement *elements_;
1102 CYArray(CYElement *elements = NULL) :
1107 virtual CYExpression *Replace(CYContext &context);
1108 virtual void Output(CYOutput &out, CYFlags flags) const;
1115 CYPropertyName *name_;
1116 CYExpression *value_;
1118 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1119 CYNext<CYProperty>(next),
1125 void Replace(CYContext &context);
1126 virtual void Output(CYOutput &out) const;
1129 struct CYDeclaration :
1132 CYIdentifier *identifier_;
1133 CYExpression *initialiser_;
1135 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
1136 identifier_(identifier),
1137 initialiser_(initialiser)
1141 virtual void ForIn(CYOutput &out, CYFlags flags) const;
1143 virtual const char *ForEachIn() const;
1144 virtual CYExpression *ForEachIn(CYContext &out);
1146 virtual CYExpression *Replace(CYContext &context);
1147 virtual CYAssignment *Assignment(CYContext &context);
1149 virtual void Output(CYOutput &out, CYFlags flags) const;
1152 struct CYDeclarations :
1153 CYNext<CYDeclarations>,
1157 CYDeclaration *declaration_;
1159 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1160 CYNext<CYDeclarations>(next),
1161 declaration_(declaration)
1165 virtual void For(CYOutput &out) const;
1167 virtual CYCompound *Replace(CYContext &context);
1168 CYProperty *Property(CYContext &context);
1170 virtual void Output(CYOutput &out) const;
1171 virtual void Output(CYOutput &out, CYFlags flags) const;
1177 CYDeclarations *declarations_;
1179 CYVar(CYDeclarations *declarations) :
1180 declarations_(declarations)
1184 virtual CYStatement *Replace(CYContext &context);
1185 virtual void Output(CYOutput &out, CYFlags flags) const;
1191 CYDeclarations *declarations_;
1194 CYLet(CYDeclarations *declarations, CYStatement *statements) :
1195 declarations_(declarations),
1200 virtual CYStatement *Replace(CYContext &context);
1201 virtual void Output(CYOutput &out, CYFlags flags) const;
1207 CYForInitialiser *initialiser_;
1208 CYExpression *test_;
1209 CYExpression *increment_;
1212 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1213 initialiser_(initialiser),
1215 increment_(increment),
1220 virtual CYStatement *Replace(CYContext &context);
1221 virtual void Output(CYOutput &out, CYFlags flags) const;
1227 CYForInInitialiser *initialiser_;
1231 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1232 initialiser_(initialiser),
1238 virtual CYStatement *Replace(CYContext &context);
1239 virtual void Output(CYOutput &out, CYFlags flags) const;
1242 struct CYForEachIn :
1245 CYForInInitialiser *initialiser_;
1249 CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1250 initialiser_(initialiser),
1256 virtual CYStatement *Replace(CYContext &context);
1257 virtual void Output(CYOutput &out, CYFlags flags) const;
1263 CYProperty *properties_;
1265 CYObject(CYProperty *properties = NULL) :
1266 properties_(properties)
1270 virtual CYExpression *Replace(CYContext &context);
1271 void Output(CYOutput &out, CYFlags flags) const;
1277 CYExpression *object_;
1278 CYExpression *property_;
1280 CYMember(CYExpression *object, CYExpression *property) :
1286 void SetLeft(CYExpression *object) {
1290 void Replace_(CYContext &context);
1293 struct CYDirectMember :
1296 CYDirectMember(CYExpression *object, CYExpression *property) :
1297 CYMember(object, property)
1304 virtual CYExpression *Replace(CYContext &context);
1305 virtual void Output(CYOutput &out, CYFlags flags) const;
1308 struct CYIndirectMember :
1311 CYIndirectMember(CYExpression *object, CYExpression *property) :
1312 CYMember(object, property)
1319 virtual CYExpression *Replace(CYContext &context);
1320 virtual void Output(CYOutput &out, CYFlags flags) const;
1329 CYExpression *constructor_;
1330 CYArgument *arguments_;
1332 New(CYExpression *constructor, CYArgument *arguments) :
1333 constructor_(constructor),
1334 arguments_(arguments)
1338 virtual unsigned Precedence() const {
1339 return arguments_ == NULL ? 2 : 1;
1344 virtual CYExpression *Replace(CYContext &context);
1345 virtual void Output(CYOutput &out, CYFlags flags) const;
1347 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1355 CYExpression *function_;
1356 CYArgument *arguments_;
1358 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1359 function_(function),
1360 arguments_(arguments)
1367 virtual CYExpression *Replace(CYContext &context);
1368 virtual void Output(CYOutput &out, CYFlags flags) const;
1370 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1375 struct CYRubyBlock :
1378 CYExpression *call_;
1381 CYRubyBlock(CYExpression *call, CYRubyProc *proc) :
1390 virtual CYExpression *Replace(CYContext &context);
1391 virtual void Output(CYOutput &out, CYFlags flags) const;
1397 CYExpression *test_;
1399 CYStatement *false_;
1401 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1408 virtual CYStatement *Replace(CYContext &context);
1409 virtual void Output(CYOutput &out, CYFlags flags) const;
1415 CYExpression *test_;
1418 CYDoWhile(CYExpression *test, CYStatement *code) :
1424 virtual CYStatement *Replace(CYContext &context);
1425 virtual void Output(CYOutput &out, CYFlags flags) const;
1431 CYExpression *test_;
1434 CYWhile(CYExpression *test, CYStatement *code) :
1440 virtual CYStatement *Replace(CYContext &context);
1441 virtual void Output(CYOutput &out, CYFlags flags) const;
1444 // XXX: this should be split up into CYAnonymousFunction and CYNamedFunction (subclass)
1446 CYIdentifier *name_;
1447 CYFunctionParameter *parameters_;
1449 CYNonLocal *nonlocal_;
1451 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1453 parameters_(parameters),
1459 virtual ~CYFunction() {
1462 void Inject(CYContext &context);
1463 virtual void Replace_(CYContext &context, bool outer);
1464 virtual void Output(CYOutput &out, CYFlags flags) const;
1467 // XXX: this should be split up into CYAnonymousFunctionExpression and CYNamedFunctionExpression
1468 struct CYFunctionExpression :
1472 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1473 CYFunction(name, parameters, statements)
1480 virtual CYExpression *Replace(CYContext &context);
1481 virtual void Output(CYOutput &out, CYFlags flags) const;
1484 // XXX: this should derive from CYAnonymousFunctionExpression
1486 CYFunctionExpression
1488 CYRubyProc(CYFunctionParameter *parameters, CYStatement *statements) :
1489 CYFunctionExpression(NULL, parameters, statements)
1493 virtual CYExpression *Replace(CYContext &context);
1494 virtual void Output(CYOutput &out, CYFlags flags) const;
1497 // XXX: this should derive from CYNamedFunction
1498 struct CYFunctionStatement :
1502 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1503 CYFunction(name, parameters, statements)
1507 virtual CYStatement *Replace(CYContext &context);
1508 virtual void Output(CYOutput &out, CYFlags flags) const;
1514 CYExpression *expression_;
1516 CYExpress(CYExpression *expression) :
1517 expression_(expression)
1519 if (expression == NULL)
1523 virtual CYStatement *Collapse(CYContext &context);
1524 virtual CYStatement *Replace(CYContext &context);
1525 virtual void Output(CYOutput &out, CYFlags flags) const;
1531 CYIdentifier *label_;
1533 CYContinue(CYIdentifier *label) :
1538 virtual CYStatement *Replace(CYContext &context);
1539 virtual void Output(CYOutput &out, CYFlags flags) const;
1545 CYIdentifier *label_;
1547 CYBreak(CYIdentifier *label) :
1552 virtual CYStatement *Replace(CYContext &context);
1553 virtual void Output(CYOutput &out, CYFlags flags) const;
1559 CYExpression *value_;
1561 CYReturn(CYExpression *value) :
1566 virtual CYStatement *Replace(CYContext &context);
1567 virtual void Output(CYOutput &out, CYFlags flags) const;
1573 virtual CYStatement *Collapse(CYContext &context);
1574 virtual CYStatement *Replace(CYContext &context);
1575 virtual void Output(CYOutput &out, CYFlags flags) const;
1583 CYFinally(CYStatement *statements) :
1588 void Replace(CYContext &context);
1589 virtual void Output(CYOutput &out) const;
1598 CYIdentifier *name_;
1601 Catch(CYIdentifier *name, CYStatement *statements) :
1607 void Replace(CYContext &context);
1608 virtual void Output(CYOutput &out) const;
1616 CYFinally *finally_;
1618 Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
1625 virtual CYStatement *Replace(CYContext &context);
1626 virtual void Output(CYOutput &out, CYFlags flags) const;
1632 CYExpression *value_;
1634 Throw(CYExpression *value = NULL) :
1639 virtual CYStatement *Replace(CYContext &context);
1640 virtual void Output(CYOutput &out, CYFlags flags) const;
1648 CYExpression *scope_;
1651 CYWith(CYExpression *scope, CYStatement *code) :
1657 virtual CYStatement *Replace(CYContext &context);
1658 virtual void Output(CYOutput &out, CYFlags flags) const;
1664 CYExpression *value_;
1667 CYSwitch(CYExpression *value, CYClause *clauses) :
1673 virtual CYStatement *Replace(CYContext &context);
1674 virtual void Output(CYOutput &out, CYFlags flags) const;
1677 struct CYCondition :
1680 CYExpression *test_;
1681 CYExpression *true_;
1682 CYExpression *false_;
1684 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
1693 virtual CYExpression *Replace(CYContext &context);
1694 virtual void Output(CYOutput &out, CYFlags flags) const;
1697 struct CYAddressOf :
1700 CYAddressOf(CYExpression *rhs) :
1705 virtual const char *Operator() const {
1711 virtual CYExpression *Replace(CYContext &context);
1717 CYIndirect(CYExpression *rhs) :
1722 virtual const char *Operator() const {
1728 virtual CYExpression *Replace(CYContext &context);
1732 virtual CYExpression *Replace(CYContext &context);
1734 #define CYPostfix_(op, name, args...) \
1735 struct CY ## name : \
1738 CY ## name(CYExpression *lhs) : \
1743 virtual const char *Operator() const { \
1748 #define CYPrefix_(alphabetic, op, name, args...) \
1749 struct CY ## name : \
1752 CY ## name(CYExpression *rhs) : \
1757 CYAlphabetic(alphabetic) \
1759 virtual const char *Operator() const { \
1764 #define CYInfix_(alphabetic, precedence, op, name, args...) \
1765 struct CY ## name : \
1768 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
1773 CYAlphabetic(alphabetic) \
1774 CYPrecedence(precedence) \
1776 virtual const char *Operator() const { \
1781 #define CYAssignment_(op, name, args...) \
1782 struct CY ## name ## Assign : \
1785 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
1786 CYAssignment(lhs, rhs) \
1790 virtual const char *Operator() const { \
1795 CYPostfix_("++", PostIncrement)
1796 CYPostfix_("--", PostDecrement)
1798 CYPrefix_(true, "delete", Delete)
1799 CYPrefix_(true, "void", Void)
1800 CYPrefix_(true, "typeof", TypeOf)
1801 CYPrefix_(false, "++", PreIncrement)
1802 CYPrefix_(false, "--", PreDecrement)
1803 CYPrefix_(false, "+", Affirm)
1804 CYPrefix_(false, "-", Negate)
1805 CYPrefix_(false, "~", BitwiseNot)
1806 CYPrefix_(false, "!", LogicalNot)
1808 CYInfix_(false, 5, "*", Multiply)
1809 CYInfix_(false, 5, "/", Divide)
1810 CYInfix_(false, 5, "%", Modulus)
1811 CYInfix_(false, 6, "+", Add, CYReplace)
1812 CYInfix_(false, 6, "-", Subtract)
1813 CYInfix_(false, 7, "<<", ShiftLeft)
1814 CYInfix_(false, 7, ">>", ShiftRightSigned)
1815 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
1816 CYInfix_(false, 8, "<", Less)
1817 CYInfix_(false, 8, ">", Greater)
1818 CYInfix_(false, 8, "<=", LessOrEqual)
1819 CYInfix_(false, 8, ">=", GreaterOrEqual)
1820 CYInfix_(true, 8, "instanceof", InstanceOf)
1821 CYInfix_(true, 8, "in", In)
1822 CYInfix_(false, 9, "==", Equal)
1823 CYInfix_(false, 9, "!=", NotEqual)
1824 CYInfix_(false, 9, "===", Identical)
1825 CYInfix_(false, 9, "!==", NotIdentical)
1826 CYInfix_(false, 10, "&", BitwiseAnd)
1827 CYInfix_(false, 11, "^", BitwiseXOr)
1828 CYInfix_(false, 12, "|", BitwiseOr)
1829 CYInfix_(false, 13, "&&", LogicalAnd)
1830 CYInfix_(false, 14, "||", LogicalOr)
1832 CYAssignment_("=", )
1833 CYAssignment_("*=", Multiply)
1834 CYAssignment_("/=", Divide)
1835 CYAssignment_("%=", Modulus)
1836 CYAssignment_("+=", Add)
1837 CYAssignment_("-=", Subtract)
1838 CYAssignment_("<<=", ShiftLeft)
1839 CYAssignment_(">>=", ShiftRightSigned)
1840 CYAssignment_(">>>=", ShiftRightUnsigned)
1841 CYAssignment_("&=", BitwiseAnd)
1842 CYAssignment_("^=", BitwiseXOr)
1843 CYAssignment_("|=", BitwiseOr)
1845 #endif/*CYCRIPT_PARSER_HPP*/