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() {
111 CYNoBrace = (1 << 0),
112 CYNoFunction = (1 << 1),
115 CYNoRightHand = (1 << 4),
116 CYNoDangle = (1 << 5),
117 CYNoInteger = (1 << 6),
118 CYNoBF = (CYNoBrace | CYNoFunction),
121 _finline CYFlags operator ~(CYFlags rhs) {
122 return static_cast<CYFlags>(~static_cast<unsigned>(rhs));
125 _finline CYFlags operator &(CYFlags lhs, CYFlags rhs) {
126 return static_cast<CYFlags>(static_cast<unsigned>(lhs) & static_cast<unsigned>(rhs));
129 _finline CYFlags operator |(CYFlags lhs, CYFlags rhs) {
130 return static_cast<CYFlags>(static_cast<unsigned>(lhs) | static_cast<unsigned>(rhs));
133 _finline CYFlags &operator |=(CYFlags &lhs, CYFlags rhs) {
134 return lhs = lhs | rhs;
137 _finline CYFlags CYLeft(CYFlags flags) {
138 return flags & ~(CYNoDangle | CYNoInteger);
141 _finline CYFlags CYRight(CYFlags flags) {
142 return flags & ~CYNoBF;
145 _finline CYFlags CYCenter(CYFlags flags) {
146 return CYLeft(CYRight(flags));
152 virtual ~CYStatement() {
155 void Single(CYOutput &out, CYFlags flags) const;
156 void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
158 virtual CYStatement *Replace(CYContext &context) = 0;
161 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
164 struct CYStatements {
174 operator CYStatement *() const {
178 CYStatements &operator ->*(CYStatement *next) {
180 if (first_ == NULL) {
183 } else for (;; last_ = last_->next_)
184 if (last_->next_ == NULL) {
194 virtual ~CYClassName() {
197 virtual CYExpression *ClassName(CYContext &context, bool object) = 0;
198 virtual void ClassName(CYOutput &out, bool object) const = 0;
208 CYWord(const char *word) :
213 void Set(const char *value) {
217 virtual const char *Word() const;
218 virtual void Output(CYOutput &out) const;
220 virtual CYExpression *ClassName(CYContext &context, bool object);
221 virtual void ClassName(CYOutput &out, bool object) const;
222 virtual void PropertyName(CYOutput &out) const;
225 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
227 return lhs << rhs.Word();
230 struct CYIdentifier :
231 CYNext<CYIdentifier>,
234 CYIdentifier *replace_;
238 CYIdentifier(const char *word) :
246 virtual const char *Word() const;
247 CYIdentifier *Replace(CYContext &context);
255 CYComment(const char *value) :
260 virtual CYStatement *Replace(CYContext &context);
261 virtual void Output(CYOutput &out, CYFlags flags) const;
268 CYStatement *statement_;
270 CYLabel(CYIdentifier *name, CYStatement *statement) :
272 statement_(statement)
276 virtual CYStatement *Replace(CYContext &context);
277 virtual void Output(CYOutput &out, CYFlags flags) const;
280 struct CYCStringLess :
281 std::binary_function<const char *, const char *, bool>
283 _finline bool operator ()(const char *lhs, const char *rhs) const {
284 return strcmp(lhs, rhs) < 0;
288 struct CYIdentifierValueLess :
289 std::binary_function<CYIdentifier *, CYIdentifier *, bool>
291 _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
292 return CYCStringLess()(lhs->Word(), rhs->Word());
296 enum CYIdentifierFlags {
297 CYIdentifierArgument,
298 CYIdentifierVariable,
304 typedef std::set<const char *, CYCStringLess> CYCStringSet;
305 typedef std::set<CYIdentifier *, CYIdentifierValueLess> CYIdentifierValueSet;
306 typedef std::map<CYIdentifier *, CYIdentifierFlags> CYIdentifierAddressFlagsMap;
308 struct CYIdentifierUsage {
309 CYIdentifier *identifier_;
313 typedef std::vector<CYIdentifierUsage> CYIdentifierUsageVector;
319 CYStatement *&statements_;
323 CYIdentifierAddressFlagsMap internal_;
324 CYIdentifierValueSet identifiers_;
326 CYScope(bool transparent, 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 ReplaceAll(Type_ *&values) {
377 Type_ **last(&values);
378 CYForEach (next, values) {
379 Replace(*last = next);
381 last = &(*last)->next_;
385 template <typename Type_>
386 void Replace(Type_ *&value) {
387 for (;;) if (value == NULL)
390 Type_ *replace(value->Replace(*this));
391 if (replace != value)
397 void NonLocal(CYStatement *&statements);
398 CYIdentifier *Unique();
402 CYIdentifier *identifier_;
409 CYIdentifier *Target(CYContext &context) {
410 if (identifier_ == NULL)
411 identifier_ = context.Unique();
420 CYStatement *statements_;
422 CYBlock(CYStatement *statements) :
423 statements_(statements)
427 operator CYStatement *() const {
431 void AddPrev(CYStatement *statement) {
432 CYSetLast(statement, statements_);
433 statements_ = statement;
436 virtual CYStatement *Replace(CYContext &context);
438 virtual void Output(CYOutput &out) const;
439 virtual void Output(CYOutput &out, CYFlags flags) const;
465 std::string filename_;
469 cy::location location_;
470 std::string message_;
473 typedef std::vector<Error> Errors;
481 CYExpression *context_;
483 Context(CYExpression *context) :
488 typedef std::vector<CYWord *> Words;
492 typedef std::vector<Context> Contexts;
495 CYExpression *context_;
507 void ScannerDestroy();
510 CYDriver(const std::string &filename = "");
513 Condition GetCondition();
514 void SetCondition(Condition condition);
516 void PushCondition(Condition condition);
519 void Warning(const cy::location &location, const char *message);
522 struct CYForInitialiser {
523 virtual ~CYForInitialiser() {
526 virtual CYExpression *Replace(CYContext &context) = 0;
527 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
530 struct CYForInInitialiser {
531 virtual ~CYForInInitialiser() {
534 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
535 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value) = 0;
537 virtual CYExpression *Replace(CYContext &context) = 0;
538 virtual CYAssignment *Assignment(CYContext &context) = 0;
544 struct CYExpression :
545 CYNext<CYExpression>,
551 virtual unsigned Precedence() const = 0;
553 virtual bool RightHand() const {
557 virtual void ForIn(CYOutput &out, CYFlags flags) const;
558 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
560 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
562 virtual void Output(CYOutput &out) const;
563 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
564 void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
566 virtual CYExpression *ClassName(CYContext &context, bool object);
567 virtual void ClassName(CYOutput &out, bool object) const;
569 virtual CYExpression *Replace(CYContext &context) = 0;
570 virtual CYAssignment *Assignment(CYContext &context);
572 virtual CYExpression *Primitive(CYContext &context) {
576 virtual CYNumber *Number(CYContext &context) {
580 virtual CYString *String(CYContext &context) {
584 virtual const char *Word() const {
589 #define CYAlphabetic(value) \
590 virtual bool Alphabetic() const { \
594 #define CYPrecedence(value) \
595 static const unsigned Precedence_ = value; \
596 virtual unsigned Precedence() const { \
597 return Precedence_; \
600 #define CYRightHand(value) \
601 virtual bool RightHand() const { \
608 CYExpression *expressions_;
610 CYCompound(CYExpression *expressions = NULL) :
611 expressions_(expressions)
615 void AddPrev(CYExpression *expression) {
616 CYSetLast(expression, expressions_);
617 expressions_ = expression;
622 virtual CYExpression *Replace(CYContext &context);
623 void Output(CYOutput &out, CYFlags flags) const;
626 struct CYFunctionParameter :
627 CYNext<CYFunctionParameter>,
632 CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next = NULL) :
633 CYNext<CYFunctionParameter>(next),
638 virtual CYFunctionParameter *Replace(CYContext &context, CYBlock &code);
639 virtual void Output(CYOutput &out) const;
642 struct CYOptionalFunctionParameter :
645 CYExpression *initializer_;
647 CYOptionalFunctionParameter(CYIdentifier *name, CYExpression *initializer, CYFunctionParameter *next = NULL) :
648 CYFunctionParameter(name, next),
649 initializer_(initializer)
653 virtual CYFunctionParameter *Replace(CYContext &context, CYBlock &code);
654 virtual void Output(CYOutput &out) const;
657 struct CYComprehension :
658 CYNext<CYComprehension>,
661 virtual const char *Name() const = 0;
663 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
664 CYFunctionParameter *Parameters(CYContext &context) const;
665 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
666 virtual void Output(CYOutput &out) const = 0;
669 struct CYForInComprehension :
675 CYForInComprehension(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 CYForEachInComprehension :
696 CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
702 virtual const char *Name() const {
703 return name_->Word();
706 virtual CYFunctionParameter *Parameter(CYContext &context) const;
707 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
708 virtual void Output(CYOutput &out) const;
711 struct CYIfComprehension :
716 CYIfComprehension(CYExpression *test) :
721 virtual const char *Name() const {
725 virtual CYFunctionParameter *Parameter(CYContext &context) const;
726 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
727 virtual void Output(CYOutput &out) const;
730 struct CYArrayComprehension :
733 CYExpression *expression_;
734 CYComprehension *comprehensions_;
736 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
737 expression_(expression),
738 comprehensions_(comprehensions)
744 virtual CYExpression *Replace(CYContext &context);
745 virtual void Output(CYOutput &out, CYFlags flags) const;
758 virtual CYExpression *Replace(CYContext &context);
772 CYRange(uint64_t lo, uint64_t hi) :
777 bool operator [](uint8_t value) const {
778 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
781 void operator()(uint8_t value) {
784 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
788 extern CYRange DigitRange_;
789 extern CYRange WordStartRange_;
790 extern CYRange WordEndRange_;
805 CYString(const char *value) :
811 CYString(const char *value, size_t size) :
817 CYString(const CYWord *word) :
818 value_(word->Word()),
819 size_(strlen(value_))
823 const char *Value() const {
827 virtual const char *Word() const;
829 virtual CYNumber *Number(CYContext &context);
830 virtual CYString *String(CYContext &context);
832 CYString *Concat(CYContext &out, CYString *rhs) const;
833 virtual void Output(CYOutput &out, CYFlags flags) const;
834 virtual void PropertyName(CYOutput &out) const;
843 CYNumber(double value) :
848 double Value() const {
852 virtual CYNumber *Number(CYContext &context);
853 virtual CYString *String(CYContext &context);
855 virtual void Output(CYOutput &out, CYFlags flags) const;
856 virtual void PropertyName(CYOutput &out) const;
864 CYRegEx(const char *value) :
869 const char *Value() const {
873 virtual void Output(CYOutput &out, CYFlags flags) const;
885 virtual CYNumber *Number(CYContext &context);
886 virtual CYString *String(CYContext &context);
888 virtual void Output(CYOutput &out, CYFlags flags) const;
900 virtual CYExpression *Replace(CYContext &context);
901 virtual void Output(CYOutput &out, CYFlags flags) const;
907 virtual bool Value() const = 0;
908 virtual void Output(CYOutput &out, CYFlags flags) const;
920 virtual bool Value() const {
924 virtual CYNumber *Number(CYContext &context);
925 virtual CYString *String(CYContext &context);
937 virtual bool Value() const {
941 virtual CYNumber *Number(CYContext &context);
942 virtual CYString *String(CYContext &context);
950 CYVariable(CYIdentifier *name) :
955 CYVariable(const char *name) :
956 name_(new($pool) CYIdentifier(name))
963 virtual CYExpression *Replace(CYContext &context);
964 virtual void Output(CYOutput &out, CYFlags flags) const;
972 CYPrefix(CYExpression *rhs) :
977 virtual bool Alphabetic() const = 0;
978 virtual const char *Operator() const = 0;
982 virtual CYExpression *Replace(CYContext &context);
983 virtual void Output(CYOutput &out, CYFlags flags) const;
992 CYInfix(CYExpression *lhs, CYExpression *rhs) :
998 void SetLeft(CYExpression *lhs) {
1002 virtual bool Alphabetic() const = 0;
1003 virtual const char *Operator() const = 0;
1005 virtual CYExpression *Replace(CYContext &context);
1006 virtual void Output(CYOutput &out, CYFlags flags) const;
1014 CYPostfix(CYExpression *lhs) :
1019 virtual const char *Operator() const = 0;
1023 virtual CYExpression *Replace(CYContext &context);
1024 virtual void Output(CYOutput &out, CYFlags flags) const;
1027 struct CYAssignment :
1033 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
1039 void SetLeft(CYExpression *lhs) {
1043 virtual const char *Operator() const = 0;
1047 virtual CYExpression *Replace(CYContext &context);
1048 virtual void Output(CYOutput &out, CYFlags flags) const;
1056 CYExpression *value_;
1058 CYArgument(CYExpression *value, CYArgument *next = NULL) :
1059 CYNext<CYArgument>(next),
1065 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
1066 CYNext<CYArgument>(next),
1072 CYArgument *Replace(CYContext &context);
1073 void Output(CYOutput &out) const;
1089 CYExpression *case_;
1090 CYStatement *statements_;
1092 CYClause(CYExpression *_case, CYStatement *statements) :
1094 statements_(statements)
1098 void Replace(CYContext &context);
1099 virtual void Output(CYOutput &out) const;
1106 CYExpression *value_;
1108 CYElement(CYExpression *value, CYElement *next) :
1109 CYNext<CYElement>(next),
1114 void Replace(CYContext &context);
1115 void Output(CYOutput &out) const;
1121 CYElement *elements_;
1123 CYArray(CYElement *elements = NULL) :
1128 virtual CYExpression *Replace(CYContext &context);
1129 virtual void Output(CYOutput &out, CYFlags flags) const;
1136 CYPropertyName *name_;
1137 CYExpression *value_;
1139 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1140 CYNext<CYProperty>(next),
1146 void Replace(CYContext &context);
1147 virtual void Output(CYOutput &out) const;
1150 struct CYDeclaration :
1153 CYIdentifier *identifier_;
1154 CYExpression *initialiser_;
1156 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
1157 identifier_(identifier),
1158 initialiser_(initialiser)
1162 virtual void ForIn(CYOutput &out, CYFlags flags) const;
1163 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
1165 virtual CYExpression *Replace(CYContext &context);
1167 virtual CYAssignment *Assignment(CYContext &context);
1168 CYVariable *Variable(CYContext &context);
1170 virtual void Output(CYOutput &out, CYFlags flags) const;
1173 struct CYDeclarations :
1174 CYNext<CYDeclarations>,
1177 CYDeclaration *declaration_;
1179 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1180 CYNext<CYDeclarations>(next),
1181 declaration_(declaration)
1185 void Replace(CYContext &context);
1187 CYCompound *Compound(CYContext &context);
1188 CYProperty *Property(CYContext &context);
1189 CYArgument *Argument(CYContext &context);
1190 CYFunctionParameter *Parameter(CYContext &context);
1192 virtual void Output(CYOutput &out) const;
1193 virtual void Output(CYOutput &out, CYFlags flags) const;
1196 struct CYForDeclarations :
1199 CYDeclarations *declarations_;
1201 CYForDeclarations(CYDeclarations *declarations) :
1202 declarations_(declarations)
1206 virtual CYCompound *Replace(CYContext &context);
1207 virtual void Output(CYOutput &out, CYFlags flags) const;
1213 CYDeclarations *declarations_;
1215 CYVar(CYDeclarations *declarations) :
1216 declarations_(declarations)
1220 virtual CYStatement *Replace(CYContext &context);
1221 virtual void Output(CYOutput &out, CYFlags flags) const;
1227 CYDeclarations *declarations_;
1230 CYLet(CYDeclarations *declarations, CYStatement *code) :
1231 declarations_(declarations),
1236 virtual CYStatement *Replace(CYContext &context);
1237 virtual void Output(CYOutput &out, CYFlags flags) const;
1243 CYForInitialiser *initialiser_;
1244 CYExpression *test_;
1245 CYExpression *increment_;
1248 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1249 initialiser_(initialiser),
1251 increment_(increment),
1256 virtual CYStatement *Replace(CYContext &context);
1257 virtual void Output(CYOutput &out, CYFlags flags) const;
1263 CYForInInitialiser *initialiser_;
1267 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1268 initialiser_(initialiser),
1274 virtual CYStatement *Replace(CYContext &context);
1275 virtual void Output(CYOutput &out, CYFlags flags) const;
1278 struct CYForEachIn :
1281 CYForInInitialiser *initialiser_;
1285 CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1286 initialiser_(initialiser),
1292 virtual CYStatement *Replace(CYContext &context);
1293 virtual void Output(CYOutput &out, CYFlags flags) const;
1299 CYProperty *properties_;
1301 CYObject(CYProperty *properties = NULL) :
1302 properties_(properties)
1306 virtual CYExpression *Replace(CYContext &context);
1307 void Output(CYOutput &out, CYFlags flags) const;
1313 CYExpression *object_;
1314 CYExpression *property_;
1316 CYMember(CYExpression *object, CYExpression *property) :
1322 void SetLeft(CYExpression *object) {
1327 struct CYDirectMember :
1330 CYDirectMember(CYExpression *object, CYExpression *property) :
1331 CYMember(object, property)
1338 virtual CYExpression *Replace(CYContext &context);
1339 virtual void Output(CYOutput &out, CYFlags flags) const;
1342 struct CYIndirectMember :
1345 CYIndirectMember(CYExpression *object, CYExpression *property) :
1346 CYMember(object, property)
1353 virtual CYExpression *Replace(CYContext &context);
1354 virtual void Output(CYOutput &out, CYFlags flags) const;
1363 CYExpression *constructor_;
1364 CYArgument *arguments_;
1366 New(CYExpression *constructor, CYArgument *arguments) :
1367 constructor_(constructor),
1368 arguments_(arguments)
1372 virtual unsigned Precedence() const {
1373 return arguments_ == NULL ? 2 : 1;
1378 virtual CYExpression *Replace(CYContext &context);
1379 virtual void Output(CYOutput &out, CYFlags flags) const;
1381 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1389 CYExpression *function_;
1390 CYArgument *arguments_;
1392 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1393 function_(function),
1394 arguments_(arguments)
1401 virtual CYExpression *Replace(CYContext &context);
1402 virtual void Output(CYOutput &out, CYFlags flags) const;
1404 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1409 struct CYRubyBlock :
1412 CYExpression *call_;
1415 CYRubyBlock(CYExpression *call, CYRubyProc *proc) :
1424 virtual CYExpression *Replace(CYContext &context);
1425 virtual void Output(CYOutput &out, CYFlags flags) const;
1431 CYExpression *test_;
1433 CYStatement *false_;
1435 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1442 virtual CYStatement *Replace(CYContext &context);
1443 virtual void Output(CYOutput &out, CYFlags flags) const;
1449 CYExpression *test_;
1452 CYDoWhile(CYExpression *test, CYStatement *code) :
1458 virtual CYStatement *Replace(CYContext &context);
1459 virtual void Output(CYOutput &out, CYFlags flags) const;
1465 CYExpression *test_;
1468 CYWhile(CYExpression *test, CYStatement *code) :
1474 virtual CYStatement *Replace(CYContext &context);
1475 virtual void Output(CYOutput &out, CYFlags flags) const;
1478 // XXX: this should be split up into CYAnonymousFunction and CYNamedFunction (subclass)
1480 CYIdentifier *name_;
1481 CYFunctionParameter *parameters_;
1483 CYNonLocal *nonlocal_;
1485 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1487 parameters_(parameters),
1493 virtual ~CYFunction() {
1496 void Inject(CYContext &context);
1497 virtual void Replace_(CYContext &context, bool outer);
1498 virtual void Output(CYOutput &out, CYFlags flags) const;
1501 // XXX: this should be split up into CYAnonymousFunctionExpression and CYNamedFunctionExpression
1502 struct CYFunctionExpression :
1506 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1507 CYFunction(name, parameters, statements)
1514 virtual CYExpression *Replace(CYContext &context);
1515 virtual void Output(CYOutput &out, CYFlags flags) const;
1518 // XXX: this should derive from CYAnonymousFunctionExpression
1520 CYFunctionExpression
1522 CYRubyProc(CYFunctionParameter *parameters, CYStatement *statements) :
1523 CYFunctionExpression(NULL, parameters, statements)
1527 virtual CYExpression *Replace(CYContext &context);
1528 virtual void Output(CYOutput &out, CYFlags flags) const;
1531 // XXX: this should derive from CYNamedFunction
1532 struct CYFunctionStatement :
1536 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1537 CYFunction(name, parameters, statements)
1541 virtual CYStatement *Replace(CYContext &context);
1542 virtual void Output(CYOutput &out, CYFlags flags) const;
1548 CYExpression *expression_;
1550 CYExpress(CYExpression *expression) :
1551 expression_(expression)
1553 if (expression == NULL)
1557 virtual CYStatement *Replace(CYContext &context);
1558 virtual void Output(CYOutput &out, CYFlags flags) const;
1564 CYIdentifier *label_;
1566 CYContinue(CYIdentifier *label) :
1571 virtual CYStatement *Replace(CYContext &context);
1572 virtual void Output(CYOutput &out, CYFlags flags) const;
1578 CYIdentifier *label_;
1580 CYBreak(CYIdentifier *label) :
1585 virtual CYStatement *Replace(CYContext &context);
1586 virtual void Output(CYOutput &out, CYFlags flags) const;
1592 CYExpression *value_;
1594 CYReturn(CYExpression *value) :
1599 virtual CYStatement *Replace(CYContext &context);
1600 virtual void Output(CYOutput &out, CYFlags flags) const;
1606 virtual CYStatement *Replace(CYContext &context);
1607 virtual void Output(CYOutput &out, CYFlags flags) const;
1615 CYFinally(CYStatement *statements) :
1620 void Replace(CYContext &context);
1621 virtual void Output(CYOutput &out) const;
1630 CYIdentifier *name_;
1633 Catch(CYIdentifier *name, CYStatement *statements) :
1639 void Replace(CYContext &context);
1640 virtual void Output(CYOutput &out) const;
1648 CYFinally *finally_;
1650 Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
1657 virtual CYStatement *Replace(CYContext &context);
1658 virtual void Output(CYOutput &out, CYFlags flags) const;
1664 CYExpression *value_;
1666 Throw(CYExpression *value = NULL) :
1671 virtual CYStatement *Replace(CYContext &context);
1672 virtual void Output(CYOutput &out, CYFlags flags) const;
1680 CYExpression *scope_;
1683 CYWith(CYExpression *scope, CYStatement *code) :
1689 virtual CYStatement *Replace(CYContext &context);
1690 virtual void Output(CYOutput &out, CYFlags flags) const;
1696 CYExpression *value_;
1699 CYSwitch(CYExpression *value, CYClause *clauses) :
1705 virtual CYStatement *Replace(CYContext &context);
1706 virtual void Output(CYOutput &out, CYFlags flags) const;
1709 struct CYCondition :
1712 CYExpression *test_;
1713 CYExpression *true_;
1714 CYExpression *false_;
1716 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
1725 virtual CYExpression *Replace(CYContext &context);
1726 virtual void Output(CYOutput &out, CYFlags flags) const;
1729 struct CYAddressOf :
1732 CYAddressOf(CYExpression *rhs) :
1737 virtual const char *Operator() const {
1743 virtual CYExpression *Replace(CYContext &context);
1749 CYIndirect(CYExpression *rhs) :
1754 virtual const char *Operator() const {
1760 virtual CYExpression *Replace(CYContext &context);
1764 virtual CYExpression *Replace(CYContext &context);
1766 #define CYPostfix_(op, name, args...) \
1767 struct CY ## name : \
1770 CY ## name(CYExpression *lhs) : \
1775 virtual const char *Operator() const { \
1780 #define CYPrefix_(alphabetic, op, name, args...) \
1781 struct CY ## name : \
1784 CY ## name(CYExpression *rhs) : \
1789 CYAlphabetic(alphabetic) \
1791 virtual const char *Operator() const { \
1796 #define CYInfix_(alphabetic, precedence, op, name, args...) \
1797 struct CY ## name : \
1800 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
1805 CYAlphabetic(alphabetic) \
1806 CYPrecedence(precedence) \
1808 virtual const char *Operator() const { \
1813 #define CYAssignment_(op, name, args...) \
1814 struct CY ## name ## Assign : \
1817 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
1818 CYAssignment(lhs, rhs) \
1822 virtual const char *Operator() const { \
1827 CYPostfix_("++", PostIncrement)
1828 CYPostfix_("--", PostDecrement)
1830 CYPrefix_(true, "delete", Delete)
1831 CYPrefix_(true, "void", Void)
1832 CYPrefix_(true, "typeof", TypeOf)
1833 CYPrefix_(false, "++", PreIncrement)
1834 CYPrefix_(false, "--", PreDecrement)
1835 CYPrefix_(false, "+", Affirm)
1836 CYPrefix_(false, "-", Negate)
1837 CYPrefix_(false, "~", BitwiseNot)
1838 CYPrefix_(false, "!", LogicalNot)
1840 CYInfix_(false, 5, "*", Multiply)
1841 CYInfix_(false, 5, "/", Divide)
1842 CYInfix_(false, 5, "%", Modulus)
1843 CYInfix_(false, 6, "+", Add, CYReplace)
1844 CYInfix_(false, 6, "-", Subtract)
1845 CYInfix_(false, 7, "<<", ShiftLeft)
1846 CYInfix_(false, 7, ">>", ShiftRightSigned)
1847 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
1848 CYInfix_(false, 8, "<", Less)
1849 CYInfix_(false, 8, ">", Greater)
1850 CYInfix_(false, 8, "<=", LessOrEqual)
1851 CYInfix_(false, 8, ">=", GreaterOrEqual)
1852 CYInfix_(true, 8, "instanceof", InstanceOf)
1853 CYInfix_(true, 8, "in", In)
1854 CYInfix_(false, 9, "==", Equal)
1855 CYInfix_(false, 9, "!=", NotEqual)
1856 CYInfix_(false, 9, "===", Identical)
1857 CYInfix_(false, 9, "!==", NotIdentical)
1858 CYInfix_(false, 10, "&", BitwiseAnd)
1859 CYInfix_(false, 11, "^", BitwiseXOr)
1860 CYInfix_(false, 12, "|", BitwiseOr)
1861 CYInfix_(false, 13, "&&", LogicalAnd)
1862 CYInfix_(false, 14, "||", LogicalOr)
1864 CYAssignment_("=", )
1865 CYAssignment_("*=", Multiply)
1866 CYAssignment_("/=", Divide)
1867 CYAssignment_("%=", Modulus)
1868 CYAssignment_("+=", Add)
1869 CYAssignment_("-=", Subtract)
1870 CYAssignment_("<<=", ShiftLeft)
1871 CYAssignment_(">>=", ShiftRightSigned)
1872 CYAssignment_(">>>=", ShiftRightUnsigned)
1873 CYAssignment_("&=", BitwiseAnd)
1874 CYAssignment_("^=", BitwiseXOr)
1875 CYAssignment_("|=", BitwiseOr)
1877 #endif/*CYCRIPT_PARSER_HPP*/