1 /* Cycript - Optimizing JavaScript Compiler/Runtime
2 * Copyright (C) 2009-2013 Jay Freeman (saurik)
5 /* GNU General Public License, Version 3 {{{ */
7 * Cycript is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published
9 * by the Free Software Foundation, either version 3 of the License,
10 * or (at your option) any later version.
12 * Cycript is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU 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 "Pooling.hpp"
37 #include "Options.hpp"
45 virtual void Output(struct CYOutput &out) const = 0;
63 CYOutput(std::ostream &out, CYOptions &options) :
73 void Check(char value);
76 CYOutput &operator <<(char rhs);
77 CYOutput &operator <<(const char *rhs);
79 _finline CYOutput &operator <<(const CYThing *rhs) {
85 _finline CYOutput &operator <<(const CYThing &rhs) {
91 struct CYPropertyName {
92 virtual void PropertyName(CYOutput &out) const = 0;
94 virtual ~CYPropertyName() {
109 CYNoBrace = (1 << 0),
110 CYNoFunction = (1 << 1),
113 CYNoRightHand = (1 << 4),
114 CYNoDangle = (1 << 5),
115 CYNoInteger = (1 << 6),
116 CYNoBF = (CYNoBrace | CYNoFunction),
119 _finline CYFlags operator ~(CYFlags rhs) {
120 return static_cast<CYFlags>(~static_cast<unsigned>(rhs));
123 _finline CYFlags operator &(CYFlags lhs, CYFlags rhs) {
124 return static_cast<CYFlags>(static_cast<unsigned>(lhs) & static_cast<unsigned>(rhs));
127 _finline CYFlags operator |(CYFlags lhs, CYFlags rhs) {
128 return static_cast<CYFlags>(static_cast<unsigned>(lhs) | static_cast<unsigned>(rhs));
131 _finline CYFlags &operator |=(CYFlags &lhs, CYFlags rhs) {
132 return lhs = lhs | rhs;
135 _finline CYFlags CYLeft(CYFlags flags) {
136 return flags & ~(CYNoDangle | CYNoInteger);
139 _finline CYFlags CYRight(CYFlags flags) {
140 return flags & ~CYNoBF;
143 _finline CYFlags CYCenter(CYFlags flags) {
144 return CYLeft(CYRight(flags));
150 virtual ~CYStatement() {
153 void Single(CYOutput &out, CYFlags flags) const;
154 void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
156 virtual CYStatement *Replace(CYContext &context) = 0;
159 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
162 struct CYStatements {
172 operator CYStatement *() const {
176 CYStatements &operator ->*(CYStatement *next) {
178 if (first_ == NULL) {
181 } else for (;; last_ = last_->next_)
182 if (last_->next_ == NULL) {
192 virtual ~CYClassName() {
195 virtual CYExpression *ClassName(CYContext &context, bool object) = 0;
196 virtual void ClassName(CYOutput &out, bool object) const = 0;
206 CYWord(const char *word) :
211 void Set(const char *value) {
215 virtual const char *Word() const;
216 virtual void Output(CYOutput &out) const;
218 virtual CYExpression *ClassName(CYContext &context, bool object);
219 virtual void ClassName(CYOutput &out, bool object) const;
220 virtual void PropertyName(CYOutput &out) const;
223 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
225 return lhs << rhs.Word();
228 struct CYIdentifier :
229 CYNext<CYIdentifier>,
232 CYIdentifier *replace_;
236 CYIdentifier(const char *word) :
244 virtual const char *Word() const;
245 CYIdentifier *Replace(CYContext &context);
253 CYComment(const char *value) :
258 virtual CYStatement *Replace(CYContext &context);
259 virtual void Output(CYOutput &out, CYFlags flags) const;
266 CYStatement *statement_;
268 CYLabel(CYIdentifier *name, CYStatement *statement) :
270 statement_(statement)
274 virtual CYStatement *Replace(CYContext &context);
275 virtual void Output(CYOutput &out, CYFlags flags) const;
278 struct CYCStringLess :
279 std::binary_function<const char *, const char *, bool>
281 _finline bool operator ()(const char *lhs, const char *rhs) const {
282 return strcmp(lhs, rhs) < 0;
286 struct CYIdentifierValueLess :
287 std::binary_function<CYIdentifier *, CYIdentifier *, bool>
289 _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
290 return CYCStringLess()(lhs->Word(), rhs->Word());
294 enum CYIdentifierFlags {
295 CYIdentifierArgument,
296 CYIdentifierVariable,
302 typedef std::set<const char *, CYCStringLess> CYCStringSet;
303 typedef std::set<CYIdentifier *, CYIdentifierValueLess> CYIdentifierValueSet;
304 typedef std::map<CYIdentifier *, CYIdentifierFlags> CYIdentifierAddressFlagsMap;
306 struct CYIdentifierUsage {
307 CYIdentifier *identifier_;
311 typedef std::vector<CYIdentifierUsage> CYIdentifierUsageVector;
317 CYStatement *&statements_;
321 CYIdentifierAddressFlagsMap internal_;
322 CYIdentifierValueSet identifiers_;
324 CYScope(bool transparent, CYContext &context, CYStatement *&statements);
329 void Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags);
330 virtual CYIdentifier *Lookup(CYContext &context, CYIdentifier *identifier);
331 void Merge(CYContext &context, CYIdentifier *identifier);
332 void Scope(CYContext &context, CYStatement *&statements);
338 CYStatement *statements_;
340 CYProgram(CYStatement *statements) :
341 statements_(statements)
345 virtual void Replace(CYContext &context);
346 virtual void Output(CYOutput &out) const;
358 CYIdentifierUsageVector rename_;
360 CYNonLocal *nonlocal_;
361 CYNonLocal *nextlocal_;
364 CYContext(CYOptions &options) :
374 virtual ~CYContext() {
377 template <typename Type_>
378 void ReplaceAll(Type_ *&values) {
379 Type_ **last(&values);
380 CYForEach (next, values) {
381 Replace(*last = next);
383 last = &(*last)->next_;
387 template <typename Type_>
388 void Replace(Type_ *&value) {
389 for (;;) if (value == NULL)
392 Type_ *replace(value->Replace(*this));
393 if (replace != value)
399 void NonLocal(CYStatement *&statements);
400 CYIdentifier *Unique();
404 CYIdentifier *identifier_;
411 CYIdentifier *Target(CYContext &context) {
412 if (identifier_ == NULL)
413 identifier_ = context.Unique();
421 CYIdentifier *identifier_;
428 CYIdentifier *Identifier(CYContext &context) {
430 return next_->Identifier(context);
431 if (identifier_ == NULL)
432 identifier_ = context.Unique();
441 CYStatement *statements_;
443 CYBlock(CYStatement *statements) :
444 statements_(statements)
448 operator CYStatement *() const {
452 void AddPrev(CYStatement *statement) {
453 CYSetLast(statement) = statements_;
454 statements_ = statement;
457 virtual CYStatement *Replace(CYContext &context);
459 virtual void Output(CYOutput &out) const;
460 virtual void Output(CYOutput &out, CYFlags flags) const;
468 public std::streambuf
471 CYBuffer(const char *start, const char *end) {
472 setg(const_cast<char *>(start), const_cast<char *>(start), const_cast<char *>(end));
477 CYStream(const char *start, const char *end) :
478 std::istream(&buffer_),
484 struct CYForInitialiser {
485 virtual ~CYForInitialiser() {
488 virtual CYExpression *Replace(CYContext &context) = 0;
489 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
492 struct CYForInInitialiser {
493 virtual ~CYForInInitialiser() {
496 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
497 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value) = 0;
499 virtual CYExpression *Replace(CYContext &context) = 0;
500 virtual CYAssignment *Assignment(CYContext &context) = 0;
502 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
508 struct CYExpression :
514 virtual int Precedence() const = 0;
516 virtual bool RightHand() const {
520 virtual void ForIn(CYOutput &out, CYFlags flags) const;
521 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
523 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
525 virtual void Output(CYOutput &out) const;
526 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
527 void Output(CYOutput &out, int precedence, CYFlags flags) const;
529 virtual CYExpression *ClassName(CYContext &context, bool object);
530 virtual void ClassName(CYOutput &out, bool object) const;
532 virtual CYExpression *Replace(CYContext &context) = 0;
533 virtual CYAssignment *Assignment(CYContext &context);
535 virtual CYExpression *Primitive(CYContext &context) {
539 virtual CYNumber *Number(CYContext &context) {
543 virtual CYString *String(CYContext &context) {
547 virtual const char *Word() const {
552 #define CYAlphabetic(value) \
553 virtual bool Alphabetic() const { \
557 #define CYPrecedence(value) \
558 static const int Precedence_ = value; \
559 virtual int Precedence() const { \
560 return Precedence_; \
563 #define CYRightHand(value) \
564 virtual bool RightHand() const { \
571 CYExpression *expression_;
574 CYCompound(CYExpression *expression, CYExpression *next = NULL) :
575 expression_(expression),
578 if (expression_ == NULL)
580 _assert(expression_ != NULL);
585 virtual CYExpression *Replace(CYContext &context);
586 void Output(CYOutput &out, CYFlags flags) const;
588 virtual CYExpression *Primitive(CYContext &context);
591 struct CYDeclaration;
593 struct CYFunctionParameter :
594 CYNext<CYFunctionParameter>,
597 CYForInInitialiser *initialiser_;
599 CYFunctionParameter(CYForInInitialiser *initialiser, CYFunctionParameter *next = NULL) :
600 CYNext<CYFunctionParameter>(next),
601 initialiser_(initialiser)
605 void Replace(CYContext &context, CYBlock &code);
606 void Output(CYOutput &out) const;
609 struct CYComprehension :
610 CYNext<CYComprehension>,
613 CYComprehension(CYComprehension *next = NULL) :
614 CYNext<CYComprehension>(next)
618 CYComprehension *Modify(CYComprehension *next) {
623 virtual const char *Name() const = 0;
625 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
626 CYFunctionParameter *Parameters(CYContext &context) const;
627 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
628 virtual void Output(CYOutput &out) const = 0;
631 struct CYForInComprehension :
637 CYForInComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
638 CYComprehension(next),
644 virtual const char *Name() const {
645 return name_->Word();
648 virtual CYFunctionParameter *Parameter(CYContext &context) const;
649 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
650 virtual void Output(CYOutput &out) const;
653 struct CYForOfComprehension :
659 CYForOfComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
660 CYComprehension(next),
666 virtual const char *Name() const {
667 return name_->Word();
670 virtual CYFunctionParameter *Parameter(CYContext &context) const;
671 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
672 virtual void Output(CYOutput &out) const;
675 struct CYIfComprehension :
680 CYIfComprehension(CYExpression *test, CYComprehension *next = NULL) :
681 CYComprehension(next),
686 virtual const char *Name() const {
690 virtual CYFunctionParameter *Parameter(CYContext &context) const;
691 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
692 virtual void Output(CYOutput &out) const;
695 struct CYArrayComprehension :
698 CYExpression *expression_;
699 CYComprehension *comprehensions_;
701 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
702 expression_(expression),
703 comprehensions_(comprehensions)
709 virtual CYExpression *Replace(CYContext &context);
710 virtual void Output(CYOutput &out, CYFlags flags) const;
719 virtual CYExpression *Primitive(CYContext &context) {
727 virtual CYExpression *Replace(CYContext &context);
741 CYRange(uint64_t lo, uint64_t hi) :
746 bool operator [](uint8_t value) const {
747 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
750 void operator()(uint8_t value) {
753 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
757 extern CYRange DigitRange_;
758 extern CYRange WordStartRange_;
759 extern CYRange WordEndRange_;
774 CYString(const char *value) :
780 CYString(const char *value, size_t size) :
786 CYString(const CYWord *word) :
787 value_(word->Word()),
788 size_(strlen(value_))
792 const char *Value() const {
796 virtual const char *Word() const;
798 virtual CYNumber *Number(CYContext &context);
799 virtual CYString *String(CYContext &context);
801 CYString *Concat(CYContext &out, CYString *rhs) const;
802 virtual void Output(CYOutput &out, CYFlags flags) const;
803 virtual void PropertyName(CYOutput &out) const;
812 CYNumber(double value) :
817 double Value() const {
821 virtual CYNumber *Number(CYContext &context);
822 virtual CYString *String(CYContext &context);
824 virtual void Output(CYOutput &out, CYFlags flags) const;
825 virtual void PropertyName(CYOutput &out) const;
833 CYRegEx(const char *value) :
838 const char *Value() const {
842 virtual void Output(CYOutput &out, CYFlags flags) const;
854 virtual CYNumber *Number(CYContext &context);
855 virtual CYString *String(CYContext &context);
857 virtual void Output(CYOutput &out, CYFlags flags) const;
869 virtual CYExpression *Replace(CYContext &context);
870 virtual void Output(CYOutput &out, CYFlags flags) const;
876 virtual bool Value() const = 0;
877 virtual void Output(CYOutput &out, CYFlags flags) const;
889 virtual bool Value() const {
893 virtual CYNumber *Number(CYContext &context);
894 virtual CYString *String(CYContext &context);
906 virtual bool Value() const {
910 virtual CYNumber *Number(CYContext &context);
911 virtual CYString *String(CYContext &context);
919 CYVariable(CYIdentifier *name) :
924 CYVariable(const char *name) :
925 name_(new($pool) CYIdentifier(name))
932 virtual CYExpression *Replace(CYContext &context);
933 virtual void Output(CYOutput &out, CYFlags flags) const;
941 CYPrefix(CYExpression *rhs) :
946 virtual bool Alphabetic() const = 0;
947 virtual const char *Operator() const = 0;
951 virtual CYExpression *Replace(CYContext &context);
952 virtual void Output(CYOutput &out, CYFlags flags) const;
961 CYInfix(CYExpression *lhs, CYExpression *rhs) :
967 void SetLeft(CYExpression *lhs) {
971 virtual bool Alphabetic() const = 0;
972 virtual const char *Operator() const = 0;
974 virtual CYExpression *Replace(CYContext &context);
975 virtual void Output(CYOutput &out, CYFlags flags) const;
983 CYPostfix(CYExpression *lhs) :
988 virtual const char *Operator() const = 0;
992 virtual CYExpression *Replace(CYContext &context);
993 virtual void Output(CYOutput &out, CYFlags flags) const;
996 struct CYAssignment :
1002 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
1008 void SetLeft(CYExpression *lhs) {
1012 virtual const char *Operator() const = 0;
1016 virtual CYExpression *Replace(CYContext &context);
1017 virtual void Output(CYOutput &out, CYFlags flags) const;
1025 CYExpression *value_;
1027 CYArgument(CYExpression *value, CYArgument *next = NULL) :
1028 CYNext<CYArgument>(next),
1034 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
1035 CYNext<CYArgument>(next),
1041 CYArgument *Replace(CYContext &context);
1042 void Output(CYOutput &out) const;
1058 CYExpression *case_;
1059 CYStatement *statements_;
1061 CYClause(CYExpression *_case, CYStatement *statements) :
1063 statements_(statements)
1067 void Replace(CYContext &context);
1068 virtual void Output(CYOutput &out) const;
1075 CYExpression *value_;
1077 CYElement(CYExpression *value, CYElement *next) :
1078 CYNext<CYElement>(next),
1083 void Replace(CYContext &context);
1084 void Output(CYOutput &out) const;
1090 CYElement *elements_;
1092 CYArray(CYElement *elements = NULL) :
1097 virtual CYExpression *Replace(CYContext &context);
1098 virtual void Output(CYOutput &out, CYFlags flags) const;
1105 CYPropertyName *name_;
1106 CYExpression *value_;
1108 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1109 CYNext<CYProperty>(next),
1115 void Replace(CYContext &context);
1116 virtual void Output(CYOutput &out) const;
1119 struct CYDeclaration :
1122 CYIdentifier *identifier_;
1123 CYExpression *initialiser_;
1125 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
1126 identifier_(identifier),
1127 initialiser_(initialiser)
1131 virtual void ForIn(CYOutput &out, CYFlags flags) const;
1132 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
1134 virtual CYExpression *Replace(CYContext &context);
1136 virtual CYAssignment *Assignment(CYContext &context);
1137 CYVariable *Variable(CYContext &context);
1139 virtual void Output(CYOutput &out, CYFlags flags) const;
1142 struct CYDeclarations :
1143 CYNext<CYDeclarations>,
1146 CYDeclaration *declaration_;
1148 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1149 CYNext<CYDeclarations>(next),
1150 declaration_(declaration)
1154 void Replace(CYContext &context);
1156 CYCompound *Compound(CYContext &context);
1157 CYProperty *Property(CYContext &context);
1158 CYArgument *Argument(CYContext &context);
1159 CYFunctionParameter *Parameter(CYContext &context);
1161 virtual void Output(CYOutput &out) const;
1162 virtual void Output(CYOutput &out, CYFlags flags) const;
1165 struct CYForDeclarations :
1168 CYDeclarations *declarations_;
1170 CYForDeclarations(CYDeclarations *declarations) :
1171 declarations_(declarations)
1175 virtual CYCompound *Replace(CYContext &context);
1176 virtual void Output(CYOutput &out, CYFlags flags) const;
1182 CYDeclarations *declarations_;
1184 CYVar(CYDeclarations *declarations) :
1185 declarations_(declarations)
1189 virtual CYStatement *Replace(CYContext &context);
1190 virtual void Output(CYOutput &out, CYFlags flags) const;
1193 struct CYLetStatement :
1196 CYDeclarations *declarations_;
1199 CYLetStatement(CYDeclarations *declarations, CYStatement *code) :
1200 declarations_(declarations),
1205 virtual CYStatement *Replace(CYContext &context);
1206 virtual void Output(CYOutput &out, CYFlags flags) const;
1212 CYForInitialiser *initialiser_;
1213 CYExpression *test_;
1214 CYExpression *increment_;
1217 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1218 initialiser_(initialiser),
1220 increment_(increment),
1225 virtual CYStatement *Replace(CYContext &context);
1226 virtual void Output(CYOutput &out, CYFlags flags) const;
1232 CYForInInitialiser *initialiser_;
1236 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1237 initialiser_(initialiser),
1243 virtual CYStatement *Replace(CYContext &context);
1244 virtual void Output(CYOutput &out, CYFlags flags) const;
1250 CYForInInitialiser *initialiser_;
1254 CYForOf(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1255 initialiser_(initialiser),
1261 virtual CYStatement *Replace(CYContext &context);
1262 virtual void Output(CYOutput &out, CYFlags flags) const;
1268 CYProperty *properties_;
1270 CYObject(CYProperty *properties = NULL) :
1271 properties_(properties)
1275 virtual CYExpression *Replace(CYContext &context);
1276 void Output(CYOutput &out, CYFlags flags) const;
1282 CYExpression *object_;
1283 CYExpression *property_;
1285 CYMember(CYExpression *object, CYExpression *property) :
1291 void SetLeft(CYExpression *object) {
1296 struct CYDirectMember :
1299 CYDirectMember(CYExpression *object, CYExpression *property) :
1300 CYMember(object, property)
1307 virtual CYExpression *Replace(CYContext &context);
1308 virtual void Output(CYOutput &out, CYFlags flags) const;
1311 struct CYIndirectMember :
1314 CYIndirectMember(CYExpression *object, CYExpression *property) :
1315 CYMember(object, property)
1322 virtual CYExpression *Replace(CYContext &context);
1323 virtual void Output(CYOutput &out, CYFlags flags) const;
1332 CYExpression *constructor_;
1333 CYArgument *arguments_;
1335 New(CYExpression *constructor, CYArgument *arguments) :
1336 constructor_(constructor),
1337 arguments_(arguments)
1341 virtual int Precedence() const {
1342 return arguments_ == NULL ? 2 : 1;
1347 virtual CYExpression *Replace(CYContext &context);
1348 virtual void Output(CYOutput &out, CYFlags flags) const;
1350 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1358 CYExpression *function_;
1359 CYArgument *arguments_;
1361 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1362 function_(function),
1363 arguments_(arguments)
1370 virtual CYExpression *Replace(CYContext &context);
1371 virtual void Output(CYOutput &out, CYFlags flags) const;
1373 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1378 struct CYRubyBlock :
1381 CYExpression *call_;
1384 CYRubyBlock(CYExpression *call, CYRubyProc *proc) :
1393 virtual CYExpression *Replace(CYContext &context);
1394 virtual void Output(CYOutput &out, CYFlags flags) const;
1400 CYExpression *test_;
1402 CYStatement *false_;
1404 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1411 virtual CYStatement *Replace(CYContext &context);
1412 virtual void Output(CYOutput &out, CYFlags flags) const;
1418 CYExpression *test_;
1421 CYDoWhile(CYExpression *test, CYStatement *code) :
1427 virtual CYStatement *Replace(CYContext &context);
1428 virtual void Output(CYOutput &out, CYFlags flags) const;
1434 CYExpression *test_;
1437 CYWhile(CYExpression *test, CYStatement *code) :
1443 virtual CYStatement *Replace(CYContext &context);
1444 virtual void Output(CYOutput &out, CYFlags flags) const;
1447 // XXX: this should be split up into CYAnonymousFunction and CYNamedFunction (subclass)
1449 CYIdentifier *name_;
1450 CYFunctionParameter *parameters_;
1453 CYNonLocal *nonlocal_;
1456 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1458 parameters_(parameters),
1464 virtual ~CYFunction() {
1467 void Inject(CYContext &context);
1468 virtual void Replace_(CYContext &context, bool outer);
1469 virtual void Output(CYOutput &out, CYFlags flags) const;
1472 // XXX: this should be split up into CYAnonymousFunctionExpression and CYNamedFunctionExpression
1473 struct CYFunctionExpression :
1477 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1478 CYFunction(name, parameters, statements)
1485 virtual CYExpression *Replace(CYContext &context);
1486 virtual void Output(CYOutput &out, CYFlags flags) const;
1489 // XXX: this should derive from CYAnonymousFunction
1494 CYFatArrow(CYFunctionParameter *parameters, CYStatement *statements) :
1495 CYFunction(NULL, parameters, statements)
1502 virtual CYExpression *Replace(CYContext &context);
1503 virtual void Output(CYOutput &out, CYFlags flags) const;
1506 // XXX: this should derive from CYAnonymousFunctionExpression
1508 CYFunctionExpression
1510 CYRubyProc(CYFunctionParameter *parameters, CYStatement *statements) :
1511 CYFunctionExpression(NULL, parameters, statements)
1515 virtual CYExpression *Replace(CYContext &context);
1516 virtual void Output(CYOutput &out, CYFlags flags) const;
1519 // XXX: this should derive from CYNamedFunction
1520 struct CYFunctionStatement :
1524 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1525 CYFunction(name, parameters, statements)
1529 virtual CYStatement *Replace(CYContext &context);
1530 virtual void Output(CYOutput &out, CYFlags flags) const;
1536 CYExpression *expression_;
1538 CYExpress(CYExpression *expression) :
1539 expression_(expression)
1541 if (expression_ == NULL)
1545 virtual CYStatement *Replace(CYContext &context);
1546 virtual void Output(CYOutput &out, CYFlags flags) const;
1552 CYIdentifier *label_;
1554 CYContinue(CYIdentifier *label) :
1559 virtual CYStatement *Replace(CYContext &context);
1560 virtual void Output(CYOutput &out, CYFlags flags) const;
1566 CYIdentifier *label_;
1568 CYBreak(CYIdentifier *label) :
1573 virtual CYStatement *Replace(CYContext &context);
1574 virtual void Output(CYOutput &out, CYFlags flags) const;
1580 CYExpression *value_;
1582 CYReturn(CYExpression *value) :
1587 virtual CYStatement *Replace(CYContext &context);
1588 virtual void Output(CYOutput &out, CYFlags flags) const;
1594 virtual CYStatement *Replace(CYContext &context);
1595 virtual void Output(CYOutput &out, CYFlags flags) const;
1603 CYFinally(CYStatement *statements) :
1608 void Replace(CYContext &context);
1609 virtual void Output(CYOutput &out) const;
1612 struct CYTypeSpecifier :
1615 virtual CYExpression *Replace(CYContext &context) = 0;
1618 struct CYTypeError :
1624 virtual CYExpression *Replace(CYContext &context);
1625 virtual void Output(CYOutput &out) const;
1634 virtual CYExpression *Replace(CYContext &context);
1635 virtual void Output(CYOutput &out) const;
1638 struct CYTypeVariable :
1641 CYIdentifier *name_;
1643 CYTypeVariable(CYIdentifier *name) :
1648 CYTypeVariable(const char *name) :
1649 name_(new($pool) CYIdentifier(name))
1653 virtual CYExpression *Replace(CYContext &context);
1654 virtual void Output(CYOutput &out) const;
1657 struct CYTypeUnsigned :
1660 CYTypeSpecifier *specifier_;
1662 CYTypeUnsigned(CYTypeSpecifier *specifier) :
1663 specifier_(specifier)
1667 virtual CYExpression *Replace(CYContext &context);
1668 virtual void Output(CYOutput &out) const;
1671 struct CYTypeSigned :
1674 CYTypeSpecifier *specifier_;
1676 CYTypeSigned(CYTypeSpecifier *specifier) :
1677 specifier_(specifier)
1681 virtual CYExpression *Replace(CYContext &context);
1682 virtual void Output(CYOutput &out) const;
1688 CYTypeSpecifier *specifier_;
1690 CYTypeLong(CYTypeSpecifier *specifier) :
1691 specifier_(specifier)
1695 virtual CYExpression *Replace(CYContext &context);
1696 virtual void Output(CYOutput &out) const;
1699 struct CYTypeShort :
1702 CYTypeSpecifier *specifier_;
1704 CYTypeShort(CYTypeSpecifier *specifier) :
1705 specifier_(specifier)
1709 virtual CYExpression *Replace(CYContext &context);
1710 virtual void Output(CYOutput &out) const;
1713 struct CYTypeModifier :
1714 CYNext<CYTypeModifier>
1716 CYTypeModifier(CYTypeModifier *next) :
1717 CYNext<CYTypeModifier>(next)
1721 virtual int Precedence() const = 0;
1723 virtual CYExpression *Replace_(CYContext &context, CYExpression *type) = 0;
1724 CYExpression *Replace(CYContext &context, CYExpression *type);
1726 virtual void Output(CYOutput &out, CYIdentifier *identifier) const = 0;
1727 void Output(CYOutput &out, int precedence, CYIdentifier *identifier) const;
1730 struct CYTypeArrayOf :
1733 CYExpression *size_;
1735 CYTypeArrayOf(CYExpression *size, CYTypeModifier *next = NULL) :
1736 CYTypeModifier(next),
1743 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1744 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1747 struct CYTypeConstant :
1750 CYTypeConstant(CYTypeModifier *next = NULL) :
1751 CYTypeModifier(next)
1757 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1758 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1761 struct CYTypePointerTo :
1764 CYTypePointerTo(CYTypeModifier *next = NULL) :
1765 CYTypeModifier(next)
1771 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1772 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1775 struct CYTypeVolatile :
1778 CYTypeVolatile(CYTypeModifier *next = NULL) :
1779 CYTypeModifier(next)
1785 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1786 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1789 struct CYTypedIdentifier :
1790 CYNext<CYTypedIdentifier>,
1793 CYIdentifier *identifier_;
1794 CYTypeSpecifier *specifier_;
1795 CYTypeModifier *modifier_;
1797 CYTypedIdentifier(CYIdentifier *identifier = NULL) :
1798 identifier_(identifier),
1804 CYTypedIdentifier(CYTypeSpecifier *specifier, CYTypeModifier *modifier = NULL) :
1806 specifier_(specifier),
1811 inline CYTypedIdentifier *Modify(CYTypeModifier *modifier) {
1812 CYSetLast(modifier_) = modifier;
1816 virtual CYExpression *Replace(CYContext &context);
1817 virtual void Output(CYOutput &out) const;
1820 struct CYEncodedType :
1823 CYTypedIdentifier *typed_;
1825 CYEncodedType(CYTypedIdentifier *typed) :
1832 virtual CYExpression *Replace(CYContext &context);
1833 virtual void Output(CYOutput &out, CYFlags flags) const;
1836 struct CYTypedParameter :
1837 CYNext<CYTypedParameter>,
1840 CYTypedIdentifier *typed_;
1842 CYTypedParameter(CYTypedIdentifier *typed, CYTypedParameter *next) :
1843 CYNext<CYTypedParameter>(next),
1848 CYArgument *Argument(CYContext &context);
1849 CYFunctionParameter *Parameters(CYContext &context);
1850 CYExpression *TypeSignature(CYContext &context, CYExpression *prefix);
1852 virtual void Output(CYOutput &out) const;
1858 CYTypedIdentifier *typed_;
1859 CYTypedParameter *parameters_;
1860 CYStatement *statements_;
1862 CYLambda(CYTypedIdentifier *typed, CYTypedParameter *parameters, CYStatement *statements) :
1864 parameters_(parameters),
1865 statements_(statements)
1871 virtual CYExpression *Replace(CYContext &context);
1872 virtual void Output(CYOutput &out, CYFlags flags) const;
1875 struct CYTypeDefinition :
1878 CYTypedIdentifier *typed_;
1880 CYTypeDefinition(CYTypedIdentifier *typed) :
1885 virtual CYStatement *Replace(CYContext &context);
1886 virtual void Output(CYOutput &out, CYFlags flags) const;
1889 struct CYTypeBlockWith :
1892 CYTypedParameter *parameters_;
1894 CYTypeBlockWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
1895 CYTypeModifier(next),
1896 parameters_(parameters)
1902 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1903 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1906 struct CYTypeFunctionWith :
1909 CYTypedParameter *parameters_;
1911 CYTypeFunctionWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
1912 CYTypeModifier(next),
1913 parameters_(parameters)
1919 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1920 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1929 CYIdentifier *name_;
1932 Catch(CYIdentifier *name, CYStatement *statements) :
1938 void Replace(CYContext &context);
1939 virtual void Output(CYOutput &out) const;
1947 CYFinally *finally_;
1949 Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
1956 virtual CYStatement *Replace(CYContext &context);
1957 virtual void Output(CYOutput &out, CYFlags flags) const;
1963 CYExpression *value_;
1965 Throw(CYExpression *value = NULL) :
1970 virtual CYStatement *Replace(CYContext &context);
1971 virtual void Output(CYOutput &out, CYFlags flags) const;
1979 CYExpression *scope_;
1982 CYWith(CYExpression *scope, CYStatement *code) :
1988 virtual CYStatement *Replace(CYContext &context);
1989 virtual void Output(CYOutput &out, CYFlags flags) const;
1995 CYExpression *value_;
1998 CYSwitch(CYExpression *value, CYClause *clauses) :
2004 virtual CYStatement *Replace(CYContext &context);
2005 virtual void Output(CYOutput &out, CYFlags flags) const;
2015 virtual CYStatement *Replace(CYContext &context);
2016 virtual void Output(CYOutput &out, CYFlags flags) const;
2019 struct CYCondition :
2022 CYExpression *test_;
2023 CYExpression *true_;
2024 CYExpression *false_;
2026 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
2035 virtual CYExpression *Replace(CYContext &context);
2036 virtual void Output(CYOutput &out, CYFlags flags) const;
2039 struct CYAddressOf :
2042 CYAddressOf(CYExpression *rhs) :
2047 virtual const char *Operator() const {
2053 virtual CYExpression *Replace(CYContext &context);
2059 CYIndirect(CYExpression *rhs) :
2064 virtual const char *Operator() const {
2070 virtual CYExpression *Replace(CYContext &context);
2074 virtual CYExpression *Replace(CYContext &context);
2076 #define CYPostfix_(op, name, args...) \
2077 struct CY ## name : \
2080 CY ## name(CYExpression *lhs) : \
2085 virtual const char *Operator() const { \
2090 #define CYPrefix_(alphabetic, op, name, args...) \
2091 struct CY ## name : \
2094 CY ## name(CYExpression *rhs) : \
2099 CYAlphabetic(alphabetic) \
2101 virtual const char *Operator() const { \
2106 #define CYInfix_(alphabetic, precedence, op, name, args...) \
2107 struct CY ## name : \
2110 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
2115 CYAlphabetic(alphabetic) \
2116 CYPrecedence(precedence) \
2118 virtual const char *Operator() const { \
2123 #define CYAssignment_(op, name, args...) \
2124 struct CY ## name ## Assign : \
2127 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
2128 CYAssignment(lhs, rhs) \
2132 virtual const char *Operator() const { \
2137 CYPostfix_("++", PostIncrement)
2138 CYPostfix_("--", PostDecrement)
2140 CYPrefix_(true, "delete", Delete)
2141 CYPrefix_(true, "void", Void)
2142 CYPrefix_(true, "typeof", TypeOf)
2143 CYPrefix_(false, "++", PreIncrement)
2144 CYPrefix_(false, "--", PreDecrement)
2145 CYPrefix_(false, "+", Affirm)
2146 CYPrefix_(false, "-", Negate)
2147 CYPrefix_(false, "~", BitwiseNot)
2148 CYPrefix_(false, "!", LogicalNot)
2150 CYInfix_(false, 5, "*", Multiply, CYReplace)
2151 CYInfix_(false, 5, "/", Divide)
2152 CYInfix_(false, 5, "%", Modulus)
2153 CYInfix_(false, 6, "+", Add, CYReplace)
2154 CYInfix_(false, 6, "-", Subtract)
2155 CYInfix_(false, 7, "<<", ShiftLeft)
2156 CYInfix_(false, 7, ">>", ShiftRightSigned)
2157 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
2158 CYInfix_(false, 8, "<", Less)
2159 CYInfix_(false, 8, ">", Greater)
2160 CYInfix_(false, 8, "<=", LessOrEqual)
2161 CYInfix_(false, 8, ">=", GreaterOrEqual)
2162 CYInfix_(true, 8, "instanceof", InstanceOf)
2163 CYInfix_(true, 8, "in", In)
2164 CYInfix_(false, 9, "==", Equal)
2165 CYInfix_(false, 9, "!=", NotEqual)
2166 CYInfix_(false, 9, "===", Identical)
2167 CYInfix_(false, 9, "!==", NotIdentical)
2168 CYInfix_(false, 10, "&", BitwiseAnd)
2169 CYInfix_(false, 11, "^", BitwiseXOr)
2170 CYInfix_(false, 12, "|", BitwiseOr)
2171 CYInfix_(false, 13, "&&", LogicalAnd)
2172 CYInfix_(false, 14, "||", LogicalOr)
2174 CYAssignment_("=", )
2175 CYAssignment_("*=", Multiply)
2176 CYAssignment_("/=", Divide)
2177 CYAssignment_("%=", Modulus)
2178 CYAssignment_("+=", Add)
2179 CYAssignment_("-=", Subtract)
2180 CYAssignment_("<<=", ShiftLeft)
2181 CYAssignment_(">>=", ShiftRightSigned)
2182 CYAssignment_(">>>=", ShiftRightUnsigned)
2183 CYAssignment_("&=", BitwiseAnd)
2184 CYAssignment_("^=", BitwiseXOr)
2185 CYAssignment_("|=", BitwiseOr)
2187 #endif/*CYCRIPT_PARSER_HPP*/