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;
315 // XXX: strategy pattern, maybe subclass
326 CYStatement *&statements_;
330 CYIdentifierAddressFlagsMap internal_;
331 CYIdentifierValueSet identifiers_;
333 CYScope(CYScopeType type, CYContext &context, CYStatement *&statements);
338 void Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags);
339 virtual CYIdentifier *Lookup(CYContext &context, CYIdentifier *identifier);
340 void Merge(CYContext &context, CYIdentifier *identifier);
341 void Scope(CYContext &context, CYStatement *&statements);
347 CYStatement *statements_;
349 CYProgram(CYStatement *statements) :
350 statements_(statements)
354 virtual void Replace(CYContext &context);
355 virtual void Output(CYOutput &out) const;
364 CYIdentifierUsageVector rename_;
366 CYNonLocal *nonlocal_;
367 CYNonLocal *nextlocal_;
370 CYContext(CYOptions &options) :
379 virtual ~CYContext() {
382 template <typename Type_>
383 void ReplaceAll(Type_ *&values) {
384 Type_ **last(&values);
385 CYForEach (next, values) {
386 Replace(*last = next);
388 last = &(*last)->next_;
392 template <typename Type_>
393 void Replace(Type_ *&value) {
394 for (;;) if (value == NULL)
397 Type_ *replace(value->Replace(*this));
398 if (replace != value)
404 void NonLocal(CYStatement *&statements);
405 CYIdentifier *Unique();
409 CYIdentifier *identifier_;
416 CYIdentifier *Target(CYContext &context) {
417 if (identifier_ == NULL)
418 identifier_ = context.Unique();
427 CYStatement *statements_;
429 CYBlock(CYStatement *statements) :
430 statements_(statements)
434 operator CYStatement *() const {
438 void AddPrev(CYStatement *statement) {
439 CYSetLast(statement, statements_);
440 statements_ = statement;
443 virtual CYStatement *Replace(CYContext &context);
445 virtual void Output(CYOutput &out) const;
446 virtual void Output(CYOutput &out, CYFlags flags) const;
472 std::string filename_;
476 cy::location location_;
477 std::string message_;
480 typedef std::vector<Error> Errors;
488 CYExpression *context_;
490 Context(CYExpression *context) :
495 typedef std::vector<CYWord *> Words;
499 typedef std::vector<Context> Contexts;
502 CYExpression *context_;
514 void ScannerDestroy();
517 CYDriver(const std::string &filename = "");
520 Condition GetCondition();
521 void SetCondition(Condition condition);
523 void PushCondition(Condition condition);
526 void Warning(const cy::location &location, const char *message);
529 struct CYForInitialiser {
530 virtual ~CYForInitialiser() {
533 virtual void For(CYOutput &out) const = 0;
534 virtual CYExpression *Replace(CYContext &context) = 0;
537 struct CYForInInitialiser {
538 virtual ~CYForInInitialiser() {
541 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
542 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value) = 0;
544 virtual CYExpression *Replace(CYContext &context) = 0;
545 virtual CYAssignment *Assignment(CYContext &context) = 0;
551 struct CYExpression :
552 CYNext<CYExpression>,
558 virtual unsigned Precedence() const = 0;
560 virtual bool RightHand() const {
564 virtual void For(CYOutput &out) const;
565 virtual void ForIn(CYOutput &out, CYFlags flags) const;
566 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
568 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
570 virtual void Output(CYOutput &out) const;
571 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
572 void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
574 virtual CYExpression *ClassName(CYContext &context, bool object);
575 virtual void ClassName(CYOutput &out, bool object) const;
577 virtual CYExpression *Replace(CYContext &context) = 0;
578 virtual CYAssignment *Assignment(CYContext &context);
580 virtual CYExpression *Primitive(CYContext &context) {
584 virtual CYNumber *Number(CYContext &context) {
588 virtual CYString *String(CYContext &context) {
592 virtual const char *Word() const {
597 #define CYAlphabetic(value) \
598 virtual bool Alphabetic() const { \
602 #define CYPrecedence(value) \
603 static const unsigned Precedence_ = value; \
604 virtual unsigned Precedence() const { \
605 return Precedence_; \
608 #define CYRightHand(value) \
609 virtual bool RightHand() const { \
616 CYExpression *expressions_;
618 CYCompound(CYExpression *expressions = NULL) :
619 expressions_(expressions)
623 void AddPrev(CYExpression *expression) {
624 CYSetLast(expression, expressions_);
625 expressions_ = expression;
630 virtual CYExpression *Replace(CYContext &context);
631 void Output(CYOutput &out, CYFlags flags) const;
634 struct CYFunctionParameter :
635 CYNext<CYFunctionParameter>,
640 CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next = NULL) :
641 CYNext<CYFunctionParameter>(next),
646 virtual CYFunctionParameter *Replace(CYContext &context, CYBlock &code);
647 virtual void Output(CYOutput &out) const;
650 struct CYOptionalFunctionParameter :
653 CYExpression *initializer_;
655 CYOptionalFunctionParameter(CYIdentifier *name, CYExpression *initializer, CYFunctionParameter *next = NULL) :
656 CYFunctionParameter(name, next),
657 initializer_(initializer)
661 virtual CYFunctionParameter *Replace(CYContext &context, CYBlock &code);
662 virtual void Output(CYOutput &out) const;
665 struct CYComprehension :
666 CYNext<CYComprehension>,
669 virtual const char *Name() const = 0;
671 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
672 CYFunctionParameter *Parameters(CYContext &context) const;
673 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
674 virtual void Output(CYOutput &out) const = 0;
677 struct CYForInComprehension :
683 CYForInComprehension(CYIdentifier *name, CYExpression *set) :
689 virtual const char *Name() const {
690 return name_->Word();
693 virtual CYFunctionParameter *Parameter(CYContext &context) const;
694 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
695 virtual void Output(CYOutput &out) const;
698 struct CYForEachInComprehension :
704 CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
710 virtual const char *Name() const {
711 return name_->Word();
714 virtual CYFunctionParameter *Parameter(CYContext &context) const;
715 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
716 virtual void Output(CYOutput &out) const;
719 struct CYIfComprehension :
724 CYIfComprehension(CYExpression *test) :
729 virtual const char *Name() const {
733 virtual CYFunctionParameter *Parameter(CYContext &context) const;
734 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
735 virtual void Output(CYOutput &out) const;
738 struct CYArrayComprehension :
741 CYExpression *expression_;
742 CYComprehension *comprehensions_;
744 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
745 expression_(expression),
746 comprehensions_(comprehensions)
752 virtual CYExpression *Replace(CYContext &context);
753 virtual void Output(CYOutput &out, CYFlags flags) const;
766 virtual CYExpression *Replace(CYContext &context);
780 CYRange(uint64_t lo, uint64_t hi) :
785 bool operator [](uint8_t value) const {
786 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
789 void operator()(uint8_t value) {
792 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
796 extern CYRange DigitRange_;
797 extern CYRange WordStartRange_;
798 extern CYRange WordEndRange_;
813 CYString(const char *value) :
819 CYString(const char *value, size_t size) :
825 CYString(const CYWord *word) :
826 value_(word->Word()),
827 size_(strlen(value_))
831 const char *Value() const {
835 virtual const char *Word() const;
837 virtual CYNumber *Number(CYContext &context);
838 virtual CYString *String(CYContext &context);
840 CYString *Concat(CYContext &out, CYString *rhs) const;
841 virtual void Output(CYOutput &out, CYFlags flags) const;
842 virtual void PropertyName(CYOutput &out) const;
851 CYNumber(double value) :
856 double Value() const {
860 virtual CYNumber *Number(CYContext &context);
861 virtual CYString *String(CYContext &context);
863 virtual void Output(CYOutput &out, CYFlags flags) const;
864 virtual void PropertyName(CYOutput &out) const;
872 CYRegEx(const char *value) :
877 const char *Value() const {
881 virtual void Output(CYOutput &out, CYFlags flags) const;
893 virtual CYNumber *Number(CYContext &context);
894 virtual CYString *String(CYContext &context);
896 virtual void Output(CYOutput &out, CYFlags flags) const;
908 virtual CYExpression *Replace(CYContext &context);
909 virtual void Output(CYOutput &out, CYFlags flags) const;
915 virtual bool Value() const = 0;
916 virtual void Output(CYOutput &out, CYFlags flags) const;
928 virtual bool Value() const {
932 virtual CYNumber *Number(CYContext &context);
933 virtual CYString *String(CYContext &context);
945 virtual bool Value() const {
949 virtual CYNumber *Number(CYContext &context);
950 virtual CYString *String(CYContext &context);
958 CYVariable(CYIdentifier *name) :
963 CYVariable(const char *name) :
964 name_(new($pool) CYIdentifier(name))
971 virtual CYExpression *Replace(CYContext &context);
972 virtual void Output(CYOutput &out, CYFlags flags) const;
980 CYPrefix(CYExpression *rhs) :
985 virtual bool Alphabetic() const = 0;
986 virtual const char *Operator() const = 0;
990 virtual CYExpression *Replace(CYContext &context);
991 virtual void Output(CYOutput &out, CYFlags flags) const;
1000 CYInfix(CYExpression *lhs, CYExpression *rhs) :
1006 void SetLeft(CYExpression *lhs) {
1010 virtual bool Alphabetic() const = 0;
1011 virtual const char *Operator() const = 0;
1013 virtual CYExpression *Replace(CYContext &context);
1014 virtual void Output(CYOutput &out, CYFlags flags) const;
1022 CYPostfix(CYExpression *lhs) :
1027 virtual const char *Operator() const = 0;
1031 virtual CYExpression *Replace(CYContext &context);
1032 virtual void Output(CYOutput &out, CYFlags flags) const;
1035 struct CYAssignment :
1041 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
1047 void SetLeft(CYExpression *lhs) {
1051 virtual const char *Operator() const = 0;
1055 virtual CYExpression *Replace(CYContext &context);
1056 virtual void Output(CYOutput &out, CYFlags flags) const;
1064 CYExpression *value_;
1066 CYArgument(CYExpression *value, CYArgument *next = NULL) :
1067 CYNext<CYArgument>(next),
1073 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
1074 CYNext<CYArgument>(next),
1080 void Replace(CYContext &context);
1081 void Output(CYOutput &out) const;
1097 CYExpression *case_;
1098 CYStatement *statements_;
1100 CYClause(CYExpression *_case, CYStatement *statements) :
1102 statements_(statements)
1106 void Replace(CYContext &context);
1107 virtual void Output(CYOutput &out) const;
1114 CYExpression *value_;
1116 CYElement(CYExpression *value, CYElement *next) :
1117 CYNext<CYElement>(next),
1122 void Replace(CYContext &context);
1123 void Output(CYOutput &out) const;
1129 CYElement *elements_;
1131 CYArray(CYElement *elements = NULL) :
1136 virtual CYExpression *Replace(CYContext &context);
1137 virtual void Output(CYOutput &out, CYFlags flags) const;
1144 CYPropertyName *name_;
1145 CYExpression *value_;
1147 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1148 CYNext<CYProperty>(next),
1154 void Replace(CYContext &context);
1155 virtual void Output(CYOutput &out) const;
1158 struct CYDeclaration :
1161 CYIdentifier *identifier_;
1162 CYExpression *initialiser_;
1164 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
1165 identifier_(identifier),
1166 initialiser_(initialiser)
1170 virtual void ForIn(CYOutput &out, CYFlags flags) const;
1171 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
1173 virtual CYExpression *Replace(CYContext &context);
1174 virtual CYAssignment *Assignment(CYContext &context);
1176 virtual void Output(CYOutput &out, CYFlags flags) const;
1179 struct CYDeclarations :
1180 CYNext<CYDeclarations>,
1184 CYDeclaration *declaration_;
1186 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1187 CYNext<CYDeclarations>(next),
1188 declaration_(declaration)
1192 virtual void For(CYOutput &out) const;
1194 virtual CYCompound *Replace(CYContext &context);
1195 CYProperty *Property(CYContext &context);
1197 virtual void Output(CYOutput &out) const;
1198 virtual void Output(CYOutput &out, CYFlags flags) const;
1204 CYDeclarations *declarations_;
1206 CYVar(CYDeclarations *declarations) :
1207 declarations_(declarations)
1211 virtual CYStatement *Replace(CYContext &context);
1212 virtual void Output(CYOutput &out, CYFlags flags) const;
1218 CYDeclarations *declarations_;
1221 CYLet(CYDeclarations *declarations, CYStatement *statements) :
1222 declarations_(declarations),
1227 virtual CYStatement *Replace(CYContext &context);
1228 virtual void Output(CYOutput &out, CYFlags flags) const;
1234 CYForInitialiser *initialiser_;
1235 CYExpression *test_;
1236 CYExpression *increment_;
1239 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1240 initialiser_(initialiser),
1242 increment_(increment),
1247 virtual CYStatement *Replace(CYContext &context);
1248 virtual void Output(CYOutput &out, CYFlags flags) const;
1254 CYForInInitialiser *initialiser_;
1258 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1259 initialiser_(initialiser),
1265 virtual CYStatement *Replace(CYContext &context);
1266 virtual void Output(CYOutput &out, CYFlags flags) const;
1269 struct CYForEachIn :
1272 CYForInInitialiser *initialiser_;
1276 CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1277 initialiser_(initialiser),
1283 virtual CYStatement *Replace(CYContext &context);
1284 virtual void Output(CYOutput &out, CYFlags flags) const;
1290 CYProperty *properties_;
1292 CYObject(CYProperty *properties = NULL) :
1293 properties_(properties)
1297 virtual CYExpression *Replace(CYContext &context);
1298 void Output(CYOutput &out, CYFlags flags) const;
1304 CYExpression *object_;
1305 CYExpression *property_;
1307 CYMember(CYExpression *object, CYExpression *property) :
1313 void SetLeft(CYExpression *object) {
1317 void Replace_(CYContext &context);
1320 struct CYDirectMember :
1323 CYDirectMember(CYExpression *object, CYExpression *property) :
1324 CYMember(object, property)
1331 virtual CYExpression *Replace(CYContext &context);
1332 virtual void Output(CYOutput &out, CYFlags flags) const;
1335 struct CYIndirectMember :
1338 CYIndirectMember(CYExpression *object, CYExpression *property) :
1339 CYMember(object, property)
1346 virtual CYExpression *Replace(CYContext &context);
1347 virtual void Output(CYOutput &out, CYFlags flags) const;
1356 CYExpression *constructor_;
1357 CYArgument *arguments_;
1359 New(CYExpression *constructor, CYArgument *arguments) :
1360 constructor_(constructor),
1361 arguments_(arguments)
1365 virtual unsigned Precedence() const {
1366 return arguments_ == NULL ? 2 : 1;
1371 virtual CYExpression *Replace(CYContext &context);
1372 virtual void Output(CYOutput &out, CYFlags flags) const;
1374 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1382 CYExpression *function_;
1383 CYArgument *arguments_;
1385 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1386 function_(function),
1387 arguments_(arguments)
1394 virtual CYExpression *Replace(CYContext &context);
1395 virtual void Output(CYOutput &out, CYFlags flags) const;
1397 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1402 struct CYRubyBlock :
1405 CYExpression *call_;
1408 CYRubyBlock(CYExpression *call, CYRubyProc *proc) :
1417 virtual CYExpression *Replace(CYContext &context);
1418 virtual void Output(CYOutput &out, CYFlags flags) const;
1424 CYExpression *test_;
1426 CYStatement *false_;
1428 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1435 virtual CYStatement *Replace(CYContext &context);
1436 virtual void Output(CYOutput &out, CYFlags flags) const;
1442 CYExpression *test_;
1445 CYDoWhile(CYExpression *test, CYStatement *code) :
1451 virtual CYStatement *Replace(CYContext &context);
1452 virtual void Output(CYOutput &out, CYFlags flags) const;
1458 CYExpression *test_;
1461 CYWhile(CYExpression *test, CYStatement *code) :
1467 virtual CYStatement *Replace(CYContext &context);
1468 virtual void Output(CYOutput &out, CYFlags flags) const;
1471 // XXX: this should be split up into CYAnonymousFunction and CYNamedFunction (subclass)
1473 CYIdentifier *name_;
1474 CYFunctionParameter *parameters_;
1476 CYNonLocal *nonlocal_;
1478 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1480 parameters_(parameters),
1486 virtual ~CYFunction() {
1489 void Inject(CYContext &context);
1490 virtual void Replace_(CYContext &context, bool outer);
1491 virtual void Output(CYOutput &out, CYFlags flags) const;
1494 // XXX: this should be split up into CYAnonymousFunctionExpression and CYNamedFunctionExpression
1495 struct CYFunctionExpression :
1499 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1500 CYFunction(name, parameters, statements)
1507 virtual CYExpression *Replace(CYContext &context);
1508 virtual void Output(CYOutput &out, CYFlags flags) const;
1511 // XXX: this should derive from CYAnonymousFunctionExpression
1513 CYFunctionExpression
1515 CYRubyProc(CYFunctionParameter *parameters, CYStatement *statements) :
1516 CYFunctionExpression(NULL, parameters, statements)
1520 virtual CYExpression *Replace(CYContext &context);
1521 virtual void Output(CYOutput &out, CYFlags flags) const;
1524 // XXX: this should derive from CYNamedFunction
1525 struct CYFunctionStatement :
1529 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1530 CYFunction(name, parameters, statements)
1534 virtual CYStatement *Replace(CYContext &context);
1535 virtual void Output(CYOutput &out, CYFlags flags) const;
1541 CYExpression *expression_;
1543 CYExpress(CYExpression *expression) :
1544 expression_(expression)
1546 if (expression == NULL)
1550 virtual CYStatement *Replace(CYContext &context);
1551 virtual void Output(CYOutput &out, CYFlags flags) const;
1557 CYIdentifier *label_;
1559 CYContinue(CYIdentifier *label) :
1564 virtual CYStatement *Replace(CYContext &context);
1565 virtual void Output(CYOutput &out, CYFlags flags) const;
1571 CYIdentifier *label_;
1573 CYBreak(CYIdentifier *label) :
1578 virtual CYStatement *Replace(CYContext &context);
1579 virtual void Output(CYOutput &out, CYFlags flags) const;
1585 CYExpression *value_;
1587 CYReturn(CYExpression *value) :
1592 virtual CYStatement *Replace(CYContext &context);
1593 virtual void Output(CYOutput &out, CYFlags flags) const;
1599 virtual CYStatement *Replace(CYContext &context);
1600 virtual void Output(CYOutput &out, CYFlags flags) const;
1608 CYFinally(CYStatement *statements) :
1613 void Replace(CYContext &context);
1614 virtual void Output(CYOutput &out) const;
1623 CYIdentifier *name_;
1626 Catch(CYIdentifier *name, CYStatement *statements) :
1632 void Replace(CYContext &context);
1633 virtual void Output(CYOutput &out) const;
1641 CYFinally *finally_;
1643 Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
1650 virtual CYStatement *Replace(CYContext &context);
1651 virtual void Output(CYOutput &out, CYFlags flags) const;
1657 CYExpression *value_;
1659 Throw(CYExpression *value = NULL) :
1664 virtual CYStatement *Replace(CYContext &context);
1665 virtual void Output(CYOutput &out, CYFlags flags) const;
1673 CYExpression *scope_;
1676 CYWith(CYExpression *scope, CYStatement *code) :
1682 virtual CYStatement *Replace(CYContext &context);
1683 virtual void Output(CYOutput &out, CYFlags flags) const;
1689 CYExpression *value_;
1692 CYSwitch(CYExpression *value, CYClause *clauses) :
1698 virtual CYStatement *Replace(CYContext &context);
1699 virtual void Output(CYOutput &out, CYFlags flags) const;
1702 struct CYCondition :
1705 CYExpression *test_;
1706 CYExpression *true_;
1707 CYExpression *false_;
1709 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
1718 virtual CYExpression *Replace(CYContext &context);
1719 virtual void Output(CYOutput &out, CYFlags flags) const;
1722 struct CYAddressOf :
1725 CYAddressOf(CYExpression *rhs) :
1730 virtual const char *Operator() const {
1736 virtual CYExpression *Replace(CYContext &context);
1742 CYIndirect(CYExpression *rhs) :
1747 virtual const char *Operator() const {
1753 virtual CYExpression *Replace(CYContext &context);
1757 virtual CYExpression *Replace(CYContext &context);
1759 #define CYPostfix_(op, name, args...) \
1760 struct CY ## name : \
1763 CY ## name(CYExpression *lhs) : \
1768 virtual const char *Operator() const { \
1773 #define CYPrefix_(alphabetic, op, name, args...) \
1774 struct CY ## name : \
1777 CY ## name(CYExpression *rhs) : \
1782 CYAlphabetic(alphabetic) \
1784 virtual const char *Operator() const { \
1789 #define CYInfix_(alphabetic, precedence, op, name, args...) \
1790 struct CY ## name : \
1793 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
1798 CYAlphabetic(alphabetic) \
1799 CYPrecedence(precedence) \
1801 virtual const char *Operator() const { \
1806 #define CYAssignment_(op, name, args...) \
1807 struct CY ## name ## Assign : \
1810 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
1811 CYAssignment(lhs, rhs) \
1815 virtual const char *Operator() const { \
1820 CYPostfix_("++", PostIncrement)
1821 CYPostfix_("--", PostDecrement)
1823 CYPrefix_(true, "delete", Delete)
1824 CYPrefix_(true, "void", Void)
1825 CYPrefix_(true, "typeof", TypeOf)
1826 CYPrefix_(false, "++", PreIncrement)
1827 CYPrefix_(false, "--", PreDecrement)
1828 CYPrefix_(false, "+", Affirm)
1829 CYPrefix_(false, "-", Negate)
1830 CYPrefix_(false, "~", BitwiseNot)
1831 CYPrefix_(false, "!", LogicalNot)
1833 CYInfix_(false, 5, "*", Multiply)
1834 CYInfix_(false, 5, "/", Divide)
1835 CYInfix_(false, 5, "%", Modulus)
1836 CYInfix_(false, 6, "+", Add, CYReplace)
1837 CYInfix_(false, 6, "-", Subtract)
1838 CYInfix_(false, 7, "<<", ShiftLeft)
1839 CYInfix_(false, 7, ">>", ShiftRightSigned)
1840 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
1841 CYInfix_(false, 8, "<", Less)
1842 CYInfix_(false, 8, ">", Greater)
1843 CYInfix_(false, 8, "<=", LessOrEqual)
1844 CYInfix_(false, 8, ">=", GreaterOrEqual)
1845 CYInfix_(true, 8, "instanceof", InstanceOf)
1846 CYInfix_(true, 8, "in", In)
1847 CYInfix_(false, 9, "==", Equal)
1848 CYInfix_(false, 9, "!=", NotEqual)
1849 CYInfix_(false, 9, "===", Identical)
1850 CYInfix_(false, 9, "!==", NotIdentical)
1851 CYInfix_(false, 10, "&", BitwiseAnd)
1852 CYInfix_(false, 11, "^", BitwiseXOr)
1853 CYInfix_(false, 12, "|", BitwiseOr)
1854 CYInfix_(false, 13, "&&", LogicalAnd)
1855 CYInfix_(false, 14, "||", LogicalOr)
1857 CYAssignment_("=", )
1858 CYAssignment_("*=", Multiply)
1859 CYAssignment_("/=", Divide)
1860 CYAssignment_("%=", Modulus)
1861 CYAssignment_("+=", Add)
1862 CYAssignment_("-=", Subtract)
1863 CYAssignment_("<<=", ShiftLeft)
1864 CYAssignment_(">>=", ShiftRightSigned)
1865 CYAssignment_(">>>=", ShiftRightUnsigned)
1866 CYAssignment_("&=", BitwiseAnd)
1867 CYAssignment_("^=", BitwiseXOr)
1868 CYAssignment_("|=", BitwiseOr)
1870 #endif/*CYCRIPT_PARSER_HPP*/