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);
280 CYComment(const char *value) :
287 virtual CYStatement *Replace(CYContext &context);
288 virtual void Output(CYOutput &out, CYFlags flags) const;
295 CYStatement *statement_;
297 CYLabel(CYIdentifier *name, CYStatement *statement) :
299 statement_(statement)
305 virtual CYStatement *Replace(CYContext &context);
306 virtual void Output(CYOutput &out, CYFlags flags) const;
309 struct CYCStringLess :
310 std::binary_function<const char *, const char *, bool>
312 _finline bool operator ()(const char *lhs, const char *rhs) const {
313 return strcmp(lhs, rhs) < 0;
317 struct CYIdentifierValueLess :
318 std::binary_function<CYIdentifier *, CYIdentifier *, bool>
320 _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
321 return CYCStringLess()(lhs->Word(), rhs->Word());
325 enum CYIdentifierFlags {
326 CYIdentifierArgument,
327 CYIdentifierVariable,
333 typedef std::set<const char *, CYCStringLess> CYCStringSet;
334 typedef std::set<CYIdentifier *, CYIdentifierValueLess> CYIdentifierValueSet;
335 typedef std::map<CYIdentifier *, CYIdentifierFlags> CYIdentifierAddressFlagsMap;
337 struct CYIdentifierUsage {
338 CYIdentifier *identifier_;
342 typedef std::vector<CYIdentifierUsage> CYIdentifierUsageVector;
348 CYIdentifierAddressFlagsMap internal_;
349 CYIdentifierValueSet identifiers_;
351 CYScope(bool transparent, CYContext &context);
353 void Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags);
354 virtual CYIdentifier *Lookup(CYContext &context, CYIdentifier *identifier);
355 void Merge(CYContext &context, CYIdentifier *identifier);
356 void Close(CYContext &context, CYStatement *&statements);
364 CYProgram(CYStatement *code) :
369 virtual void Replace(CYContext &context);
370 virtual void Output(CYOutput &out) const;
382 CYIdentifierUsageVector rename_;
384 CYNonLocal *nonlocal_;
385 CYNonLocal *nextlocal_;
388 CYContext(CYOptions &options) :
398 void ReplaceAll(CYStatement *&statement) {
399 if (statement == NULL)
401 CYStatement *next(statement->next_);
406 if (statement == NULL)
409 statement->SetNext(next);
412 template <typename Type_>
413 void Replace(Type_ *&value) {
414 for (;;) if (value == NULL)
417 Type_ *replace(value->Replace(*this));
418 if (replace != value)
424 void NonLocal(CYStatement *&statements);
425 CYIdentifier *Unique();
429 CYIdentifier *identifier_;
436 CYIdentifier *Target(CYContext &context) {
437 if (identifier_ == NULL)
438 identifier_ = context.Unique();
446 CYIdentifier *identifier_;
453 CYIdentifier *Identifier(CYContext &context) {
455 return next_->Identifier(context);
456 if (identifier_ == NULL)
457 identifier_ = context.Unique();
467 CYBlock(CYStatement *code) :
474 virtual CYStatement *Replace(CYContext &context);
476 virtual void Output(CYOutput &out, CYFlags flags) const;
478 virtual CYStatement *Return();
481 struct CYForInitialiser {
482 virtual CYExpression *Replace(CYContext &context) = 0;
483 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
486 struct CYForInInitialiser {
487 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
488 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value) = 0;
490 virtual CYExpression *Replace(CYContext &context) = 0;
491 virtual CYAssignment *Assignment(CYContext &context) = 0;
493 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
496 struct CYFunctionParameter;
501 struct CYExpression :
507 virtual int Precedence() const = 0;
509 virtual bool RightHand() const {
513 virtual void ForIn(CYOutput &out, CYFlags flags) const;
514 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
516 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
518 virtual void Output(CYOutput &out) const;
519 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
520 void Output(CYOutput &out, int precedence, CYFlags flags) const;
522 virtual CYExpression *ClassName(CYContext &context, bool object);
523 virtual void ClassName(CYOutput &out, bool object) const;
525 virtual CYExpression *Replace(CYContext &context) = 0;
526 virtual CYAssignment *Assignment(CYContext &context);
528 virtual CYExpression *Primitive(CYContext &context) {
532 virtual CYFunctionParameter *Parameter() const;
534 virtual CYNumber *Number(CYContext &context) {
538 virtual CYString *String(CYContext &context) {
542 virtual const char *Word() const {
547 #define CYAlphabetic(value) \
548 virtual bool Alphabetic() const { \
552 #define CYPrecedence(value) \
553 static const int Precedence_ = value; \
554 virtual int Precedence() const { \
555 return Precedence_; \
558 #define CYRightHand(value) \
559 virtual bool RightHand() const { \
566 CYExpression *expression_;
569 CYCompound(CYExpression *expression, CYExpression *next) :
570 expression_(expression),
573 _assert(expression_ != NULL);
574 _assert(next != NULL);
579 virtual CYExpression *Replace(CYContext &context);
580 void Output(CYOutput &out, CYFlags flags) const;
582 virtual CYFunctionParameter *Parameter() const;
585 struct CYParenthetical :
588 CYExpression *expression_;
590 CYParenthetical(CYExpression *expression) :
591 expression_(expression)
597 virtual CYExpression *Replace(CYContext &context);
598 void Output(CYOutput &out, CYFlags flags) const;
601 struct CYDeclaration;
603 struct CYFunctionParameter :
604 CYNext<CYFunctionParameter>,
607 CYForInInitialiser *initialiser_;
609 CYFunctionParameter(CYForInInitialiser *initialiser, CYFunctionParameter *next = NULL) :
610 CYNext<CYFunctionParameter>(next),
611 initialiser_(initialiser)
615 void Replace(CYContext &context, CYStatement *&statements);
616 void Output(CYOutput &out) const;
619 struct CYComprehension :
620 CYNext<CYComprehension>,
623 CYComprehension(CYComprehension *next = NULL) :
624 CYNext<CYComprehension>(next)
628 CYComprehension *Modify(CYComprehension *next) {
633 virtual const char *Name() const = 0;
635 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
636 CYFunctionParameter *Parameters(CYContext &context) const;
637 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
638 virtual void Output(CYOutput &out) const = 0;
641 struct CYForInComprehension :
647 CYForInComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
648 CYComprehension(next),
654 virtual const char *Name() const {
655 return name_->Word();
658 virtual CYFunctionParameter *Parameter(CYContext &context) const;
659 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
660 virtual void Output(CYOutput &out) const;
663 struct CYForOfComprehension :
669 CYForOfComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
670 CYComprehension(next),
676 virtual const char *Name() const {
677 return name_->Word();
680 virtual CYFunctionParameter *Parameter(CYContext &context) const;
681 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
682 virtual void Output(CYOutput &out) const;
685 struct CYIfComprehension :
690 CYIfComprehension(CYExpression *test, CYComprehension *next = NULL) :
691 CYComprehension(next),
696 virtual const char *Name() const {
700 virtual CYFunctionParameter *Parameter(CYContext &context) const;
701 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
702 virtual void Output(CYOutput &out) const;
705 struct CYArrayComprehension :
708 CYExpression *expression_;
709 CYComprehension *comprehensions_;
711 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
712 expression_(expression),
713 comprehensions_(comprehensions)
719 virtual CYExpression *Replace(CYContext &context);
720 virtual void Output(CYOutput &out, CYFlags flags) const;
729 virtual CYExpression *Primitive(CYContext &context) {
737 virtual CYExpression *Replace(CYContext &context);
751 CYRange(uint64_t lo, uint64_t hi) :
756 bool operator [](uint8_t value) const {
757 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
760 void operator()(uint8_t value) {
763 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
767 extern CYRange DigitRange_;
768 extern CYRange WordStartRange_;
769 extern CYRange WordEndRange_;
784 CYString(const char *value) :
790 CYString(const char *value, size_t size) :
796 CYString(const CYWord *word) :
797 value_(word->Word()),
798 size_(strlen(value_))
802 const char *Value() const {
806 virtual const char *Word() const;
808 virtual CYNumber *Number(CYContext &context);
809 virtual CYString *String(CYContext &context);
811 CYString *Concat(CYContext &out, CYString *rhs) const;
812 virtual void Output(CYOutput &out, CYFlags flags) const;
813 virtual void PropertyName(CYOutput &out) const;
822 CYNumber(double value) :
827 double Value() const {
831 virtual CYNumber *Number(CYContext &context);
832 virtual CYString *String(CYContext &context);
834 virtual void Output(CYOutput &out, CYFlags flags) const;
835 virtual void PropertyName(CYOutput &out) const;
843 CYRegEx(const char *value) :
848 const char *Value() const {
852 virtual void Output(CYOutput &out, CYFlags flags) const;
864 virtual CYNumber *Number(CYContext &context);
865 virtual CYString *String(CYContext &context);
867 virtual void Output(CYOutput &out, CYFlags flags) const;
879 virtual CYExpression *Replace(CYContext &context);
880 virtual void Output(CYOutput &out, CYFlags flags) const;
886 virtual bool Value() const = 0;
887 virtual void Output(CYOutput &out, CYFlags flags) const;
899 virtual bool Value() const {
903 virtual CYNumber *Number(CYContext &context);
904 virtual CYString *String(CYContext &context);
916 virtual bool Value() const {
920 virtual CYNumber *Number(CYContext &context);
921 virtual CYString *String(CYContext &context);
929 CYVariable(CYIdentifier *name) :
934 CYVariable(const char *name) :
935 name_(new($pool) CYIdentifier(name))
942 virtual CYExpression *Replace(CYContext &context);
943 virtual void Output(CYOutput &out, CYFlags flags) const;
945 virtual CYFunctionParameter *Parameter() const;
953 CYPrefix(CYExpression *rhs) :
958 virtual bool Alphabetic() const = 0;
959 virtual const char *Operator() const = 0;
963 virtual CYExpression *Replace(CYContext &context);
964 virtual void Output(CYOutput &out, CYFlags flags) const;
973 CYInfix(CYExpression *lhs, CYExpression *rhs) :
979 void SetLeft(CYExpression *lhs) {
983 virtual bool Alphabetic() const = 0;
984 virtual const char *Operator() const = 0;
986 virtual CYExpression *Replace(CYContext &context);
987 virtual void Output(CYOutput &out, CYFlags flags) const;
995 CYPostfix(CYExpression *lhs) :
1000 virtual const char *Operator() const = 0;
1004 virtual CYExpression *Replace(CYContext &context);
1005 virtual void Output(CYOutput &out, CYFlags flags) const;
1008 struct CYAssignment :
1014 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
1020 void SetLeft(CYExpression *lhs) {
1024 virtual const char *Operator() const = 0;
1028 virtual CYExpression *Replace(CYContext &context);
1029 virtual void Output(CYOutput &out, CYFlags flags) const;
1037 CYExpression *value_;
1039 CYArgument(CYExpression *value, CYArgument *next = NULL) :
1040 CYNext<CYArgument>(next),
1046 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
1047 CYNext<CYArgument>(next),
1053 CYArgument *Replace(CYContext &context);
1054 void Output(CYOutput &out) const;
1070 CYExpression *case_;
1073 CYClause(CYExpression *_case, CYStatement *code) :
1079 void Replace(CYContext &context);
1080 virtual void Output(CYOutput &out) const;
1087 CYExpression *value_;
1089 CYElement(CYExpression *value, CYElement *next) :
1090 CYNext<CYElement>(next),
1095 void Replace(CYContext &context);
1096 void Output(CYOutput &out) const;
1102 CYElement *elements_;
1104 CYArray(CYElement *elements = NULL) :
1109 virtual CYExpression *Replace(CYContext &context);
1110 virtual void Output(CYOutput &out, CYFlags flags) const;
1117 CYPropertyName *name_;
1118 CYExpression *value_;
1120 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1121 CYNext<CYProperty>(next),
1127 void Replace(CYContext &context);
1128 virtual void Output(CYOutput &out) const;
1131 struct CYDeclaration :
1134 CYIdentifier *identifier_;
1135 CYExpression *initialiser_;
1137 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
1138 identifier_(identifier),
1139 initialiser_(initialiser)
1143 virtual void ForIn(CYOutput &out, CYFlags flags) const;
1144 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
1146 virtual CYExpression *Replace(CYContext &context);
1148 virtual CYAssignment *Assignment(CYContext &context);
1149 CYVariable *Variable(CYContext &context);
1151 virtual void Output(CYOutput &out, CYFlags flags) const;
1154 struct CYDeclarations :
1155 CYNext<CYDeclarations>,
1158 CYDeclaration *declaration_;
1160 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1161 CYNext<CYDeclarations>(next),
1162 declaration_(declaration)
1166 void Replace(CYContext &context);
1168 CYExpression *Expression(CYContext &context);
1169 CYProperty *Property(CYContext &context);
1170 CYArgument *Argument(CYContext &context);
1171 CYFunctionParameter *Parameter(CYContext &context);
1173 virtual void Output(CYOutput &out) const;
1174 virtual void Output(CYOutput &out, CYFlags flags) const;
1177 struct CYForDeclarations :
1180 CYDeclarations *declarations_;
1182 CYForDeclarations(CYDeclarations *declarations) :
1183 declarations_(declarations)
1187 virtual CYExpression *Replace(CYContext &context);
1188 virtual void Output(CYOutput &out, CYFlags flags) const;
1194 CYDeclarations *declarations_;
1196 CYVar(CYDeclarations *declarations) :
1197 declarations_(declarations)
1203 virtual CYStatement *Replace(CYContext &context);
1204 virtual void Output(CYOutput &out, CYFlags flags) const;
1207 struct CYLetStatement :
1210 CYDeclarations *declarations_;
1213 CYLetStatement(CYDeclarations *declarations, CYStatement *code) :
1214 declarations_(declarations),
1221 virtual CYStatement *Replace(CYContext &context);
1222 virtual void Output(CYOutput &out, CYFlags flags) const;
1228 CYForInitialiser *initialiser_;
1229 CYExpression *test_;
1230 CYExpression *increment_;
1233 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1234 initialiser_(initialiser),
1236 increment_(increment),
1243 virtual CYStatement *Replace(CYContext &context);
1244 virtual void Output(CYOutput &out, CYFlags flags) const;
1250 CYForInInitialiser *initialiser_;
1254 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1255 initialiser_(initialiser),
1263 virtual CYStatement *Replace(CYContext &context);
1264 virtual void Output(CYOutput &out, CYFlags flags) const;
1270 CYForInInitialiser *initialiser_;
1274 CYForOf(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1275 initialiser_(initialiser),
1283 virtual CYStatement *Replace(CYContext &context);
1284 virtual void Output(CYOutput &out, CYFlags flags) const;
1290 CYProperty *properties_;
1292 CYObject(CYProperty *properties = NULL) :
1293 properties_(properties)
1297 virtual CYExpression *Replace(CYContext &context);
1298 void Output(CYOutput &out, CYFlags flags) const;
1304 CYExpression *object_;
1305 CYExpression *property_;
1307 CYMember(CYExpression *object, CYExpression *property) :
1313 void SetLeft(CYExpression *object) {
1318 struct CYDirectMember :
1321 CYDirectMember(CYExpression *object, CYExpression *property) :
1322 CYMember(object, property)
1329 virtual CYExpression *Replace(CYContext &context);
1330 virtual void Output(CYOutput &out, CYFlags flags) const;
1333 struct CYIndirectMember :
1336 CYIndirectMember(CYExpression *object, CYExpression *property) :
1337 CYMember(object, property)
1344 virtual CYExpression *Replace(CYContext &context);
1345 virtual void Output(CYOutput &out, CYFlags flags) const;
1354 CYExpression *constructor_;
1355 CYArgument *arguments_;
1357 New(CYExpression *constructor, CYArgument *arguments) :
1358 constructor_(constructor),
1359 arguments_(arguments)
1363 virtual int Precedence() const {
1364 return arguments_ == NULL ? 2 : 1;
1369 virtual CYExpression *Replace(CYContext &context);
1370 virtual void Output(CYOutput &out, CYFlags flags) const;
1372 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1380 CYExpression *function_;
1381 CYArgument *arguments_;
1383 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1384 function_(function),
1385 arguments_(arguments)
1392 virtual CYExpression *Replace(CYContext &context);
1393 virtual void Output(CYOutput &out, CYFlags flags) const;
1395 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1400 struct CYRubyBlock :
1403 CYExpression *call_;
1406 CYRubyBlock(CYExpression *call, CYRubyProc *proc) :
1415 virtual CYExpression *Replace(CYContext &context);
1416 virtual void Output(CYOutput &out, CYFlags flags) const;
1422 CYExpression *test_;
1424 CYStatement *false_;
1426 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1435 virtual CYStatement *Replace(CYContext &context);
1436 virtual void Output(CYOutput &out, CYFlags flags) const;
1438 virtual CYStatement *Return();
1444 CYExpression *test_;
1447 CYDoWhile(CYExpression *test, CYStatement *code) :
1455 virtual CYStatement *Replace(CYContext &context);
1456 virtual void Output(CYOutput &out, CYFlags flags) const;
1462 CYExpression *test_;
1465 CYWhile(CYExpression *test, CYStatement *code) :
1473 virtual CYStatement *Replace(CYContext &context);
1474 virtual void Output(CYOutput &out, CYFlags flags) const;
1477 // XXX: this should be split up into CYAnonymousFunction and CYNamedFunction (subclass)
1479 CYIdentifier *name_;
1480 CYFunctionParameter *parameters_;
1483 CYNonLocal *nonlocal_;
1487 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
1489 parameters_(parameters),
1496 void Inject(CYContext &context);
1497 virtual void Replace_(CYContext &context, bool outer);
1498 virtual void Output(CYOutput &out, CYFlags flags) const;
1501 // XXX: this should be split up into CYAnonymousFunctionExpression and CYNamedFunctionExpression
1502 struct CYFunctionExpression :
1506 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
1507 CYFunction(name, parameters, code)
1514 virtual CYExpression *Replace(CYContext &context);
1515 virtual void Output(CYOutput &out, CYFlags flags) const;
1518 // XXX: this should derive from CYAnonymousFunction
1523 CYFatArrow(CYFunctionParameter *parameters, CYStatement *code) :
1524 CYFunction(NULL, parameters, code)
1531 virtual CYExpression *Replace(CYContext &context);
1532 virtual void Output(CYOutput &out, CYFlags flags) const;
1535 // XXX: this should derive from CYAnonymousFunctionExpression
1537 CYFunctionExpression
1539 CYRubyProc(CYFunctionParameter *parameters, CYStatement *code) :
1540 CYFunctionExpression(NULL, parameters, code)
1544 virtual CYExpression *Replace(CYContext &context);
1545 virtual void Output(CYOutput &out, CYFlags flags) const;
1548 // XXX: this should derive from CYNamedFunction
1549 struct CYFunctionStatement :
1553 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
1554 CYFunction(name, parameters, code)
1560 virtual CYStatement *Replace(CYContext &context);
1561 virtual void Output(CYOutput &out, CYFlags flags) const;
1567 CYExpression *expression_;
1569 CYExpress(CYExpression *expression) :
1570 expression_(expression)
1572 if (expression_ == NULL)
1578 virtual CYStatement *Replace(CYContext &context);
1579 virtual void Output(CYOutput &out, CYFlags flags) const;
1581 virtual CYStatement *Return();
1587 CYIdentifier *label_;
1589 CYContinue(CYIdentifier *label) :
1596 virtual CYStatement *Replace(CYContext &context);
1597 virtual void Output(CYOutput &out, CYFlags flags) const;
1603 CYIdentifier *label_;
1605 CYBreak(CYIdentifier *label) :
1612 virtual CYStatement *Replace(CYContext &context);
1613 virtual void Output(CYOutput &out, CYFlags flags) const;
1619 CYExpression *value_;
1621 CYReturn(CYExpression *value) :
1628 virtual CYStatement *Replace(CYContext &context);
1629 virtual void Output(CYOutput &out, CYFlags flags) const;
1637 virtual CYStatement *Replace(CYContext &context);
1638 virtual void Output(CYOutput &out, CYFlags flags) const;
1646 CYFinally(CYStatement *code) :
1651 void Replace(CYContext &context);
1652 virtual void Output(CYOutput &out) const;
1655 struct CYTypeSpecifier :
1658 virtual CYExpression *Replace(CYContext &context) = 0;
1661 struct CYTypeError :
1667 virtual CYExpression *Replace(CYContext &context);
1668 virtual void Output(CYOutput &out) const;
1677 virtual CYExpression *Replace(CYContext &context);
1678 virtual void Output(CYOutput &out) const;
1681 struct CYTypeVariable :
1684 CYIdentifier *name_;
1686 CYTypeVariable(CYIdentifier *name) :
1691 CYTypeVariable(const char *name) :
1692 name_(new($pool) CYIdentifier(name))
1696 virtual CYExpression *Replace(CYContext &context);
1697 virtual void Output(CYOutput &out) const;
1700 struct CYTypeUnsigned :
1703 CYTypeSpecifier *specifier_;
1705 CYTypeUnsigned(CYTypeSpecifier *specifier) :
1706 specifier_(specifier)
1710 virtual CYExpression *Replace(CYContext &context);
1711 virtual void Output(CYOutput &out) const;
1714 struct CYTypeSigned :
1717 CYTypeSpecifier *specifier_;
1719 CYTypeSigned(CYTypeSpecifier *specifier) :
1720 specifier_(specifier)
1724 virtual CYExpression *Replace(CYContext &context);
1725 virtual void Output(CYOutput &out) const;
1731 CYTypeSpecifier *specifier_;
1733 CYTypeLong(CYTypeSpecifier *specifier) :
1734 specifier_(specifier)
1738 virtual CYExpression *Replace(CYContext &context);
1739 virtual void Output(CYOutput &out) const;
1742 struct CYTypeShort :
1745 CYTypeSpecifier *specifier_;
1747 CYTypeShort(CYTypeSpecifier *specifier) :
1748 specifier_(specifier)
1752 virtual CYExpression *Replace(CYContext &context);
1753 virtual void Output(CYOutput &out) const;
1756 struct CYTypeFunctionWith;
1758 struct CYTypeModifier :
1759 CYNext<CYTypeModifier>
1761 CYTypeModifier(CYTypeModifier *next) :
1762 CYNext<CYTypeModifier>(next)
1766 virtual int Precedence() const = 0;
1768 virtual CYExpression *Replace_(CYContext &context, CYExpression *type) = 0;
1769 CYExpression *Replace(CYContext &context, CYExpression *type);
1771 virtual void Output(CYOutput &out, CYIdentifier *identifier) const = 0;
1772 void Output(CYOutput &out, int precedence, CYIdentifier *identifier) const;
1774 virtual CYTypeFunctionWith *Function() { return NULL; }
1777 struct CYTypeArrayOf :
1780 CYExpression *size_;
1782 CYTypeArrayOf(CYExpression *size, CYTypeModifier *next = NULL) :
1783 CYTypeModifier(next),
1790 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1791 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1794 struct CYTypeConstant :
1797 CYTypeConstant(CYTypeModifier *next = NULL) :
1798 CYTypeModifier(next)
1804 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1805 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1808 struct CYTypePointerTo :
1811 CYTypePointerTo(CYTypeModifier *next = NULL) :
1812 CYTypeModifier(next)
1818 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1819 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1822 struct CYTypeVolatile :
1825 CYTypeVolatile(CYTypeModifier *next = NULL) :
1826 CYTypeModifier(next)
1832 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
1833 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
1836 struct CYTypedIdentifier :
1837 CYNext<CYTypedIdentifier>,
1840 CYLocation location_;
1841 CYIdentifier *identifier_;
1842 CYTypeSpecifier *specifier_;
1843 CYTypeModifier *modifier_;
1845 CYTypedIdentifier(const CYLocation &location, CYIdentifier *identifier = NULL) :
1846 location_(location),
1847 identifier_(identifier),
1853 CYTypedIdentifier(CYTypeSpecifier *specifier, CYTypeModifier *modifier = NULL) :
1855 specifier_(specifier),
1860 inline CYTypedIdentifier *Modify(CYTypeModifier *modifier) {
1861 CYSetLast(modifier_) = modifier;
1865 virtual CYExpression *Replace(CYContext &context);
1866 virtual void Output(CYOutput &out) const;
1868 CYTypeFunctionWith *Function();
1871 struct CYEncodedType :
1874 CYTypedIdentifier *typed_;
1876 CYEncodedType(CYTypedIdentifier *typed) :
1883 virtual CYExpression *Replace(CYContext &context);
1884 virtual void Output(CYOutput &out, CYFlags flags) const;
1887 struct CYTypedParameter :
1888 CYNext<CYTypedParameter>,
1891 CYTypedIdentifier *typed_;
1893 CYTypedParameter(CYTypedIdentifier *typed, CYTypedParameter *next) :
1894 CYNext<CYTypedParameter>(next),
1899 CYArgument *Argument(CYContext &context);
1900 CYFunctionParameter *Parameters(CYContext &context);
1901 CYExpression *TypeSignature(CYContext &context, CYExpression *prefix);
1903 virtual void Output(CYOutput &out) const;
1909 CYTypedIdentifier *typed_;
1910 CYTypedParameter *parameters_;
1913 CYLambda(CYTypedIdentifier *typed, CYTypedParameter *parameters, CYStatement *code) :
1915 parameters_(parameters),
1922 virtual CYExpression *Replace(CYContext &context);
1923 virtual void Output(CYOutput &out, CYFlags flags) const;
1932 CYModule(CYWord *part, CYModule *next = NULL) :
1933 CYNext<CYModule>(next),
1938 CYString *Replace(CYContext &context, const char *separator) const;
1939 void Output(CYOutput &out) const;
1947 CYImport(CYModule *module) :
1954 virtual CYStatement *Replace(CYContext &context);
1955 virtual void Output(CYOutput &out, CYFlags flags) const;
1962 CYTypedIdentifier *typed_;
1964 CYExternal(CYString *abi, CYTypedIdentifier *typed) :
1972 virtual CYStatement *Replace(CYContext &context);
1973 virtual void Output(CYOutput &out, CYFlags flags) const;
1976 struct CYTypeDefinition :
1979 CYTypedIdentifier *typed_;
1981 CYTypeDefinition(CYTypedIdentifier *typed) :
1988 virtual CYStatement *Replace(CYContext &context);
1989 virtual void Output(CYOutput &out, CYFlags flags) const;
1992 struct CYTypeBlockWith :
1995 CYTypedParameter *parameters_;
1997 CYTypeBlockWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
1998 CYTypeModifier(next),
1999 parameters_(parameters)
2005 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
2006 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2009 struct CYTypeFunctionWith :
2012 CYTypedParameter *parameters_;
2014 CYTypeFunctionWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
2015 CYTypeModifier(next),
2016 parameters_(parameters)
2022 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
2023 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2025 virtual CYTypeFunctionWith *Function() { return this; }
2034 CYIdentifier *name_;
2037 Catch(CYIdentifier *name, CYStatement *code) :
2043 void Replace(CYContext &context);
2044 virtual void Output(CYOutput &out) const;
2052 CYFinally *finally_;
2054 Try(CYStatement *code, Catch *_catch, CYFinally *finally) :
2063 virtual CYStatement *Replace(CYContext &context);
2064 virtual void Output(CYOutput &out, CYFlags flags) const;
2070 CYExpression *value_;
2072 Throw(CYExpression *value = NULL) :
2079 virtual CYStatement *Replace(CYContext &context);
2080 virtual void Output(CYOutput &out, CYFlags flags) const;
2088 CYExpression *scope_;
2091 CYWith(CYExpression *scope, CYStatement *code) :
2099 virtual CYStatement *Replace(CYContext &context);
2100 virtual void Output(CYOutput &out, CYFlags flags) const;
2106 CYExpression *value_;
2109 CYSwitch(CYExpression *value, CYClause *clauses) :
2117 virtual CYStatement *Replace(CYContext &context);
2118 virtual void Output(CYOutput &out, CYFlags flags) const;
2130 virtual CYStatement *Replace(CYContext &context);
2131 virtual void Output(CYOutput &out, CYFlags flags) const;
2134 struct CYCondition :
2137 CYExpression *test_;
2138 CYExpression *true_;
2139 CYExpression *false_;
2141 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
2150 virtual CYExpression *Replace(CYContext &context);
2151 virtual void Output(CYOutput &out, CYFlags flags) const;
2154 struct CYAddressOf :
2157 CYAddressOf(CYExpression *rhs) :
2162 virtual const char *Operator() const {
2168 virtual CYExpression *Replace(CYContext &context);
2174 CYIndirect(CYExpression *rhs) :
2179 virtual const char *Operator() const {
2185 virtual CYExpression *Replace(CYContext &context);
2189 virtual CYExpression *Replace(CYContext &context);
2191 #define CYPostfix_(op, name, args...) \
2192 struct CY ## name : \
2195 CY ## name(CYExpression *lhs) : \
2200 virtual const char *Operator() const { \
2205 #define CYPrefix_(alphabetic, op, name, args...) \
2206 struct CY ## name : \
2209 CY ## name(CYExpression *rhs) : \
2214 CYAlphabetic(alphabetic) \
2216 virtual const char *Operator() const { \
2221 #define CYInfix_(alphabetic, precedence, op, name, args...) \
2222 struct CY ## name : \
2225 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
2230 CYAlphabetic(alphabetic) \
2231 CYPrecedence(precedence) \
2233 virtual const char *Operator() const { \
2238 #define CYAssignment_(op, name, args...) \
2239 struct CY ## name ## Assign : \
2242 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
2243 CYAssignment(lhs, rhs) \
2247 virtual const char *Operator() const { \
2252 CYPostfix_("++", PostIncrement)
2253 CYPostfix_("--", PostDecrement)
2255 CYPrefix_(true, "delete", Delete)
2256 CYPrefix_(true, "void", Void)
2257 CYPrefix_(true, "typeof", TypeOf)
2258 CYPrefix_(false, "++", PreIncrement)
2259 CYPrefix_(false, "--", PreDecrement)
2260 CYPrefix_(false, "+", Affirm)
2261 CYPrefix_(false, "-", Negate)
2262 CYPrefix_(false, "~", BitwiseNot)
2263 CYPrefix_(false, "!", LogicalNot)
2265 CYInfix_(false, 5, "*", Multiply, CYReplace)
2266 CYInfix_(false, 5, "/", Divide)
2267 CYInfix_(false, 5, "%", Modulus)
2268 CYInfix_(false, 6, "+", Add, CYReplace)
2269 CYInfix_(false, 6, "-", Subtract)
2270 CYInfix_(false, 7, "<<", ShiftLeft)
2271 CYInfix_(false, 7, ">>", ShiftRightSigned)
2272 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
2273 CYInfix_(false, 8, "<", Less)
2274 CYInfix_(false, 8, ">", Greater)
2275 CYInfix_(false, 8, "<=", LessOrEqual)
2276 CYInfix_(false, 8, ">=", GreaterOrEqual)
2277 CYInfix_(true, 8, "instanceof", InstanceOf)
2278 CYInfix_(true, 8, "in", In)
2279 CYInfix_(false, 9, "==", Equal)
2280 CYInfix_(false, 9, "!=", NotEqual)
2281 CYInfix_(false, 9, "===", Identical)
2282 CYInfix_(false, 9, "!==", NotIdentical)
2283 CYInfix_(false, 10, "&", BitwiseAnd)
2284 CYInfix_(false, 11, "^", BitwiseXOr)
2285 CYInfix_(false, 12, "|", BitwiseOr)
2286 CYInfix_(false, 13, "&&", LogicalAnd)
2287 CYInfix_(false, 14, "||", LogicalOr)
2289 CYAssignment_("=", )
2290 CYAssignment_("*=", Multiply)
2291 CYAssignment_("/=", Divide)
2292 CYAssignment_("%=", Modulus)
2293 CYAssignment_("+=", Add)
2294 CYAssignment_("-=", Subtract)
2295 CYAssignment_("<<=", ShiftLeft)
2296 CYAssignment_(">>=", ShiftRightSigned)
2297 CYAssignment_(">>>=", ShiftRightUnsigned)
2298 CYAssignment_("&=", BitwiseAnd)
2299 CYAssignment_("^=", BitwiseXOr)
2300 CYAssignment_("|=", BitwiseOr)
2302 #endif/*CYCRIPT_PARSER_HPP*/