1 /* Cycript - Optimizing JavaScript Compiler/Runtime
2 * Copyright (C) 2009-2012 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
36 #include "location.hh"
39 #include "Pooling.hpp"
40 #include "Options.hpp"
48 virtual void Output(struct CYOutput &out) const = 0;
66 CYOutput(std::ostream &out, CYOptions &options) :
76 void Check(char value);
79 CYOutput &operator <<(char rhs);
80 CYOutput &operator <<(const char *rhs);
82 _finline CYOutput &operator <<(const CYThing *rhs) {
88 _finline CYOutput &operator <<(const CYThing &rhs) {
94 struct CYPropertyName {
95 virtual void PropertyName(CYOutput &out) const = 0;
97 virtual ~CYPropertyName() {
112 CYNoBrace = (1 << 0),
113 CYNoFunction = (1 << 1),
116 CYNoRightHand = (1 << 4),
117 CYNoDangle = (1 << 5),
118 CYNoInteger = (1 << 6),
119 CYNoBF = (CYNoBrace | CYNoFunction),
122 _finline CYFlags operator ~(CYFlags rhs) {
123 return static_cast<CYFlags>(~static_cast<unsigned>(rhs));
126 _finline CYFlags operator &(CYFlags lhs, CYFlags rhs) {
127 return static_cast<CYFlags>(static_cast<unsigned>(lhs) & static_cast<unsigned>(rhs));
130 _finline CYFlags operator |(CYFlags lhs, CYFlags rhs) {
131 return static_cast<CYFlags>(static_cast<unsigned>(lhs) | static_cast<unsigned>(rhs));
134 _finline CYFlags &operator |=(CYFlags &lhs, CYFlags rhs) {
135 return lhs = lhs | rhs;
138 _finline CYFlags CYLeft(CYFlags flags) {
139 return flags & ~(CYNoDangle | CYNoInteger);
142 _finline CYFlags CYRight(CYFlags flags) {
143 return flags & ~CYNoBF;
146 _finline CYFlags CYCenter(CYFlags flags) {
147 return CYLeft(CYRight(flags));
153 virtual ~CYStatement() {
156 void Single(CYOutput &out, CYFlags flags) const;
157 void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
159 virtual CYStatement *Replace(CYContext &context) = 0;
162 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
165 struct CYStatements {
175 operator CYStatement *() const {
179 CYStatements &operator ->*(CYStatement *next) {
181 if (first_ == NULL) {
184 } else for (;; last_ = last_->next_)
185 if (last_->next_ == NULL) {
195 virtual ~CYClassName() {
198 virtual CYExpression *ClassName(CYContext &context, bool object) = 0;
199 virtual void ClassName(CYOutput &out, bool object) const = 0;
209 CYWord(const char *word) :
214 void Set(const char *value) {
218 virtual const char *Word() const;
219 virtual void Output(CYOutput &out) const;
221 virtual CYExpression *ClassName(CYContext &context, bool object);
222 virtual void ClassName(CYOutput &out, bool object) const;
223 virtual void PropertyName(CYOutput &out) const;
226 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
228 return lhs << rhs.Word();
231 struct CYIdentifier :
232 CYNext<CYIdentifier>,
235 CYIdentifier *replace_;
239 CYIdentifier(const char *word) :
247 virtual const char *Word() const;
248 CYIdentifier *Replace(CYContext &context);
256 CYComment(const char *value) :
261 virtual CYStatement *Replace(CYContext &context);
262 virtual void Output(CYOutput &out, CYFlags flags) const;
269 CYStatement *statement_;
271 CYLabel(CYIdentifier *name, CYStatement *statement) :
273 statement_(statement)
277 virtual CYStatement *Replace(CYContext &context);
278 virtual void Output(CYOutput &out, CYFlags flags) const;
281 struct CYCStringLess :
282 std::binary_function<const char *, const char *, bool>
284 _finline bool operator ()(const char *lhs, const char *rhs) const {
285 return strcmp(lhs, rhs) < 0;
289 struct CYIdentifierValueLess :
290 std::binary_function<CYIdentifier *, CYIdentifier *, bool>
292 _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
293 return CYCStringLess()(lhs->Word(), rhs->Word());
297 enum CYIdentifierFlags {
298 CYIdentifierArgument,
299 CYIdentifierVariable,
305 typedef std::set<const char *, CYCStringLess> CYCStringSet;
306 typedef std::set<CYIdentifier *, CYIdentifierValueLess> CYIdentifierValueSet;
307 typedef std::map<CYIdentifier *, CYIdentifierFlags> CYIdentifierAddressFlagsMap;
309 struct CYIdentifierUsage {
310 CYIdentifier *identifier_;
314 typedef std::vector<CYIdentifierUsage> CYIdentifierUsageVector;
320 CYStatement *&statements_;
324 CYIdentifierAddressFlagsMap internal_;
325 CYIdentifierValueSet identifiers_;
327 CYScope(bool transparent, CYContext &context, CYStatement *&statements);
332 void Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags);
333 virtual CYIdentifier *Lookup(CYContext &context, CYIdentifier *identifier);
334 void Merge(CYContext &context, CYIdentifier *identifier);
335 void Scope(CYContext &context, CYStatement *&statements);
341 CYStatement *statements_;
343 CYProgram(CYStatement *statements) :
344 statements_(statements)
348 virtual void Replace(CYContext &context);
349 virtual void Output(CYOutput &out) const;
361 CYIdentifierUsageVector rename_;
363 CYNonLocal *nonlocal_;
364 CYNonLocal *nextlocal_;
367 CYContext(CYOptions &options) :
377 virtual ~CYContext() {
380 template <typename Type_>
381 void ReplaceAll(Type_ *&values) {
382 Type_ **last(&values);
383 CYForEach (next, values) {
384 Replace(*last = next);
386 last = &(*last)->next_;
390 template <typename Type_>
391 void Replace(Type_ *&value) {
392 for (;;) if (value == NULL)
395 Type_ *replace(value->Replace(*this));
396 if (replace != value)
402 void NonLocal(CYStatement *&statements);
403 CYIdentifier *Unique();
407 CYIdentifier *identifier_;
414 CYIdentifier *Target(CYContext &context) {
415 if (identifier_ == NULL)
416 identifier_ = context.Unique();
424 CYIdentifier *identifier_;
431 CYIdentifier *Identifier(CYContext &context) {
433 return next_->Identifier(context);
434 if (identifier_ == NULL)
435 identifier_ = context.Unique();
444 CYStatement *statements_;
446 CYBlock(CYStatement *statements) :
447 statements_(statements)
451 operator CYStatement *() const {
455 void AddPrev(CYStatement *statement) {
456 CYSetLast(statement) = statements_;
457 statements_ = statement;
460 virtual CYStatement *Replace(CYContext &context);
462 virtual void Output(CYOutput &out) const;
463 virtual void Output(CYOutput &out, CYFlags flags) const;
478 std::stack<bool> in_;
492 std::string filename_;
496 cy::location location_;
497 std::string message_;
500 typedef std::vector<Error> Errors;
508 CYExpression *context_;
510 Context(CYExpression *context) :
515 typedef std::vector<CYWord *> Words;
519 typedef std::vector<Context> Contexts;
522 CYExpression *context_;
534 void ScannerDestroy();
537 CYDriver(const std::string &filename = "");
540 Condition GetCondition();
541 void SetCondition(Condition condition);
543 void PushCondition(Condition condition);
546 void Warning(const cy::location &location, const char *message);
549 struct CYForInitialiser {
550 virtual ~CYForInitialiser() {
553 virtual CYExpression *Replace(CYContext &context) = 0;
554 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
557 struct CYForInInitialiser {
558 virtual ~CYForInInitialiser() {
561 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
562 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value) = 0;
564 virtual CYExpression *Replace(CYContext &context) = 0;
565 virtual CYAssignment *Assignment(CYContext &context) = 0;
567 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
573 struct CYExpression :
574 CYNext<CYExpression>,
580 virtual unsigned Precedence() const = 0;
582 virtual bool RightHand() const {
586 virtual void ForIn(CYOutput &out, CYFlags flags) const;
587 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
589 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
591 virtual void Output(CYOutput &out) const;
592 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
593 void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
595 virtual CYExpression *ClassName(CYContext &context, bool object);
596 virtual void ClassName(CYOutput &out, bool object) const;
598 virtual CYExpression *Replace(CYContext &context) = 0;
599 virtual CYAssignment *Assignment(CYContext &context);
601 virtual CYExpression *Primitive(CYContext &context) {
605 virtual CYNumber *Number(CYContext &context) {
609 virtual CYString *String(CYContext &context) {
613 virtual const char *Word() const {
618 #define CYAlphabetic(value) \
619 virtual bool Alphabetic() const { \
623 #define CYPrecedence(value) \
624 static const unsigned Precedence_ = value; \
625 virtual unsigned Precedence() const { \
626 return Precedence_; \
629 #define CYRightHand(value) \
630 virtual bool RightHand() const { \
637 CYExpression *expressions_;
639 CYCompound(CYExpression *expressions = NULL) :
640 expressions_(expressions)
644 void AddPrev(CYExpression *expression) {
645 CYSetLast(expression) = expressions_;
646 expressions_ = expression;
651 virtual CYExpression *Replace(CYContext &context);
652 void Output(CYOutput &out, CYFlags flags) const;
654 virtual CYExpression *Primitive(CYContext &context);
657 struct CYDeclaration;
659 struct CYFunctionParameter :
660 CYNext<CYFunctionParameter>,
663 CYForInInitialiser *initialiser_;
665 CYFunctionParameter(CYForInInitialiser *initialiser, CYFunctionParameter *next = NULL) :
666 CYNext<CYFunctionParameter>(next),
667 initialiser_(initialiser)
671 void Replace(CYContext &context, CYBlock &code);
672 void Output(CYOutput &out) const;
675 struct CYComprehension :
676 CYNext<CYComprehension>,
679 CYComprehension(CYComprehension *next = NULL) :
680 CYNext<CYComprehension>(next)
684 virtual const char *Name() const = 0;
686 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
687 CYFunctionParameter *Parameters(CYContext &context) const;
688 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
689 virtual void Output(CYOutput &out) const = 0;
692 struct CYForInComprehension :
698 CYForInComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
699 CYComprehension(next),
705 virtual const char *Name() const {
706 return name_->Word();
709 virtual CYFunctionParameter *Parameter(CYContext &context) const;
710 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
711 virtual void Output(CYOutput &out) const;
714 struct CYForOfComprehension :
720 CYForOfComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
721 CYComprehension(next),
727 virtual const char *Name() const {
728 return name_->Word();
731 virtual CYFunctionParameter *Parameter(CYContext &context) const;
732 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
733 virtual void Output(CYOutput &out) const;
736 struct CYIfComprehension :
741 CYIfComprehension(CYExpression *test) :
746 virtual const char *Name() const {
750 virtual CYFunctionParameter *Parameter(CYContext &context) const;
751 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
752 virtual void Output(CYOutput &out) const;
755 struct CYArrayComprehension :
758 CYExpression *expression_;
759 CYComprehension *comprehensions_;
761 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
762 expression_(expression),
763 comprehensions_(comprehensions)
769 virtual CYExpression *Replace(CYContext &context);
770 virtual void Output(CYOutput &out, CYFlags flags) const;
783 virtual CYExpression *Replace(CYContext &context);
797 CYRange(uint64_t lo, uint64_t hi) :
802 bool operator [](uint8_t value) const {
803 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
806 void operator()(uint8_t value) {
809 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
813 extern CYRange DigitRange_;
814 extern CYRange WordStartRange_;
815 extern CYRange WordEndRange_;
830 CYString(const char *value) :
836 CYString(const char *value, size_t size) :
842 CYString(const CYWord *word) :
843 value_(word->Word()),
844 size_(strlen(value_))
848 const char *Value() const {
852 virtual const char *Word() const;
854 virtual CYNumber *Number(CYContext &context);
855 virtual CYString *String(CYContext &context);
857 CYString *Concat(CYContext &out, CYString *rhs) const;
858 virtual void Output(CYOutput &out, CYFlags flags) const;
859 virtual void PropertyName(CYOutput &out) const;
868 CYNumber(double value) :
873 double Value() const {
877 virtual CYNumber *Number(CYContext &context);
878 virtual CYString *String(CYContext &context);
880 virtual void Output(CYOutput &out, CYFlags flags) const;
881 virtual void PropertyName(CYOutput &out) const;
889 CYRegEx(const char *value) :
894 const char *Value() const {
898 virtual void Output(CYOutput &out, CYFlags flags) const;
910 virtual CYNumber *Number(CYContext &context);
911 virtual CYString *String(CYContext &context);
913 virtual void Output(CYOutput &out, CYFlags flags) const;
925 virtual CYExpression *Replace(CYContext &context);
926 virtual void Output(CYOutput &out, CYFlags flags) const;
932 virtual bool Value() const = 0;
933 virtual void Output(CYOutput &out, CYFlags flags) const;
945 virtual bool Value() const {
949 virtual CYNumber *Number(CYContext &context);
950 virtual CYString *String(CYContext &context);
962 virtual bool Value() const {
966 virtual CYNumber *Number(CYContext &context);
967 virtual CYString *String(CYContext &context);
975 CYVariable(CYIdentifier *name) :
980 CYVariable(const char *name) :
981 name_(new($pool) CYIdentifier(name))
988 virtual CYExpression *Replace(CYContext &context);
989 virtual void Output(CYOutput &out, CYFlags flags) const;
997 CYPrefix(CYExpression *rhs) :
1002 virtual bool Alphabetic() const = 0;
1003 virtual const char *Operator() const = 0;
1007 virtual CYExpression *Replace(CYContext &context);
1008 virtual void Output(CYOutput &out, CYFlags flags) const;
1017 CYInfix(CYExpression *lhs, CYExpression *rhs) :
1023 void SetLeft(CYExpression *lhs) {
1027 virtual bool Alphabetic() const = 0;
1028 virtual const char *Operator() const = 0;
1030 virtual CYExpression *Replace(CYContext &context);
1031 virtual void Output(CYOutput &out, CYFlags flags) const;
1039 CYPostfix(CYExpression *lhs) :
1044 virtual const char *Operator() const = 0;
1048 virtual CYExpression *Replace(CYContext &context);
1049 virtual void Output(CYOutput &out, CYFlags flags) const;
1052 struct CYAssignment :
1058 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
1064 void SetLeft(CYExpression *lhs) {
1068 virtual const char *Operator() const = 0;
1072 virtual CYExpression *Replace(CYContext &context);
1073 virtual void Output(CYOutput &out, CYFlags flags) const;
1081 CYExpression *value_;
1083 CYArgument(CYExpression *value, CYArgument *next = NULL) :
1084 CYNext<CYArgument>(next),
1090 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
1091 CYNext<CYArgument>(next),
1097 CYArgument *Replace(CYContext &context);
1098 void Output(CYOutput &out) const;
1114 CYExpression *case_;
1115 CYStatement *statements_;
1117 CYClause(CYExpression *_case, CYStatement *statements) :
1119 statements_(statements)
1123 void Replace(CYContext &context);
1124 virtual void Output(CYOutput &out) const;
1131 CYExpression *value_;
1133 CYElement(CYExpression *value, CYElement *next) :
1134 CYNext<CYElement>(next),
1139 void Replace(CYContext &context);
1140 void Output(CYOutput &out) const;
1146 CYElement *elements_;
1148 CYArray(CYElement *elements = NULL) :
1153 virtual CYExpression *Replace(CYContext &context);
1154 virtual void Output(CYOutput &out, CYFlags flags) const;
1161 CYPropertyName *name_;
1162 CYExpression *value_;
1164 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1165 CYNext<CYProperty>(next),
1171 void Replace(CYContext &context);
1172 virtual void Output(CYOutput &out) const;
1175 struct CYDeclaration :
1178 CYIdentifier *identifier_;
1179 CYExpression *initialiser_;
1181 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
1182 identifier_(identifier),
1183 initialiser_(initialiser)
1187 virtual void ForIn(CYOutput &out, CYFlags flags) const;
1188 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
1190 virtual CYExpression *Replace(CYContext &context);
1192 virtual CYAssignment *Assignment(CYContext &context);
1193 CYVariable *Variable(CYContext &context);
1195 virtual void Output(CYOutput &out, CYFlags flags) const;
1198 struct CYDeclarations :
1199 CYNext<CYDeclarations>,
1202 CYDeclaration *declaration_;
1204 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1205 CYNext<CYDeclarations>(next),
1206 declaration_(declaration)
1210 void Replace(CYContext &context);
1212 CYCompound *Compound(CYContext &context);
1213 CYProperty *Property(CYContext &context);
1214 CYArgument *Argument(CYContext &context);
1215 CYFunctionParameter *Parameter(CYContext &context);
1217 virtual void Output(CYOutput &out) const;
1218 virtual void Output(CYOutput &out, CYFlags flags) const;
1221 struct CYForDeclarations :
1224 CYDeclarations *declarations_;
1226 CYForDeclarations(CYDeclarations *declarations) :
1227 declarations_(declarations)
1231 virtual CYCompound *Replace(CYContext &context);
1232 virtual void Output(CYOutput &out, CYFlags flags) const;
1238 CYDeclarations *declarations_;
1240 CYVar(CYDeclarations *declarations) :
1241 declarations_(declarations)
1245 virtual CYStatement *Replace(CYContext &context);
1246 virtual void Output(CYOutput &out, CYFlags flags) const;
1249 struct CYLetStatement :
1252 CYDeclarations *declarations_;
1255 CYLetStatement(CYDeclarations *declarations, CYStatement *code) :
1256 declarations_(declarations),
1261 virtual CYStatement *Replace(CYContext &context);
1262 virtual void Output(CYOutput &out, CYFlags flags) const;
1268 CYForInitialiser *initialiser_;
1269 CYExpression *test_;
1270 CYExpression *increment_;
1273 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1274 initialiser_(initialiser),
1276 increment_(increment),
1281 virtual CYStatement *Replace(CYContext &context);
1282 virtual void Output(CYOutput &out, CYFlags flags) const;
1288 CYForInInitialiser *initialiser_;
1292 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1293 initialiser_(initialiser),
1299 virtual CYStatement *Replace(CYContext &context);
1300 virtual void Output(CYOutput &out, CYFlags flags) const;
1306 CYForInInitialiser *initialiser_;
1310 CYForOf(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1311 initialiser_(initialiser),
1317 virtual CYStatement *Replace(CYContext &context);
1318 virtual void Output(CYOutput &out, CYFlags flags) const;
1324 CYProperty *properties_;
1326 CYObject(CYProperty *properties = NULL) :
1327 properties_(properties)
1331 virtual CYExpression *Replace(CYContext &context);
1332 void Output(CYOutput &out, CYFlags flags) const;
1338 CYExpression *object_;
1339 CYExpression *property_;
1341 CYMember(CYExpression *object, CYExpression *property) :
1347 void SetLeft(CYExpression *object) {
1352 struct CYDirectMember :
1355 CYDirectMember(CYExpression *object, CYExpression *property) :
1356 CYMember(object, property)
1363 virtual CYExpression *Replace(CYContext &context);
1364 virtual void Output(CYOutput &out, CYFlags flags) const;
1367 struct CYIndirectMember :
1370 CYIndirectMember(CYExpression *object, CYExpression *property) :
1371 CYMember(object, property)
1378 virtual CYExpression *Replace(CYContext &context);
1379 virtual void Output(CYOutput &out, CYFlags flags) const;
1388 CYExpression *constructor_;
1389 CYArgument *arguments_;
1391 New(CYExpression *constructor, CYArgument *arguments) :
1392 constructor_(constructor),
1393 arguments_(arguments)
1397 virtual unsigned Precedence() const {
1398 return arguments_ == NULL ? 2 : 1;
1403 virtual CYExpression *Replace(CYContext &context);
1404 virtual void Output(CYOutput &out, CYFlags flags) const;
1406 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1414 CYExpression *function_;
1415 CYArgument *arguments_;
1417 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1418 function_(function),
1419 arguments_(arguments)
1426 virtual CYExpression *Replace(CYContext &context);
1427 virtual void Output(CYOutput &out, CYFlags flags) const;
1429 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1434 struct CYRubyBlock :
1437 CYExpression *call_;
1440 CYRubyBlock(CYExpression *call, CYRubyProc *proc) :
1449 virtual CYExpression *Replace(CYContext &context);
1450 virtual void Output(CYOutput &out, CYFlags flags) const;
1456 CYExpression *test_;
1458 CYStatement *false_;
1460 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1467 virtual CYStatement *Replace(CYContext &context);
1468 virtual void Output(CYOutput &out, CYFlags flags) const;
1474 CYExpression *test_;
1477 CYDoWhile(CYExpression *test, CYStatement *code) :
1483 virtual CYStatement *Replace(CYContext &context);
1484 virtual void Output(CYOutput &out, CYFlags flags) const;
1490 CYExpression *test_;
1493 CYWhile(CYExpression *test, CYStatement *code) :
1499 virtual CYStatement *Replace(CYContext &context);
1500 virtual void Output(CYOutput &out, CYFlags flags) const;
1503 // XXX: this should be split up into CYAnonymousFunction and CYNamedFunction (subclass)
1505 CYIdentifier *name_;
1506 CYFunctionParameter *parameters_;
1509 CYNonLocal *nonlocal_;
1512 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1514 parameters_(parameters),
1520 virtual ~CYFunction() {
1523 void Inject(CYContext &context);
1524 virtual void Replace_(CYContext &context, bool outer);
1525 virtual void Output(CYOutput &out, CYFlags flags) const;
1528 // XXX: this should be split up into CYAnonymousFunctionExpression and CYNamedFunctionExpression
1529 struct CYFunctionExpression :
1533 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1534 CYFunction(name, parameters, statements)
1541 virtual CYExpression *Replace(CYContext &context);
1542 virtual void Output(CYOutput &out, CYFlags flags) const;
1545 // XXX: this should derive from CYAnonymousFunction
1550 CYFatArrow(CYFunctionParameter *parameters, CYStatement *statements) :
1551 CYFunction(NULL, parameters, statements)
1558 virtual CYExpression *Replace(CYContext &context);
1559 virtual void Output(CYOutput &out, CYFlags flags) const;
1562 // XXX: this should derive from CYAnonymousFunctionExpression
1564 CYFunctionExpression
1566 CYRubyProc(CYFunctionParameter *parameters, CYStatement *statements) :
1567 CYFunctionExpression(NULL, parameters, statements)
1571 virtual CYExpression *Replace(CYContext &context);
1572 virtual void Output(CYOutput &out, CYFlags flags) const;
1575 // XXX: this should derive from CYNamedFunction
1576 struct CYFunctionStatement :
1580 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1581 CYFunction(name, parameters, statements)
1585 virtual CYStatement *Replace(CYContext &context);
1586 virtual void Output(CYOutput &out, CYFlags flags) const;
1592 CYExpression *expression_;
1594 CYExpress(CYExpression *expression) :
1595 expression_(expression)
1597 if (expression == NULL)
1601 virtual CYStatement *Replace(CYContext &context);
1602 virtual void Output(CYOutput &out, CYFlags flags) const;
1608 CYIdentifier *label_;
1610 CYContinue(CYIdentifier *label) :
1615 virtual CYStatement *Replace(CYContext &context);
1616 virtual void Output(CYOutput &out, CYFlags flags) const;
1622 CYIdentifier *label_;
1624 CYBreak(CYIdentifier *label) :
1629 virtual CYStatement *Replace(CYContext &context);
1630 virtual void Output(CYOutput &out, CYFlags flags) const;
1636 CYExpression *value_;
1638 CYReturn(CYExpression *value) :
1643 virtual CYStatement *Replace(CYContext &context);
1644 virtual void Output(CYOutput &out, CYFlags flags) const;
1650 virtual CYStatement *Replace(CYContext &context);
1651 virtual void Output(CYOutput &out, CYFlags flags) const;
1659 CYFinally(CYStatement *statements) :
1664 void Replace(CYContext &context);
1665 virtual void Output(CYOutput &out) const;
1674 CYIdentifier *name_;
1677 Catch(CYIdentifier *name, CYStatement *statements) :
1683 void Replace(CYContext &context);
1684 virtual void Output(CYOutput &out) const;
1692 CYFinally *finally_;
1694 Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
1701 virtual CYStatement *Replace(CYContext &context);
1702 virtual void Output(CYOutput &out, CYFlags flags) const;
1708 CYExpression *value_;
1710 Throw(CYExpression *value = NULL) :
1715 virtual CYStatement *Replace(CYContext &context);
1716 virtual void Output(CYOutput &out, CYFlags flags) const;
1724 CYExpression *scope_;
1727 CYWith(CYExpression *scope, CYStatement *code) :
1733 virtual CYStatement *Replace(CYContext &context);
1734 virtual void Output(CYOutput &out, CYFlags flags) const;
1740 CYExpression *value_;
1743 CYSwitch(CYExpression *value, CYClause *clauses) :
1749 virtual CYStatement *Replace(CYContext &context);
1750 virtual void Output(CYOutput &out, CYFlags flags) const;
1760 virtual CYStatement *Replace(CYContext &context);
1761 virtual void Output(CYOutput &out, CYFlags flags) const;
1764 struct CYCondition :
1767 CYExpression *test_;
1768 CYExpression *true_;
1769 CYExpression *false_;
1771 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
1780 virtual CYExpression *Replace(CYContext &context);
1781 virtual void Output(CYOutput &out, CYFlags flags) const;
1784 struct CYAddressOf :
1787 CYAddressOf(CYExpression *rhs) :
1792 virtual const char *Operator() const {
1798 virtual CYExpression *Replace(CYContext &context);
1804 CYIndirect(CYExpression *rhs) :
1809 virtual const char *Operator() const {
1815 virtual CYExpression *Replace(CYContext &context);
1819 virtual CYExpression *Replace(CYContext &context);
1821 #define CYPostfix_(op, name, args...) \
1822 struct CY ## name : \
1825 CY ## name(CYExpression *lhs) : \
1830 virtual const char *Operator() const { \
1835 #define CYPrefix_(alphabetic, op, name, args...) \
1836 struct CY ## name : \
1839 CY ## name(CYExpression *rhs) : \
1844 CYAlphabetic(alphabetic) \
1846 virtual const char *Operator() const { \
1851 #define CYInfix_(alphabetic, precedence, op, name, args...) \
1852 struct CY ## name : \
1855 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
1860 CYAlphabetic(alphabetic) \
1861 CYPrecedence(precedence) \
1863 virtual const char *Operator() const { \
1868 #define CYAssignment_(op, name, args...) \
1869 struct CY ## name ## Assign : \
1872 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
1873 CYAssignment(lhs, rhs) \
1877 virtual const char *Operator() const { \
1882 CYPostfix_("++", PostIncrement)
1883 CYPostfix_("--", PostDecrement)
1885 CYPrefix_(true, "delete", Delete)
1886 CYPrefix_(true, "void", Void)
1887 CYPrefix_(true, "typeof", TypeOf)
1888 CYPrefix_(false, "++", PreIncrement)
1889 CYPrefix_(false, "--", PreDecrement)
1890 CYPrefix_(false, "+", Affirm)
1891 CYPrefix_(false, "-", Negate)
1892 CYPrefix_(false, "~", BitwiseNot)
1893 CYPrefix_(false, "!", LogicalNot)
1895 CYInfix_(false, 5, "*", Multiply)
1896 CYInfix_(false, 5, "/", Divide)
1897 CYInfix_(false, 5, "%", Modulus)
1898 CYInfix_(false, 6, "+", Add, CYReplace)
1899 CYInfix_(false, 6, "-", Subtract)
1900 CYInfix_(false, 7, "<<", ShiftLeft)
1901 CYInfix_(false, 7, ">>", ShiftRightSigned)
1902 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
1903 CYInfix_(false, 8, "<", Less)
1904 CYInfix_(false, 8, ">", Greater)
1905 CYInfix_(false, 8, "<=", LessOrEqual)
1906 CYInfix_(false, 8, ">=", GreaterOrEqual)
1907 CYInfix_(true, 8, "instanceof", InstanceOf)
1908 CYInfix_(true, 8, "in", In)
1909 CYInfix_(false, 9, "==", Equal)
1910 CYInfix_(false, 9, "!=", NotEqual)
1911 CYInfix_(false, 9, "===", Identical)
1912 CYInfix_(false, 9, "!==", NotIdentical)
1913 CYInfix_(false, 10, "&", BitwiseAnd)
1914 CYInfix_(false, 11, "^", BitwiseXOr)
1915 CYInfix_(false, 12, "|", BitwiseOr)
1916 CYInfix_(false, 13, "&&", LogicalAnd)
1917 CYInfix_(false, 14, "||", LogicalOr)
1919 CYAssignment_("=", )
1920 CYAssignment_("*=", Multiply)
1921 CYAssignment_("/=", Divide)
1922 CYAssignment_("%=", Modulus)
1923 CYAssignment_("+=", Add)
1924 CYAssignment_("-=", Subtract)
1925 CYAssignment_("<<=", ShiftLeft)
1926 CYAssignment_(">>=", ShiftRightSigned)
1927 CYAssignment_(">>>=", ShiftRightUnsigned)
1928 CYAssignment_("&=", BitwiseAnd)
1929 CYAssignment_("^=", BitwiseXOr)
1930 CYAssignment_("|=", BitwiseOr)
1932 #endif/*CYCRIPT_PARSER_HPP*/