1 /* Cycript - Optimizing JavaScript Compiler/Runtime
2 * Copyright (C) 2009-2015 Jay Freeman (saurik)
5 /* GNU Affero General Public License, Version 3 {{{ */
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Affero General Public License for more details.
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #ifndef CYCRIPT_PARSER_HPP
23 #define CYCRIPT_PARSER_HPP
36 #include "Location.hpp"
37 #include "Pooling.hpp"
38 #include "Options.hpp"
46 virtual void Output(struct CYOutput &out) const = 0;
64 CYOutput(std::ostream &out, CYOptions &options) :
74 void Check(char value);
77 CYOutput &operator <<(char rhs);
78 CYOutput &operator <<(const char *rhs);
80 _finline CYOutput &operator <<(const CYThing *rhs) {
86 _finline CYOutput &operator <<(const CYThing &rhs) {
92 struct CYPropertyName {
93 virtual void PropertyName(CYOutput &out) const = 0;
95 virtual ~CYPropertyName() {
110 CYNoBrace = (1 << 0),
111 CYNoFunction = (1 << 1),
114 CYNoRightHand = (1 << 4),
115 CYNoDangle = (1 << 5),
116 CYNoInteger = (1 << 6),
117 CYNoBF = (CYNoBrace | CYNoFunction),
120 _finline CYFlags operator ~(CYFlags rhs) {
121 return static_cast<CYFlags>(~static_cast<unsigned>(rhs));
124 _finline CYFlags operator &(CYFlags lhs, CYFlags rhs) {
125 return static_cast<CYFlags>(static_cast<unsigned>(lhs) & static_cast<unsigned>(rhs));
128 _finline CYFlags operator |(CYFlags lhs, CYFlags rhs) {
129 return static_cast<CYFlags>(static_cast<unsigned>(lhs) | static_cast<unsigned>(rhs));
132 _finline CYFlags &operator |=(CYFlags &lhs, CYFlags rhs) {
133 return lhs = lhs | rhs;
136 _finline CYFlags CYLeft(CYFlags flags) {
137 return flags & ~(CYNoDangle | CYNoInteger);
140 _finline CYFlags CYRight(CYFlags flags) {
141 return flags & ~CYNoBF;
144 _finline CYFlags CYCenter(CYFlags flags) {
145 return CYLeft(CYRight(flags));
151 virtual ~CYStatement() {
154 void Single(CYOutput &out, CYFlags flags) const;
155 void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
157 virtual CYStatement *Replace(CYContext &context) = 0;
160 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
163 struct CYStatements {
173 operator CYStatement *() const {
177 CYStatements &operator ->*(CYStatement *next) {
179 if (first_ == NULL) {
182 } else for (;; last_ = last_->next_)
183 if (last_->next_ == NULL) {
193 virtual ~CYClassName() {
196 virtual CYExpression *ClassName(CYContext &context, bool object) = 0;
197 virtual void ClassName(CYOutput &out, bool object) const = 0;
207 CYWord(const char *word) :
212 void Set(const char *value) {
216 virtual const char *Word() const;
217 virtual void Output(CYOutput &out) const;
219 virtual CYExpression *ClassName(CYContext &context, bool object);
220 virtual void ClassName(CYOutput &out, bool object) const;
221 virtual void PropertyName(CYOutput &out) const;
224 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
226 return lhs << rhs.Word();
229 struct CYIdentifier :
230 CYNext<CYIdentifier>,
233 CYIdentifier *replace_;
237 CYIdentifier(const char *word) :
245 virtual const char *Word() const;
246 CYIdentifier *Replace(CYContext &context);
254 CYComment(const char *value) :
259 virtual CYStatement *Replace(CYContext &context);
260 virtual void Output(CYOutput &out, CYFlags flags) const;
267 CYStatement *statement_;
269 CYLabel(CYIdentifier *name, CYStatement *statement) :
271 statement_(statement)
275 virtual CYStatement *Replace(CYContext &context);
276 virtual void Output(CYOutput &out, CYFlags flags) const;
279 struct CYCStringLess :
280 std::binary_function<const char *, const char *, bool>
282 _finline bool operator ()(const char *lhs, const char *rhs) const {
283 return strcmp(lhs, rhs) < 0;
287 struct CYIdentifierValueLess :
288 std::binary_function<CYIdentifier *, CYIdentifier *, bool>
290 _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
291 return CYCStringLess()(lhs->Word(), rhs->Word());
295 enum CYIdentifierFlags {
296 CYIdentifierArgument,
297 CYIdentifierVariable,
303 typedef std::set<const char *, CYCStringLess> CYCStringSet;
304 typedef std::set<CYIdentifier *, CYIdentifierValueLess> CYIdentifierValueSet;
305 typedef std::map<CYIdentifier *, CYIdentifierFlags> CYIdentifierAddressFlagsMap;
307 struct CYIdentifierUsage {
308 CYIdentifier *identifier_;
312 typedef std::vector<CYIdentifierUsage> CYIdentifierUsageVector;
318 CYStatement *&statements_;
322 CYIdentifierAddressFlagsMap internal_;
323 CYIdentifierValueSet identifiers_;
325 CYScope(bool transparent, CYContext &context, CYStatement *&statements);
330 void Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags);
331 virtual CYIdentifier *Lookup(CYContext &context, CYIdentifier *identifier);
332 void Merge(CYContext &context, CYIdentifier *identifier);
333 void Scope(CYContext &context, CYStatement *&statements);
339 CYStatement *statements_;
341 CYProgram(CYStatement *statements) :
342 statements_(statements)
346 virtual void Replace(CYContext &context);
347 virtual void Output(CYOutput &out) const;
359 CYIdentifierUsageVector rename_;
361 CYNonLocal *nonlocal_;
362 CYNonLocal *nextlocal_;
365 CYContext(CYOptions &options) :
375 virtual ~CYContext() {
378 template <typename Type_>
379 void ReplaceAll(Type_ *&values) {
380 Type_ **last(&values);
381 CYForEach (next, values) {
382 Replace(*last = next);
384 last = &(*last)->next_;
388 template <typename Type_>
389 void Replace(Type_ *&value) {
390 for (;;) if (value == NULL)
393 Type_ *replace(value->Replace(*this));
394 if (replace != value)
400 void NonLocal(CYStatement *&statements);
401 CYIdentifier *Unique();
405 CYIdentifier *identifier_;
412 CYIdentifier *Target(CYContext &context) {
413 if (identifier_ == NULL)
414 identifier_ = context.Unique();
422 CYIdentifier *identifier_;
429 CYIdentifier *Identifier(CYContext &context) {
431 return next_->Identifier(context);
432 if (identifier_ == NULL)
433 identifier_ = context.Unique();
442 CYStatement *statements_;
444 CYBlock(CYStatement *statements) :
445 statements_(statements)
449 operator CYStatement *() const {
453 void AddPrev(CYStatement *statement) {
454 CYSetLast(statement) = statements_;
455 statements_ = statement;
458 virtual CYStatement *Replace(CYContext &context);
460 virtual void Output(CYOutput &out) const;
461 virtual void Output(CYOutput &out, CYFlags flags) const;
464 struct CYForInitialiser {
465 virtual ~CYForInitialiser() {
468 virtual CYExpression *Replace(CYContext &context) = 0;
469 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
472 struct CYForInInitialiser {
473 virtual ~CYForInInitialiser() {
476 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
477 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value) = 0;
479 virtual CYExpression *Replace(CYContext &context) = 0;
480 virtual CYAssignment *Assignment(CYContext &context) = 0;
482 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
485 struct CYFunctionParameter;
490 struct CYExpression :
496 virtual int Precedence() const = 0;
498 virtual bool RightHand() const {
502 virtual void ForIn(CYOutput &out, CYFlags flags) const;
503 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
505 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
507 virtual void Output(CYOutput &out) const;
508 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
509 void Output(CYOutput &out, int precedence, CYFlags flags) const;
511 virtual CYExpression *ClassName(CYContext &context, bool object);
512 virtual void ClassName(CYOutput &out, bool object) const;
514 virtual CYExpression *Replace(CYContext &context) = 0;
515 virtual CYAssignment *Assignment(CYContext &context);
517 virtual CYExpression *Primitive(CYContext &context) {
521 virtual CYFunctionParameter *Parameter() const;
522 virtual CYFunctionParameter *Parameters() const;
524 virtual CYNumber *Number(CYContext &context) {
528 virtual CYString *String(CYContext &context) {
532 virtual const char *Word() const {
537 #define CYAlphabetic(value) \
538 virtual bool Alphabetic() const { \
542 #define CYPrecedence(value) \
543 static const int Precedence_ = value; \
544 virtual int Precedence() const { \
545 return Precedence_; \
548 #define CYRightHand(value) \
549 virtual bool RightHand() const { \
556 CYExpression *expression_;
559 CYCompound(CYExpression *expression, CYExpression *next = NULL) :
560 expression_(expression),
563 if (expression_ == NULL)
565 _assert(expression_ != NULL);
570 virtual CYExpression *Replace(CYContext &context);
571 void Output(CYOutput &out, CYFlags flags) const;
573 virtual CYExpression *Primitive(CYContext &context);
574 virtual CYFunctionParameter *Parameters() const;
577 struct CYDeclaration;
579 struct CYFunctionParameter :
580 CYNext<CYFunctionParameter>,
583 CYForInInitialiser *initialiser_;
585 CYFunctionParameter(CYForInInitialiser *initialiser, CYFunctionParameter *next = NULL) :
586 CYNext<CYFunctionParameter>(next),
587 initialiser_(initialiser)
591 void Replace(CYContext &context, CYBlock &code);
592 void Output(CYOutput &out) const;
595 struct CYComprehension :
596 CYNext<CYComprehension>,
599 CYComprehension(CYComprehension *next = NULL) :
600 CYNext<CYComprehension>(next)
604 CYComprehension *Modify(CYComprehension *next) {
609 virtual const char *Name() const = 0;
611 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
612 CYFunctionParameter *Parameters(CYContext &context) const;
613 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
614 virtual void Output(CYOutput &out) const = 0;
617 struct CYForInComprehension :
623 CYForInComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
624 CYComprehension(next),
630 virtual const char *Name() const {
631 return name_->Word();
634 virtual CYFunctionParameter *Parameter(CYContext &context) const;
635 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
636 virtual void Output(CYOutput &out) const;
639 struct CYForOfComprehension :
645 CYForOfComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
646 CYComprehension(next),
652 virtual const char *Name() const {
653 return name_->Word();
656 virtual CYFunctionParameter *Parameter(CYContext &context) const;
657 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
658 virtual void Output(CYOutput &out) const;
661 struct CYIfComprehension :
666 CYIfComprehension(CYExpression *test, CYComprehension *next = NULL) :
667 CYComprehension(next),
672 virtual const char *Name() const {
676 virtual CYFunctionParameter *Parameter(CYContext &context) const;
677 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
678 virtual void Output(CYOutput &out) const;
681 struct CYArrayComprehension :
684 CYExpression *expression_;
685 CYComprehension *comprehensions_;
687 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
688 expression_(expression),
689 comprehensions_(comprehensions)
695 virtual CYExpression *Replace(CYContext &context);
696 virtual void Output(CYOutput &out, CYFlags flags) const;
705 virtual CYExpression *Primitive(CYContext &context) {
713 virtual CYExpression *Replace(CYContext &context);
727 CYRange(uint64_t lo, uint64_t hi) :
732 bool operator [](uint8_t value) const {
733 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
736 void operator()(uint8_t value) {
739 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
743 extern CYRange DigitRange_;
744 extern CYRange WordStartRange_;
745 extern CYRange WordEndRange_;
760 CYString(const char *value) :
766 CYString(const char *value, size_t size) :
772 CYString(const CYWord *word) :
773 value_(word->Word()),
774 size_(strlen(value_))
778 const char *Value() const {
782 virtual const char *Word() const;
784 virtual CYNumber *Number(CYContext &context);
785 virtual CYString *String(CYContext &context);
787 CYString *Concat(CYContext &out, CYString *rhs) const;
788 virtual void Output(CYOutput &out, CYFlags flags) const;
789 virtual void PropertyName(CYOutput &out) const;
798 CYNumber(double value) :
803 double Value() const {
807 virtual CYNumber *Number(CYContext &context);
808 virtual CYString *String(CYContext &context);
810 virtual void Output(CYOutput &out, CYFlags flags) const;
811 virtual void PropertyName(CYOutput &out) const;
819 CYRegEx(const char *value) :
824 const char *Value() const {
828 virtual void Output(CYOutput &out, CYFlags flags) const;
840 virtual CYNumber *Number(CYContext &context);
841 virtual CYString *String(CYContext &context);
843 virtual void Output(CYOutput &out, CYFlags flags) const;
855 virtual CYExpression *Replace(CYContext &context);
856 virtual void Output(CYOutput &out, CYFlags flags) const;
862 virtual bool Value() const = 0;
863 virtual void Output(CYOutput &out, CYFlags flags) const;
875 virtual bool Value() const {
879 virtual CYNumber *Number(CYContext &context);
880 virtual CYString *String(CYContext &context);
892 virtual bool Value() const {
896 virtual CYNumber *Number(CYContext &context);
897 virtual CYString *String(CYContext &context);
905 CYVariable(CYIdentifier *name) :
910 CYVariable(const char *name) :
911 name_(new($pool) CYIdentifier(name))
918 virtual CYExpression *Replace(CYContext &context);
919 virtual void Output(CYOutput &out, CYFlags flags) const;
921 virtual CYFunctionParameter *Parameter() const;
929 CYPrefix(CYExpression *rhs) :
934 virtual bool Alphabetic() const = 0;
935 virtual const char *Operator() const = 0;
939 virtual CYExpression *Replace(CYContext &context);
940 virtual void Output(CYOutput &out, CYFlags flags) const;
949 CYInfix(CYExpression *lhs, CYExpression *rhs) :
955 void SetLeft(CYExpression *lhs) {
959 virtual bool Alphabetic() const = 0;
960 virtual const char *Operator() const = 0;
962 virtual CYExpression *Replace(CYContext &context);
963 virtual void Output(CYOutput &out, CYFlags flags) const;
971 CYPostfix(CYExpression *lhs) :
976 virtual const char *Operator() const = 0;
980 virtual CYExpression *Replace(CYContext &context);
981 virtual void Output(CYOutput &out, CYFlags flags) const;
984 struct CYAssignment :
990 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
996 void SetLeft(CYExpression *lhs) {
1000 virtual const char *Operator() const = 0;
1004 virtual CYExpression *Replace(CYContext &context);
1005 virtual void Output(CYOutput &out, CYFlags flags) const;
1013 CYExpression *value_;
1015 CYArgument(CYExpression *value, CYArgument *next = NULL) :
1016 CYNext<CYArgument>(next),
1022 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
1023 CYNext<CYArgument>(next),
1029 CYArgument *Replace(CYContext &context);
1030 void Output(CYOutput &out) const;
1046 CYExpression *case_;
1047 CYStatement *statements_;
1049 CYClause(CYExpression *_case, CYStatement *statements) :
1051 statements_(statements)
1055 void Replace(CYContext &context);
1056 virtual void Output(CYOutput &out) const;
1063 CYExpression *value_;
1065 CYElement(CYExpression *value, CYElement *next) :
1066 CYNext<CYElement>(next),
1071 void Replace(CYContext &context);
1072 void Output(CYOutput &out) const;
1078 CYElement *elements_;
1080 CYArray(CYElement *elements = NULL) :
1085 virtual CYExpression *Replace(CYContext &context);
1086 virtual void Output(CYOutput &out, CYFlags flags) const;
1093 CYPropertyName *name_;
1094 CYExpression *value_;
1096 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1097 CYNext<CYProperty>(next),
1103 void Replace(CYContext &context);
1104 virtual void Output(CYOutput &out) const;
1107 struct CYDeclaration :
1110 CYIdentifier *identifier_;
1111 CYExpression *initialiser_;
1113 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
1114 identifier_(identifier),
1115 initialiser_(initialiser)
1119 virtual void ForIn(CYOutput &out, CYFlags flags) const;
1120 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
1122 virtual CYExpression *Replace(CYContext &context);
1124 virtual CYAssignment *Assignment(CYContext &context);
1125 CYVariable *Variable(CYContext &context);
1127 virtual void Output(CYOutput &out, CYFlags flags) const;
1130 struct CYDeclarations :
1131 CYNext<CYDeclarations>,
1134 CYDeclaration *declaration_;
1136 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1137 CYNext<CYDeclarations>(next),
1138 declaration_(declaration)
1142 void Replace(CYContext &context);
1144 CYCompound *Compound(CYContext &context);
1145 CYProperty *Property(CYContext &context);
1146 CYArgument *Argument(CYContext &context);
1147 CYFunctionParameter *Parameter(CYContext &context);
1149 virtual void Output(CYOutput &out) const;
1150 virtual void Output(CYOutput &out, CYFlags flags) const;
1153 struct CYForDeclarations :
1156 CYDeclarations *declarations_;
1158 CYForDeclarations(CYDeclarations *declarations) :
1159 declarations_(declarations)
1163 virtual CYCompound *Replace(CYContext &context);
1164 virtual void Output(CYOutput &out, CYFlags flags) const;
1170 CYDeclarations *declarations_;
1172 CYVar(CYDeclarations *declarations) :
1173 declarations_(declarations)
1177 virtual CYStatement *Replace(CYContext &context);
1178 virtual void Output(CYOutput &out, CYFlags flags) const;
1181 struct CYLetStatement :
1184 CYDeclarations *declarations_;
1187 CYLetStatement(CYDeclarations *declarations, CYStatement *code) :
1188 declarations_(declarations),
1193 virtual CYStatement *Replace(CYContext &context);
1194 virtual void Output(CYOutput &out, CYFlags flags) const;
1200 CYForInitialiser *initialiser_;
1201 CYExpression *test_;
1202 CYExpression *increment_;
1205 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1206 initialiser_(initialiser),
1208 increment_(increment),
1213 virtual CYStatement *Replace(CYContext &context);
1214 virtual void Output(CYOutput &out, CYFlags flags) const;
1220 CYForInInitialiser *initialiser_;
1224 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1225 initialiser_(initialiser),
1231 virtual CYStatement *Replace(CYContext &context);
1232 virtual void Output(CYOutput &out, CYFlags flags) const;
1238 CYForInInitialiser *initialiser_;
1242 CYForOf(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1243 initialiser_(initialiser),
1249 virtual CYStatement *Replace(CYContext &context);
1250 virtual void Output(CYOutput &out, CYFlags flags) const;
1256 CYProperty *properties_;
1258 CYObject(CYProperty *properties = NULL) :
1259 properties_(properties)
1263 virtual CYExpression *Replace(CYContext &context);
1264 void Output(CYOutput &out, CYFlags flags) const;
1270 CYExpression *object_;
1271 CYExpression *property_;
1273 CYMember(CYExpression *object, CYExpression *property) :
1279 void SetLeft(CYExpression *object) {
1284 struct CYDirectMember :
1287 CYDirectMember(CYExpression *object, CYExpression *property) :
1288 CYMember(object, property)
1295 virtual CYExpression *Replace(CYContext &context);
1296 virtual void Output(CYOutput &out, CYFlags flags) const;
1299 struct CYIndirectMember :
1302 CYIndirectMember(CYExpression *object, CYExpression *property) :
1303 CYMember(object, property)
1310 virtual CYExpression *Replace(CYContext &context);
1311 virtual void Output(CYOutput &out, CYFlags flags) const;
1320 CYExpression *constructor_;
1321 CYArgument *arguments_;
1323 New(CYExpression *constructor, CYArgument *arguments) :
1324 constructor_(constructor),
1325 arguments_(arguments)
1329 virtual int Precedence() const {
1330 return arguments_ == NULL ? 2 : 1;
1335 virtual CYExpression *Replace(CYContext &context);
1336 virtual void Output(CYOutput &out, CYFlags flags) const;
1338 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1346 CYExpression *function_;
1347 CYArgument *arguments_;
1349 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1350 function_(function),
1351 arguments_(arguments)
1358 virtual CYExpression *Replace(CYContext &context);
1359 virtual void Output(CYOutput &out, CYFlags flags) const;
1361 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1366 struct CYRubyBlock :
1369 CYExpression *call_;
1372 CYRubyBlock(CYExpression *call, CYRubyProc *proc) :
1381 virtual CYExpression *Replace(CYContext &context);
1382 virtual void Output(CYOutput &out, CYFlags flags) const;
1388 CYExpression *test_;
1390 CYStatement *false_;
1392 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1399 virtual CYStatement *Replace(CYContext &context);
1400 virtual void Output(CYOutput &out, CYFlags flags) const;
1406 CYExpression *test_;
1409 CYDoWhile(CYExpression *test, CYStatement *code) :
1415 virtual CYStatement *Replace(CYContext &context);
1416 virtual void Output(CYOutput &out, CYFlags flags) const;
1422 CYExpression *test_;
1425 CYWhile(CYExpression *test, CYStatement *code) :
1431 virtual CYStatement *Replace(CYContext &context);
1432 virtual void Output(CYOutput &out, CYFlags flags) const;
1435 // XXX: this should be split up into CYAnonymousFunction and CYNamedFunction (subclass)
1437 CYIdentifier *name_;
1438 CYFunctionParameter *parameters_;
1441 CYNonLocal *nonlocal_;
1444 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1446 parameters_(parameters),
1452 virtual ~CYFunction() {
1455 void Inject(CYContext &context);
1456 virtual void Replace_(CYContext &context, bool outer);
1457 virtual void Output(CYOutput &out, CYFlags flags) const;
1460 // XXX: this should be split up into CYAnonymousFunctionExpression and CYNamedFunctionExpression
1461 struct CYFunctionExpression :
1465 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1466 CYFunction(name, parameters, statements)
1473 virtual CYExpression *Replace(CYContext &context);
1474 virtual void Output(CYOutput &out, CYFlags flags) const;
1477 // XXX: this should derive from CYAnonymousFunction
1482 CYFatArrow(CYFunctionParameter *parameters, CYStatement *statements) :
1483 CYFunction(NULL, parameters, statements)
1490 virtual CYExpression *Replace(CYContext &context);
1491 virtual void Output(CYOutput &out, CYFlags flags) const;
1494 // XXX: this should derive from CYAnonymousFunctionExpression
1496 CYFunctionExpression
1498 CYRubyProc(CYFunctionParameter *parameters, CYStatement *statements) :
1499 CYFunctionExpression(NULL, parameters, statements)
1503 virtual CYExpression *Replace(CYContext &context);
1504 virtual void Output(CYOutput &out, CYFlags flags) const;
1507 // XXX: this should derive from CYNamedFunction
1508 struct CYFunctionStatement :
1512 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
1513 CYFunction(name, parameters, statements)
1517 virtual CYStatement *Replace(CYContext &context);
1518 virtual void Output(CYOutput &out, CYFlags flags) const;
1524 CYExpression *expression_;
1526 CYExpress(CYExpression *expression) :
1527 expression_(expression)
1529 if (expression_ == NULL)
1533 virtual CYStatement *Replace(CYContext &context);
1534 virtual void Output(CYOutput &out, CYFlags flags) const;
1540 CYIdentifier *label_;
1542 CYContinue(CYIdentifier *label) :
1547 virtual CYStatement *Replace(CYContext &context);
1548 virtual void Output(CYOutput &out, CYFlags flags) const;
1554 CYIdentifier *label_;
1556 CYBreak(CYIdentifier *label) :
1561 virtual CYStatement *Replace(CYContext &context);
1562 virtual void Output(CYOutput &out, CYFlags flags) const;
1568 CYExpression *value_;
1570 CYReturn(CYExpression *value) :
1575 virtual CYStatement *Replace(CYContext &context);
1576 virtual void Output(CYOutput &out, CYFlags flags) const;
1582 virtual CYStatement *Replace(CYContext &context);
1583 virtual void Output(CYOutput &out, CYFlags flags) const;
1591 CYFinally(CYStatement *statements) :
1596 void Replace(CYContext &context);
1597 virtual void Output(CYOutput &out) const;
1600 struct CYTypeSpecifier :
1603 virtual CYExpression *Replace(CYContext &context) = 0;
1606 struct CYTypeError :
1612 virtual CYExpression *Replace(CYContext &context);
1613 virtual void Output(CYOutput &out) const;
1622 virtual CYExpression *Replace(CYContext &context);
1623 virtual void Output(CYOutput &out) const;
1626 struct CYTypeVariable :
1629 CYIdentifier *name_;
1631 CYTypeVariable(CYIdentifier *name) :
1636 CYTypeVariable(const char *name) :
1637 name_(new($pool) CYIdentifier(name))
1641 virtual CYExpression *Replace(CYContext &context);
1642 virtual void Output(CYOutput &out) const;
1645 struct CYTypeUnsigned :
1648 CYTypeSpecifier *specifier_;
1650 CYTypeUnsigned(CYTypeSpecifier *specifier) :
1651 specifier_(specifier)
1655 virtual CYExpression *Replace(CYContext &context);
1656 virtual void Output(CYOutput &out) const;
1659 struct CYTypeSigned :
1662 CYTypeSpecifier *specifier_;
1664 CYTypeSigned(CYTypeSpecifier *specifier) :
1665 specifier_(specifier)
1669 virtual CYExpression *Replace(CYContext &context);
1670 virtual void Output(CYOutput &out) const;
1676 CYTypeSpecifier *specifier_;
1678 CYTypeLong(CYTypeSpecifier *specifier) :
1679 specifier_(specifier)
1683 virtual CYExpression *Replace(CYContext &context);
1684 virtual void Output(CYOutput &out) const;
1687 struct CYTypeShort :
1690 CYTypeSpecifier *specifier_;
1692 CYTypeShort(CYTypeSpecifier *specifier) :
1693 specifier_(specifier)
1697 virtual CYExpression *Replace(CYContext &context);
1698 virtual void Output(CYOutput &out) const;
1701 struct CYTypeFunctionWith;
1703 struct CYTypeModifier :
1704 CYNext<CYTypeModifier>
1706 CYTypeModifier(CYTypeModifier *next) :
1707 CYNext<CYTypeModifier>(next)
1711 virtual int Precedence() const = 0;
1713 virtual CYExpression *Replace_(CYContext &context, CYExpression *type) = 0;
1714 CYExpression *Replace(CYContext &context, CYExpression *type);
1716 virtual void Output(CYOutput &out, CYIdentifier *identifier) const = 0;
1717 void Output(CYOutput &out, int precedence, CYIdentifier *identifier) const;
1719 virtual CYTypeFunctionWith *Function() { return NULL; }
1722 struct CYTypeArrayOf :
1725 CYExpression *size_;
1727 CYTypeArrayOf(CYExpression *size, CYTypeModifier *next = NULL) :
1728 CYTypeModifier(next),
1735 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1736 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1739 struct CYTypeConstant :
1742 CYTypeConstant(CYTypeModifier *next = NULL) :
1743 CYTypeModifier(next)
1749 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1750 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1753 struct CYTypePointerTo :
1756 CYTypePointerTo(CYTypeModifier *next = NULL) :
1757 CYTypeModifier(next)
1763 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1764 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1767 struct CYTypeVolatile :
1770 CYTypeVolatile(CYTypeModifier *next = NULL) :
1771 CYTypeModifier(next)
1777 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1778 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1781 struct CYTypedIdentifier :
1782 CYNext<CYTypedIdentifier>,
1785 CYLocation location_;
1786 CYIdentifier *identifier_;
1787 CYTypeSpecifier *specifier_;
1788 CYTypeModifier *modifier_;
1790 CYTypedIdentifier(const CYLocation &location, CYIdentifier *identifier = NULL) :
1791 location_(location),
1792 identifier_(identifier),
1798 CYTypedIdentifier(CYTypeSpecifier *specifier, CYTypeModifier *modifier = NULL) :
1800 specifier_(specifier),
1805 inline CYTypedIdentifier *Modify(CYTypeModifier *modifier) {
1806 CYSetLast(modifier_) = modifier;
1810 virtual CYExpression *Replace(CYContext &context);
1811 virtual void Output(CYOutput &out) const;
1813 CYTypeFunctionWith *Function();
1816 struct CYEncodedType :
1819 CYTypedIdentifier *typed_;
1821 CYEncodedType(CYTypedIdentifier *typed) :
1828 virtual CYExpression *Replace(CYContext &context);
1829 virtual void Output(CYOutput &out, CYFlags flags) const;
1832 struct CYTypedParameter :
1833 CYNext<CYTypedParameter>,
1836 CYTypedIdentifier *typed_;
1838 CYTypedParameter(CYTypedIdentifier *typed, CYTypedParameter *next) :
1839 CYNext<CYTypedParameter>(next),
1844 CYArgument *Argument(CYContext &context);
1845 CYFunctionParameter *Parameters(CYContext &context);
1846 CYExpression *TypeSignature(CYContext &context, CYExpression *prefix);
1848 virtual void Output(CYOutput &out) const;
1854 CYTypedIdentifier *typed_;
1855 CYTypedParameter *parameters_;
1856 CYStatement *statements_;
1858 CYLambda(CYTypedIdentifier *typed, CYTypedParameter *parameters, CYStatement *statements) :
1860 parameters_(parameters),
1861 statements_(statements)
1867 virtual CYExpression *Replace(CYContext &context);
1868 virtual void Output(CYOutput &out, CYFlags flags) const;
1877 CYModule(CYWord *part, CYModule *next = NULL) :
1878 CYNext<CYModule>(next),
1883 CYString *Replace(CYContext &context, const char *separator) const;
1884 void Output(CYOutput &out) const;
1892 CYImport(CYModule *module) :
1897 virtual CYStatement *Replace(CYContext &context);
1898 virtual void Output(CYOutput &out, CYFlags flags) const;
1905 CYTypedIdentifier *typed_;
1907 CYExternal(CYString *abi, CYTypedIdentifier *typed) :
1913 virtual CYStatement *Replace(CYContext &context);
1914 virtual void Output(CYOutput &out, CYFlags flags) const;
1917 struct CYTypeDefinition :
1920 CYTypedIdentifier *typed_;
1922 CYTypeDefinition(CYTypedIdentifier *typed) :
1927 virtual CYStatement *Replace(CYContext &context);
1928 virtual void Output(CYOutput &out, CYFlags flags) const;
1931 struct CYTypeBlockWith :
1934 CYTypedParameter *parameters_;
1936 CYTypeBlockWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
1937 CYTypeModifier(next),
1938 parameters_(parameters)
1944 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1945 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1948 struct CYTypeFunctionWith :
1951 CYTypedParameter *parameters_;
1953 CYTypeFunctionWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
1954 CYTypeModifier(next),
1955 parameters_(parameters)
1961 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1962 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1964 virtual CYTypeFunctionWith *Function() { return this; }
1973 CYIdentifier *name_;
1976 Catch(CYIdentifier *name, CYStatement *statements) :
1982 void Replace(CYContext &context);
1983 virtual void Output(CYOutput &out) const;
1991 CYFinally *finally_;
1993 Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
2000 virtual CYStatement *Replace(CYContext &context);
2001 virtual void Output(CYOutput &out, CYFlags flags) const;
2007 CYExpression *value_;
2009 Throw(CYExpression *value = NULL) :
2014 virtual CYStatement *Replace(CYContext &context);
2015 virtual void Output(CYOutput &out, CYFlags flags) const;
2023 CYExpression *scope_;
2026 CYWith(CYExpression *scope, CYStatement *code) :
2032 virtual CYStatement *Replace(CYContext &context);
2033 virtual void Output(CYOutput &out, CYFlags flags) const;
2039 CYExpression *value_;
2042 CYSwitch(CYExpression *value, CYClause *clauses) :
2048 virtual CYStatement *Replace(CYContext &context);
2049 virtual void Output(CYOutput &out, CYFlags flags) const;
2059 virtual CYStatement *Replace(CYContext &context);
2060 virtual void Output(CYOutput &out, CYFlags flags) const;
2063 struct CYCondition :
2066 CYExpression *test_;
2067 CYExpression *true_;
2068 CYExpression *false_;
2070 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
2079 virtual CYExpression *Replace(CYContext &context);
2080 virtual void Output(CYOutput &out, CYFlags flags) const;
2083 struct CYAddressOf :
2086 CYAddressOf(CYExpression *rhs) :
2091 virtual const char *Operator() const {
2097 virtual CYExpression *Replace(CYContext &context);
2103 CYIndirect(CYExpression *rhs) :
2108 virtual const char *Operator() const {
2114 virtual CYExpression *Replace(CYContext &context);
2118 virtual CYExpression *Replace(CYContext &context);
2120 #define CYPostfix_(op, name, args...) \
2121 struct CY ## name : \
2124 CY ## name(CYExpression *lhs) : \
2129 virtual const char *Operator() const { \
2134 #define CYPrefix_(alphabetic, op, name, args...) \
2135 struct CY ## name : \
2138 CY ## name(CYExpression *rhs) : \
2143 CYAlphabetic(alphabetic) \
2145 virtual const char *Operator() const { \
2150 #define CYInfix_(alphabetic, precedence, op, name, args...) \
2151 struct CY ## name : \
2154 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
2159 CYAlphabetic(alphabetic) \
2160 CYPrecedence(precedence) \
2162 virtual const char *Operator() const { \
2167 #define CYAssignment_(op, name, args...) \
2168 struct CY ## name ## Assign : \
2171 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
2172 CYAssignment(lhs, rhs) \
2176 virtual const char *Operator() const { \
2181 CYPostfix_("++", PostIncrement)
2182 CYPostfix_("--", PostDecrement)
2184 CYPrefix_(true, "delete", Delete)
2185 CYPrefix_(true, "void", Void)
2186 CYPrefix_(true, "typeof", TypeOf)
2187 CYPrefix_(false, "++", PreIncrement)
2188 CYPrefix_(false, "--", PreDecrement)
2189 CYPrefix_(false, "+", Affirm)
2190 CYPrefix_(false, "-", Negate)
2191 CYPrefix_(false, "~", BitwiseNot)
2192 CYPrefix_(false, "!", LogicalNot)
2194 CYInfix_(false, 5, "*", Multiply, CYReplace)
2195 CYInfix_(false, 5, "/", Divide)
2196 CYInfix_(false, 5, "%", Modulus)
2197 CYInfix_(false, 6, "+", Add, CYReplace)
2198 CYInfix_(false, 6, "-", Subtract)
2199 CYInfix_(false, 7, "<<", ShiftLeft)
2200 CYInfix_(false, 7, ">>", ShiftRightSigned)
2201 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
2202 CYInfix_(false, 8, "<", Less)
2203 CYInfix_(false, 8, ">", Greater)
2204 CYInfix_(false, 8, "<=", LessOrEqual)
2205 CYInfix_(false, 8, ">=", GreaterOrEqual)
2206 CYInfix_(true, 8, "instanceof", InstanceOf)
2207 CYInfix_(true, 8, "in", In)
2208 CYInfix_(false, 9, "==", Equal)
2209 CYInfix_(false, 9, "!=", NotEqual)
2210 CYInfix_(false, 9, "===", Identical)
2211 CYInfix_(false, 9, "!==", NotIdentical)
2212 CYInfix_(false, 10, "&", BitwiseAnd)
2213 CYInfix_(false, 11, "^", BitwiseXOr)
2214 CYInfix_(false, 12, "|", BitwiseOr)
2215 CYInfix_(false, 13, "&&", LogicalAnd)
2216 CYInfix_(false, 14, "||", LogicalOr)
2218 CYAssignment_("=", )
2219 CYAssignment_("*=", Multiply)
2220 CYAssignment_("/=", Divide)
2221 CYAssignment_("%=", Modulus)
2222 CYAssignment_("+=", Add)
2223 CYAssignment_("-=", Subtract)
2224 CYAssignment_("<<=", ShiftLeft)
2225 CYAssignment_(">>=", ShiftRightSigned)
2226 CYAssignment_(">>>=", ShiftRightUnsigned)
2227 CYAssignment_("&=", BitwiseAnd)
2228 CYAssignment_("^=", BitwiseXOr)
2229 CYAssignment_("|=", BitwiseOr)
2231 #endif/*CYCRIPT_PARSER_HPP*/