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
35 #include "Location.hpp"
36 #include "Pooling.hpp"
37 #include "Options.hpp"
42 virtual void Output(struct CYOutput &out) const = 0;
63 CYOutput(std::streambuf &out, CYOptions &options) :
74 void Check(char value);
77 _finline void operator ()(char value) {
78 _assert(out_.sputc(value) != EOF);
86 _finline void operator ()(const char *data, std::streamsize size) {
87 _assert(out_.sputn(data, size) == size);
89 position_.columns(size);
92 _finline void operator ()(const char *data) {
93 return operator ()(data, strlen(data));
96 CYOutput &operator <<(char rhs);
97 CYOutput &operator <<(const char *rhs);
99 _finline CYOutput &operator <<(const CYThing *rhs) {
105 _finline CYOutput &operator <<(const CYThing &rhs) {
111 struct CYPropertyName {
112 virtual void PropertyName(CYOutput &out) const = 0;
126 CYNoBrace = (1 << 0),
127 CYNoFunction = (1 << 1),
130 CYNoRightHand = (1 << 4),
131 CYNoDangle = (1 << 5),
132 CYNoInteger = (1 << 6),
133 CYNoBF = (CYNoBrace | CYNoFunction),
136 _finline CYFlags operator ~(CYFlags rhs) {
137 return static_cast<CYFlags>(~static_cast<unsigned>(rhs));
140 _finline CYFlags operator &(CYFlags lhs, CYFlags rhs) {
141 return static_cast<CYFlags>(static_cast<unsigned>(lhs) & static_cast<unsigned>(rhs));
144 _finline CYFlags operator |(CYFlags lhs, CYFlags rhs) {
145 return static_cast<CYFlags>(static_cast<unsigned>(lhs) | static_cast<unsigned>(rhs));
148 _finline CYFlags &operator |=(CYFlags &lhs, CYFlags rhs) {
149 return lhs = lhs | rhs;
152 _finline CYFlags CYLeft(CYFlags flags) {
153 return flags & ~(CYNoDangle | CYNoInteger);
156 _finline CYFlags CYRight(CYFlags flags) {
157 return flags & ~CYNoBF;
160 _finline CYFlags CYCenter(CYFlags flags) {
161 return CYLeft(CYRight(flags));
170 #define CYCompact(type) \
171 virtual CYCompactType Compact() const { \
172 return CYCompact ## type; \
179 void Single(CYOutput &out, CYFlags flags, CYCompactType request) const;
180 void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
181 virtual void Output(CYOutput &out) const;
183 virtual CYStatement *Replace(CYContext &context) = 0;
185 virtual CYCompactType Compact() const = 0;
186 virtual CYStatement *Return();
189 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
192 struct CYStatements {
202 operator CYStatement *() const {
206 CYStatements &operator ->*(CYStatement *next) {
208 if (first_ == NULL) {
211 } else for (;; last_ = last_->next_)
212 if (last_->next_ == NULL) {
222 virtual CYExpression *ClassName(CYContext &context, bool object) = 0;
223 virtual void ClassName(CYOutput &out, bool object) const = 0;
233 CYWord(const char *word) :
238 void Set(const char *value) {
242 virtual const char *Word() const;
243 virtual void Output(CYOutput &out) const;
245 virtual CYExpression *ClassName(CYContext &context, bool object);
246 virtual void ClassName(CYOutput &out, bool object) const;
247 virtual void PropertyName(CYOutput &out) const;
250 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
252 return lhs << rhs.Word();
255 struct CYIdentifier :
256 CYNext<CYIdentifier>,
259 CYIdentifier *replace_;
263 CYIdentifier(const char *word) :
271 virtual const char *Word() const;
272 CYIdentifier *Replace(CYContext &context);
279 CYStatement *statement_;
281 CYLabel(CYIdentifier *name, CYStatement *statement) :
283 statement_(statement)
289 virtual CYStatement *Replace(CYContext &context);
290 virtual void Output(CYOutput &out, CYFlags flags) const;
293 struct CYCStringLess :
294 std::binary_function<const char *, const char *, bool>
296 _finline bool operator ()(const char *lhs, const char *rhs) const {
297 return strcmp(lhs, rhs) < 0;
301 struct CYIdentifierValueLess :
302 std::binary_function<CYIdentifier *, CYIdentifier *, bool>
304 _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
305 return CYCStringLess()(lhs->Word(), rhs->Word());
309 enum CYIdentifierFlags {
310 CYIdentifierArgument,
311 CYIdentifierVariable,
317 typedef std::set<const char *, CYCStringLess> CYCStringSet;
318 typedef std::set<CYIdentifier *, CYIdentifierValueLess> CYIdentifierValueSet;
319 typedef std::map<CYIdentifier *, CYIdentifierFlags> CYIdentifierAddressFlagsMap;
321 struct CYIdentifierUsage {
322 CYIdentifier *identifier_;
326 typedef std::vector<CYIdentifierUsage> CYIdentifierUsageVector;
332 CYIdentifierAddressFlagsMap internal_;
333 CYIdentifierValueSet identifiers_;
335 CYScope(bool transparent, CYContext &context);
337 void Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags);
338 virtual CYIdentifier *Lookup(CYContext &context, CYIdentifier *identifier);
339 void Merge(CYContext &context, CYIdentifier *identifier);
340 void Close(CYContext &context, CYStatement *&statements);
348 CYScript(CYStatement *code) :
353 virtual void Replace(CYContext &context);
354 virtual void Output(CYOutput &out) const;
366 CYIdentifierUsageVector rename_;
368 CYNonLocal *nonlocal_;
369 CYNonLocal *nextlocal_;
372 CYContext(CYOptions &options) :
382 void ReplaceAll(CYStatement *&statement) {
383 if (statement == NULL)
385 CYStatement *next(statement->next_);
390 if (statement == NULL)
393 statement->SetNext(next);
396 template <typename Type_>
397 void Replace(Type_ *&value) {
398 for (;;) if (value == NULL)
401 Type_ *replace(value->Replace(*this));
402 if (replace != value)
408 void NonLocal(CYStatement *&statements);
409 CYIdentifier *Unique();
413 CYIdentifier *identifier_;
420 CYIdentifier *Target(CYContext &context) {
421 if (identifier_ == NULL)
422 identifier_ = context.Unique();
430 CYIdentifier *identifier_;
437 CYIdentifier *Identifier(CYContext &context) {
439 return next_->Identifier(context);
440 if (identifier_ == NULL)
441 identifier_ = context.Unique();
451 CYBlock(CYStatement *code) :
458 virtual CYStatement *Replace(CYContext &context);
460 virtual void Output(CYOutput &out, CYFlags flags) const;
462 virtual CYStatement *Return();
465 struct CYForInitializer {
466 virtual CYExpression *Replace(CYContext &context) = 0;
467 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
470 struct CYForInInitializer {
471 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
472 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value) = 0;
474 virtual CYExpression *Replace(CYContext &context) = 0;
475 virtual CYAssignment *Assignment(CYContext &context) = 0;
477 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
480 struct CYFunctionParameter;
485 struct CYExpression :
491 virtual int Precedence() const = 0;
493 virtual bool RightHand() const {
497 virtual void ForIn(CYOutput &out, CYFlags flags) const;
498 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
500 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
502 virtual void Output(CYOutput &out) const;
503 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
504 void Output(CYOutput &out, int precedence, CYFlags flags) const;
506 virtual CYExpression *ClassName(CYContext &context, bool object);
507 virtual void ClassName(CYOutput &out, bool object) const;
509 virtual CYExpression *Replace(CYContext &context) = 0;
510 virtual CYAssignment *Assignment(CYContext &context);
512 virtual CYExpression *Primitive(CYContext &context) {
516 virtual CYFunctionParameter *Parameter() const;
518 virtual CYNumber *Number(CYContext &context) {
522 virtual CYString *String(CYContext &context) {
526 virtual const char *Word() const {
531 #define CYAlphabetic(value) \
532 virtual bool Alphabetic() const { \
536 #define CYPrecedence(value) \
537 static const int Precedence_ = value; \
538 virtual int Precedence() const { \
539 return Precedence_; \
542 #define CYRightHand(value) \
543 virtual bool RightHand() const { \
550 CYExpression *expression_;
553 CYCompound(CYExpression *expression, CYExpression *next) :
554 expression_(expression),
557 _assert(expression_ != NULL);
558 _assert(next != NULL);
563 virtual CYExpression *Replace(CYContext &context);
564 void Output(CYOutput &out, CYFlags flags) const;
566 virtual CYFunctionParameter *Parameter() const;
569 struct CYParenthetical :
572 CYExpression *expression_;
574 CYParenthetical(CYExpression *expression) :
575 expression_(expression)
581 virtual CYExpression *Replace(CYContext &context);
582 void Output(CYOutput &out, CYFlags flags) const;
585 struct CYDeclaration;
587 struct CYFunctionParameter :
588 CYNext<CYFunctionParameter>,
591 CYForInInitializer *initialiser_;
593 CYFunctionParameter(CYForInInitializer *initialiser, CYFunctionParameter *next = NULL) :
594 CYNext<CYFunctionParameter>(next),
595 initialiser_(initialiser)
599 void Replace(CYContext &context, CYStatement *&statements);
600 void Output(CYOutput &out) const;
603 struct CYComprehension :
604 CYNext<CYComprehension>,
607 CYComprehension(CYComprehension *next = NULL) :
608 CYNext<CYComprehension>(next)
612 CYComprehension *Modify(CYComprehension *next) {
617 virtual const char *Name() const = 0;
619 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
620 CYFunctionParameter *Parameters(CYContext &context) const;
621 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
622 virtual void Output(CYOutput &out) const = 0;
625 struct CYForInComprehension :
631 CYForInComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
632 CYComprehension(next),
638 virtual const char *Name() const {
639 return name_->Word();
642 virtual CYFunctionParameter *Parameter(CYContext &context) const;
643 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
644 virtual void Output(CYOutput &out) const;
647 struct CYForOfComprehension :
653 CYForOfComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
654 CYComprehension(next),
660 virtual const char *Name() const {
661 return name_->Word();
664 virtual CYFunctionParameter *Parameter(CYContext &context) const;
665 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
666 virtual void Output(CYOutput &out) const;
669 struct CYIfComprehension :
674 CYIfComprehension(CYExpression *test, CYComprehension *next = NULL) :
675 CYComprehension(next),
680 virtual const char *Name() const {
684 virtual CYFunctionParameter *Parameter(CYContext &context) const;
685 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
686 virtual void Output(CYOutput &out) const;
689 struct CYArrayComprehension :
692 CYExpression *expression_;
693 CYComprehension *comprehensions_;
695 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
696 expression_(expression),
697 comprehensions_(comprehensions)
703 virtual CYExpression *Replace(CYContext &context);
704 virtual void Output(CYOutput &out, CYFlags flags) const;
713 virtual CYExpression *Primitive(CYContext &context) {
721 virtual CYExpression *Replace(CYContext &context);
735 CYRange(uint64_t lo, uint64_t hi) :
740 bool operator [](uint8_t value) const {
741 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
744 void operator()(uint8_t value) {
747 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
751 extern CYRange DigitRange_;
752 extern CYRange WordStartRange_;
753 extern CYRange WordEndRange_;
768 CYString(const char *value) :
774 CYString(const char *value, size_t size) :
780 CYString(const CYWord *word) :
781 value_(word->Word()),
782 size_(strlen(value_))
786 const char *Value() const {
790 virtual const char *Word() const;
792 virtual CYNumber *Number(CYContext &context);
793 virtual CYString *String(CYContext &context);
795 CYString *Concat(CYContext &out, CYString *rhs) const;
796 virtual void Output(CYOutput &out, CYFlags flags) const;
797 virtual void PropertyName(CYOutput &out) const;
800 struct CYElementValue;
805 CYExpression *expression_;
808 CYSpan(CYExpression *expression, CYString *string, CYSpan *next) :
809 CYNext<CYSpan>(next),
810 expression_(expression),
815 CYElementValue *Replace(CYContext &context);
824 CYTemplate(CYString *string, CYSpan *spans) :
833 virtual CYExpression *Replace(CYContext &context);
834 virtual void Output(CYOutput &out, CYFlags flags) const;
843 CYNumber(double value) :
848 double Value() const {
852 virtual CYNumber *Number(CYContext &context);
853 virtual CYString *String(CYContext &context);
855 virtual void Output(CYOutput &out, CYFlags flags) const;
856 virtual void PropertyName(CYOutput &out) const;
864 CYRegEx(const char *value) :
869 const char *Value() const {
873 virtual void Output(CYOutput &out, CYFlags flags) const;
879 virtual CYNumber *Number(CYContext &context);
880 virtual CYString *String(CYContext &context);
882 virtual void Output(CYOutput &out, CYFlags flags) const;
888 virtual CYExpression *Replace(CYContext &context);
889 virtual void Output(CYOutput &out, CYFlags flags) const;
895 virtual bool Value() const = 0;
896 virtual void Output(CYOutput &out, CYFlags flags) const;
902 virtual bool Value() const {
906 virtual CYNumber *Number(CYContext &context);
907 virtual CYString *String(CYContext &context);
913 virtual bool Value() const {
917 virtual CYNumber *Number(CYContext &context);
918 virtual CYString *String(CYContext &context);
926 CYVariable(CYIdentifier *name) :
931 CYVariable(const char *name) :
932 name_(new($pool) CYIdentifier(name))
939 virtual CYExpression *Replace(CYContext &context);
940 virtual void Output(CYOutput &out, CYFlags flags) const;
942 virtual CYFunctionParameter *Parameter() const;
950 CYPrefix(CYExpression *rhs) :
955 virtual bool Alphabetic() const = 0;
956 virtual const char *Operator() const = 0;
960 virtual CYExpression *Replace(CYContext &context);
961 virtual void Output(CYOutput &out, CYFlags flags) const;
970 CYInfix(CYExpression *lhs, CYExpression *rhs) :
976 void SetLeft(CYExpression *lhs) {
980 virtual bool Alphabetic() const = 0;
981 virtual const char *Operator() const = 0;
983 virtual CYExpression *Replace(CYContext &context);
984 virtual void Output(CYOutput &out, CYFlags flags) const;
992 CYPostfix(CYExpression *lhs) :
997 virtual const char *Operator() const = 0;
1001 virtual CYExpression *Replace(CYContext &context);
1002 virtual void Output(CYOutput &out, CYFlags flags) const;
1005 struct CYAssignment :
1011 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
1017 void SetLeft(CYExpression *lhs) {
1021 virtual const char *Operator() const = 0;
1025 virtual CYExpression *Replace(CYContext &context);
1026 virtual void Output(CYOutput &out, CYFlags flags) const;
1034 CYExpression *value_;
1036 CYArgument(CYExpression *value, CYArgument *next = NULL) :
1037 CYNext<CYArgument>(next),
1043 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
1044 CYNext<CYArgument>(next),
1050 CYArgument *Replace(CYContext &context);
1051 void Output(CYOutput &out) const;
1058 CYExpression *case_;
1061 CYClause(CYExpression *_case, CYStatement *code) :
1067 void Replace(CYContext &context);
1068 virtual void Output(CYOutput &out) const;
1074 virtual bool Elision() const = 0;
1076 virtual void Replace(CYContext &context) = 0;
1079 struct CYElementValue :
1083 CYExpression *value_;
1085 CYElementValue(CYExpression *value, CYElement *next) :
1086 CYNext<CYElement>(next),
1091 virtual bool Elision() const {
1092 return value_ == NULL;
1095 virtual void Replace(CYContext &context);
1096 virtual void Output(CYOutput &out) const;
1099 struct CYElementSpread :
1102 CYExpression *value_;
1104 CYElementSpread(CYExpression *value) :
1109 virtual bool Elision() const {
1113 virtual void Replace(CYContext &context);
1114 virtual void Output(CYOutput &out) const;
1120 CYElement *elements_;
1122 CYArray(CYElement *elements = NULL) :
1127 virtual CYExpression *Replace(CYContext &context);
1128 virtual void Output(CYOutput &out, CYFlags flags) const;
1135 CYPropertyName *name_;
1136 CYExpression *value_;
1138 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1139 CYNext<CYProperty>(next),
1145 void Replace(CYContext &context);
1146 virtual void Output(CYOutput &out) const;
1149 struct CYDeclaration :
1152 CYIdentifier *identifier_;
1153 CYExpression *initialiser_;
1155 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
1156 identifier_(identifier),
1157 initialiser_(initialiser)
1161 virtual void ForIn(CYOutput &out, CYFlags flags) const;
1162 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
1164 virtual CYExpression *Replace(CYContext &context);
1166 virtual CYAssignment *Assignment(CYContext &context);
1167 CYVariable *Variable(CYContext &context);
1169 virtual void Output(CYOutput &out, CYFlags flags) const;
1172 struct CYDeclarations :
1173 CYNext<CYDeclarations>,
1176 CYDeclaration *declaration_;
1178 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1179 CYNext<CYDeclarations>(next),
1180 declaration_(declaration)
1184 void Replace(CYContext &context);
1186 CYExpression *Expression(CYContext &context);
1187 CYProperty *Property(CYContext &context);
1188 CYArgument *Argument(CYContext &context);
1189 CYFunctionParameter *Parameter(CYContext &context);
1191 virtual void Output(CYOutput &out) const;
1192 virtual void Output(CYOutput &out, CYFlags flags) const;
1195 struct CYForDeclarations :
1198 CYDeclarations *declarations_;
1200 CYForDeclarations(CYDeclarations *declarations) :
1201 declarations_(declarations)
1205 virtual CYExpression *Replace(CYContext &context);
1206 virtual void Output(CYOutput &out, CYFlags flags) const;
1212 CYDeclarations *declarations_;
1214 CYVar(CYDeclarations *declarations) :
1215 declarations_(declarations)
1221 virtual CYStatement *Replace(CYContext &context);
1222 virtual void Output(CYOutput &out, CYFlags flags) const;
1225 struct CYLetStatement :
1228 CYDeclarations *declarations_;
1231 CYLetStatement(CYDeclarations *declarations, CYStatement *code) :
1232 declarations_(declarations),
1239 virtual CYStatement *Replace(CYContext &context);
1240 virtual void Output(CYOutput &out, CYFlags flags) const;
1246 CYForInitializer *initialiser_;
1247 CYExpression *test_;
1248 CYExpression *increment_;
1251 CYFor(CYForInitializer *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1252 initialiser_(initialiser),
1254 increment_(increment),
1261 virtual CYStatement *Replace(CYContext &context);
1262 virtual void Output(CYOutput &out, CYFlags flags) const;
1268 CYForInInitializer *initialiser_;
1272 CYForIn(CYForInInitializer *initialiser, CYExpression *set, CYStatement *code) :
1273 initialiser_(initialiser),
1281 virtual CYStatement *Replace(CYContext &context);
1282 virtual void Output(CYOutput &out, CYFlags flags) const;
1288 CYForInInitializer *initialiser_;
1292 CYForOf(CYForInInitializer *initialiser, CYExpression *set, CYStatement *code) :
1293 initialiser_(initialiser),
1301 virtual CYStatement *Replace(CYContext &context);
1302 virtual void Output(CYOutput &out, CYFlags flags) const;
1308 CYProperty *properties_;
1310 CYObject(CYProperty *properties = NULL) :
1311 properties_(properties)
1315 virtual CYExpression *Replace(CYContext &context);
1316 void Output(CYOutput &out, CYFlags flags) const;
1322 CYExpression *object_;
1323 CYExpression *property_;
1325 CYMember(CYExpression *object, CYExpression *property) :
1331 void SetLeft(CYExpression *object) {
1336 struct CYDirectMember :
1339 CYDirectMember(CYExpression *object, CYExpression *property) :
1340 CYMember(object, property)
1347 virtual CYExpression *Replace(CYContext &context);
1348 virtual void Output(CYOutput &out, CYFlags flags) const;
1351 struct CYIndirectMember :
1354 CYIndirectMember(CYExpression *object, CYExpression *property) :
1355 CYMember(object, property)
1362 virtual CYExpression *Replace(CYContext &context);
1363 virtual void Output(CYOutput &out, CYFlags flags) const;
1372 CYExpression *constructor_;
1373 CYArgument *arguments_;
1375 New(CYExpression *constructor, CYArgument *arguments) :
1376 constructor_(constructor),
1377 arguments_(arguments)
1381 virtual int Precedence() const {
1382 return arguments_ == NULL ? 2 : 1;
1387 virtual CYExpression *Replace(CYContext &context);
1388 virtual void Output(CYOutput &out, CYFlags flags) const;
1390 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1398 CYExpression *function_;
1399 CYArgument *arguments_;
1401 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1402 function_(function),
1403 arguments_(arguments)
1410 virtual CYExpression *Replace(CYContext &context);
1411 virtual void Output(CYOutput &out, CYFlags flags) const;
1413 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1418 struct CYRubyBlock :
1421 CYExpression *call_;
1424 CYRubyBlock(CYExpression *call, CYRubyProc *proc) :
1433 virtual CYExpression *Replace(CYContext &context);
1434 virtual void Output(CYOutput &out, CYFlags flags) const;
1440 CYExpression *test_;
1442 CYStatement *false_;
1444 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1453 virtual CYStatement *Replace(CYContext &context);
1454 virtual void Output(CYOutput &out, CYFlags flags) const;
1456 virtual CYStatement *Return();
1462 CYExpression *test_;
1465 CYDoWhile(CYExpression *test, CYStatement *code) :
1473 virtual CYStatement *Replace(CYContext &context);
1474 virtual void Output(CYOutput &out, CYFlags flags) const;
1480 CYExpression *test_;
1483 CYWhile(CYExpression *test, CYStatement *code) :
1491 virtual CYStatement *Replace(CYContext &context);
1492 virtual void Output(CYOutput &out, CYFlags flags) const;
1495 // XXX: this should be split up into CYAnonymousFunction and CYNamedFunction (subclass)
1497 CYIdentifier *name_;
1498 CYFunctionParameter *parameters_;
1501 CYNonLocal *nonlocal_;
1505 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
1507 parameters_(parameters),
1514 void Inject(CYContext &context);
1515 virtual void Replace_(CYContext &context, bool outer);
1516 virtual void Output(CYOutput &out, CYFlags flags) const;
1519 // XXX: this should be split up into CYAnonymousFunctionExpression and CYNamedFunctionExpression
1520 struct CYFunctionExpression :
1524 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
1525 CYFunction(name, parameters, code)
1532 virtual CYExpression *Replace(CYContext &context);
1533 virtual void Output(CYOutput &out, CYFlags flags) const;
1536 // XXX: this should derive from CYAnonymousFunction
1541 CYFatArrow(CYFunctionParameter *parameters, CYStatement *code) :
1542 CYFunction(NULL, parameters, code)
1549 virtual CYExpression *Replace(CYContext &context);
1550 virtual void Output(CYOutput &out, CYFlags flags) const;
1553 // XXX: this should derive from CYAnonymousFunctionExpression
1555 CYFunctionExpression
1557 CYRubyProc(CYFunctionParameter *parameters, CYStatement *code) :
1558 CYFunctionExpression(NULL, parameters, code)
1562 virtual CYExpression *Replace(CYContext &context);
1563 virtual void Output(CYOutput &out, CYFlags flags) const;
1566 // XXX: this should derive from CYNamedFunction
1567 struct CYFunctionStatement :
1571 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
1572 CYFunction(name, parameters, code)
1578 virtual CYStatement *Replace(CYContext &context);
1579 virtual void Output(CYOutput &out, CYFlags flags) const;
1585 CYExpression *expression_;
1587 CYExpress(CYExpression *expression) :
1588 expression_(expression)
1590 if (expression_ == NULL)
1596 virtual CYStatement *Replace(CYContext &context);
1597 virtual void Output(CYOutput &out, CYFlags flags) const;
1599 virtual CYStatement *Return();
1605 CYIdentifier *label_;
1607 CYContinue(CYIdentifier *label) :
1614 virtual CYStatement *Replace(CYContext &context);
1615 virtual void Output(CYOutput &out, CYFlags flags) const;
1621 CYIdentifier *label_;
1623 CYBreak(CYIdentifier *label) :
1630 virtual CYStatement *Replace(CYContext &context);
1631 virtual void Output(CYOutput &out, CYFlags flags) const;
1637 CYExpression *value_;
1639 CYReturn(CYExpression *value) :
1646 virtual CYStatement *Replace(CYContext &context);
1647 virtual void Output(CYOutput &out, CYFlags flags) const;
1655 virtual CYStatement *Replace(CYContext &context);
1656 virtual void Output(CYOutput &out, CYFlags flags) const;
1664 CYFinally(CYStatement *code) :
1669 void Replace(CYContext &context);
1670 virtual void Output(CYOutput &out) const;
1673 struct CYTypeSpecifier :
1676 virtual CYExpression *Replace(CYContext &context) = 0;
1679 struct CYTypeError :
1685 virtual CYExpression *Replace(CYContext &context);
1686 virtual void Output(CYOutput &out) const;
1695 virtual CYExpression *Replace(CYContext &context);
1696 virtual void Output(CYOutput &out) const;
1699 struct CYTypeVariable :
1702 CYIdentifier *name_;
1704 CYTypeVariable(CYIdentifier *name) :
1709 CYTypeVariable(const char *name) :
1710 name_(new($pool) CYIdentifier(name))
1714 virtual CYExpression *Replace(CYContext &context);
1715 virtual void Output(CYOutput &out) const;
1718 struct CYTypeUnsigned :
1721 CYTypeSpecifier *specifier_;
1723 CYTypeUnsigned(CYTypeSpecifier *specifier) :
1724 specifier_(specifier)
1728 virtual CYExpression *Replace(CYContext &context);
1729 virtual void Output(CYOutput &out) const;
1732 struct CYTypeSigned :
1735 CYTypeSpecifier *specifier_;
1737 CYTypeSigned(CYTypeSpecifier *specifier) :
1738 specifier_(specifier)
1742 virtual CYExpression *Replace(CYContext &context);
1743 virtual void Output(CYOutput &out) const;
1749 CYTypeSpecifier *specifier_;
1751 CYTypeLong(CYTypeSpecifier *specifier) :
1752 specifier_(specifier)
1756 virtual CYExpression *Replace(CYContext &context);
1757 virtual void Output(CYOutput &out) const;
1760 struct CYTypeShort :
1763 CYTypeSpecifier *specifier_;
1765 CYTypeShort(CYTypeSpecifier *specifier) :
1766 specifier_(specifier)
1770 virtual CYExpression *Replace(CYContext &context);
1771 virtual void Output(CYOutput &out) const;
1774 struct CYTypeFunctionWith;
1776 struct CYTypeModifier :
1777 CYNext<CYTypeModifier>
1779 CYTypeModifier(CYTypeModifier *next) :
1780 CYNext<CYTypeModifier>(next)
1784 virtual int Precedence() const = 0;
1786 virtual CYExpression *Replace_(CYContext &context, CYExpression *type) = 0;
1787 CYExpression *Replace(CYContext &context, CYExpression *type);
1789 virtual void Output(CYOutput &out, CYIdentifier *identifier) const = 0;
1790 void Output(CYOutput &out, int precedence, CYIdentifier *identifier) const;
1792 virtual CYTypeFunctionWith *Function() { return NULL; }
1795 struct CYTypeArrayOf :
1798 CYExpression *size_;
1800 CYTypeArrayOf(CYExpression *size, CYTypeModifier *next = NULL) :
1801 CYTypeModifier(next),
1808 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1809 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1812 struct CYTypeConstant :
1815 CYTypeConstant(CYTypeModifier *next = NULL) :
1816 CYTypeModifier(next)
1822 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1823 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1826 struct CYTypePointerTo :
1829 CYTypePointerTo(CYTypeModifier *next = NULL) :
1830 CYTypeModifier(next)
1836 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1837 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1840 struct CYTypeVolatile :
1843 CYTypeVolatile(CYTypeModifier *next = NULL) :
1844 CYTypeModifier(next)
1850 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1851 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1854 struct CYTypedIdentifier :
1855 CYNext<CYTypedIdentifier>,
1858 CYLocation location_;
1859 CYIdentifier *identifier_;
1860 CYTypeSpecifier *specifier_;
1861 CYTypeModifier *modifier_;
1863 CYTypedIdentifier(const CYLocation &location, CYIdentifier *identifier = NULL) :
1864 location_(location),
1865 identifier_(identifier),
1871 CYTypedIdentifier(CYTypeSpecifier *specifier, CYTypeModifier *modifier = NULL) :
1873 specifier_(specifier),
1878 inline CYTypedIdentifier *Modify(CYTypeModifier *modifier) {
1879 CYSetLast(modifier_) = modifier;
1883 virtual CYExpression *Replace(CYContext &context);
1884 virtual void Output(CYOutput &out) const;
1886 CYTypeFunctionWith *Function();
1889 struct CYEncodedType :
1892 CYTypedIdentifier *typed_;
1894 CYEncodedType(CYTypedIdentifier *typed) :
1901 virtual CYExpression *Replace(CYContext &context);
1902 virtual void Output(CYOutput &out, CYFlags flags) const;
1905 struct CYTypedParameter :
1906 CYNext<CYTypedParameter>,
1909 CYTypedIdentifier *typed_;
1911 CYTypedParameter(CYTypedIdentifier *typed, CYTypedParameter *next) :
1912 CYNext<CYTypedParameter>(next),
1917 CYArgument *Argument(CYContext &context);
1918 CYFunctionParameter *Parameters(CYContext &context);
1919 CYExpression *TypeSignature(CYContext &context, CYExpression *prefix);
1921 virtual void Output(CYOutput &out) const;
1927 CYTypedIdentifier *typed_;
1928 CYTypedParameter *parameters_;
1931 CYLambda(CYTypedIdentifier *typed, CYTypedParameter *parameters, CYStatement *code) :
1933 parameters_(parameters),
1940 virtual CYExpression *Replace(CYContext &context);
1941 virtual void Output(CYOutput &out, CYFlags flags) const;
1950 CYModule(CYWord *part, CYModule *next = NULL) :
1951 CYNext<CYModule>(next),
1956 CYString *Replace(CYContext &context, const char *separator) const;
1957 void Output(CYOutput &out) const;
1965 CYImport(CYModule *module) :
1972 virtual CYStatement *Replace(CYContext &context);
1973 virtual void Output(CYOutput &out, CYFlags flags) const;
1980 CYTypedIdentifier *typed_;
1982 CYExternal(CYString *abi, CYTypedIdentifier *typed) :
1990 virtual CYStatement *Replace(CYContext &context);
1991 virtual void Output(CYOutput &out, CYFlags flags) const;
1994 struct CYTypeDefinition :
1997 CYTypedIdentifier *typed_;
1999 CYTypeDefinition(CYTypedIdentifier *typed) :
2006 virtual CYStatement *Replace(CYContext &context);
2007 virtual void Output(CYOutput &out, CYFlags flags) const;
2010 struct CYTypeBlockWith :
2013 CYTypedParameter *parameters_;
2015 CYTypeBlockWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
2016 CYTypeModifier(next),
2017 parameters_(parameters)
2023 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
2024 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2027 struct CYTypeFunctionWith :
2030 CYTypedParameter *parameters_;
2032 CYTypeFunctionWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
2033 CYTypeModifier(next),
2034 parameters_(parameters)
2040 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
2041 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2043 virtual CYTypeFunctionWith *Function() { return this; }
2052 CYIdentifier *name_;
2055 Catch(CYIdentifier *name, CYStatement *code) :
2061 void Replace(CYContext &context);
2062 virtual void Output(CYOutput &out) const;
2070 CYFinally *finally_;
2072 Try(CYStatement *code, Catch *_catch, CYFinally *finally) :
2081 virtual CYStatement *Replace(CYContext &context);
2082 virtual void Output(CYOutput &out, CYFlags flags) const;
2088 CYExpression *value_;
2090 Throw(CYExpression *value = NULL) :
2097 virtual CYStatement *Replace(CYContext &context);
2098 virtual void Output(CYOutput &out, CYFlags flags) const;
2106 CYExpression *scope_;
2109 CYWith(CYExpression *scope, CYStatement *code) :
2117 virtual CYStatement *Replace(CYContext &context);
2118 virtual void Output(CYOutput &out, CYFlags flags) const;
2124 CYExpression *value_;
2127 CYSwitch(CYExpression *value, CYClause *clauses) :
2135 virtual CYStatement *Replace(CYContext &context);
2136 virtual void Output(CYOutput &out, CYFlags flags) const;
2148 virtual CYStatement *Replace(CYContext &context);
2149 virtual void Output(CYOutput &out, CYFlags flags) const;
2152 struct CYCondition :
2155 CYExpression *test_;
2156 CYExpression *true_;
2157 CYExpression *false_;
2159 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
2168 virtual CYExpression *Replace(CYContext &context);
2169 virtual void Output(CYOutput &out, CYFlags flags) const;
2172 struct CYAddressOf :
2175 CYAddressOf(CYExpression *rhs) :
2180 virtual const char *Operator() const {
2186 virtual CYExpression *Replace(CYContext &context);
2192 CYIndirect(CYExpression *rhs) :
2197 virtual const char *Operator() const {
2203 virtual CYExpression *Replace(CYContext &context);
2207 virtual CYExpression *Replace(CYContext &context);
2209 #define CYPostfix_(op, name, args...) \
2210 struct CY ## name : \
2213 CY ## name(CYExpression *lhs) : \
2218 virtual const char *Operator() const { \
2223 #define CYPrefix_(alphabetic, op, name, args...) \
2224 struct CY ## name : \
2227 CY ## name(CYExpression *rhs) : \
2232 CYAlphabetic(alphabetic) \
2234 virtual const char *Operator() const { \
2239 #define CYInfix_(alphabetic, precedence, op, name, args...) \
2240 struct CY ## name : \
2243 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
2248 CYAlphabetic(alphabetic) \
2249 CYPrecedence(precedence) \
2251 virtual const char *Operator() const { \
2256 #define CYAssignment_(op, name, args...) \
2257 struct CY ## name ## Assign : \
2260 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
2261 CYAssignment(lhs, rhs) \
2265 virtual const char *Operator() const { \
2270 CYPostfix_("++", PostIncrement)
2271 CYPostfix_("--", PostDecrement)
2273 CYPrefix_(true, "delete", Delete)
2274 CYPrefix_(true, "void", Void)
2275 CYPrefix_(true, "typeof", TypeOf)
2276 CYPrefix_(false, "++", PreIncrement)
2277 CYPrefix_(false, "--", PreDecrement)
2278 CYPrefix_(false, "+", Affirm)
2279 CYPrefix_(false, "-", Negate)
2280 CYPrefix_(false, "~", BitwiseNot)
2281 CYPrefix_(false, "!", LogicalNot)
2283 CYInfix_(false, 5, "*", Multiply, CYReplace)
2284 CYInfix_(false, 5, "/", Divide)
2285 CYInfix_(false, 5, "%", Modulus)
2286 CYInfix_(false, 6, "+", Add, CYReplace)
2287 CYInfix_(false, 6, "-", Subtract)
2288 CYInfix_(false, 7, "<<", ShiftLeft)
2289 CYInfix_(false, 7, ">>", ShiftRightSigned)
2290 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
2291 CYInfix_(false, 8, "<", Less)
2292 CYInfix_(false, 8, ">", Greater)
2293 CYInfix_(false, 8, "<=", LessOrEqual)
2294 CYInfix_(false, 8, ">=", GreaterOrEqual)
2295 CYInfix_(true, 8, "instanceof", InstanceOf)
2296 CYInfix_(true, 8, "in", In)
2297 CYInfix_(false, 9, "==", Equal)
2298 CYInfix_(false, 9, "!=", NotEqual)
2299 CYInfix_(false, 9, "===", Identical)
2300 CYInfix_(false, 9, "!==", NotIdentical)
2301 CYInfix_(false, 10, "&", BitwiseAnd)
2302 CYInfix_(false, 11, "^", BitwiseXOr)
2303 CYInfix_(false, 12, "|", BitwiseOr)
2304 CYInfix_(false, 13, "&&", LogicalAnd)
2305 CYInfix_(false, 14, "||", LogicalOr)
2307 CYAssignment_("=", )
2308 CYAssignment_("*=", Multiply)
2309 CYAssignment_("/=", Divide)
2310 CYAssignment_("%=", Modulus)
2311 CYAssignment_("+=", Add)
2312 CYAssignment_("-=", Subtract)
2313 CYAssignment_("<<=", ShiftLeft)
2314 CYAssignment_(">>=", ShiftRightSigned)
2315 CYAssignment_(">>>=", ShiftRightUnsigned)
2316 CYAssignment_("&=", BitwiseAnd)
2317 CYAssignment_("^=", BitwiseXOr)
2318 CYAssignment_("|=", BitwiseOr)
2320 #endif/*CYCRIPT_PARSER_HPP*/