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_SYNTAX_HPP
23 #define CYCRIPT_SYNTAX_HPP
35 #include "Location.hpp"
36 #include "Options.hpp"
37 #include "Pooling.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) {
114 struct CYPropertyName {
115 virtual bool Computed() const {
119 virtual bool Constructor() const {
123 virtual CYExpression *PropertyName(CYContext &context) = 0;
124 virtual void PropertyName(CYOutput &out) const = 0;
135 CYNoBrace = (1 << 0),
136 CYNoFunction = (1 << 1),
137 CYNoClass = (1 << 2),
140 CYNoRightHand = (1 << 5),
141 CYNoDangle = (1 << 6),
142 CYNoInteger = (1 << 7),
143 CYNoBFC = (CYNoBrace | CYNoFunction | CYNoClass),
146 _finline CYFlags operator ~(CYFlags rhs) {
147 return static_cast<CYFlags>(~static_cast<unsigned>(rhs));
150 _finline CYFlags operator &(CYFlags lhs, CYFlags rhs) {
151 return static_cast<CYFlags>(static_cast<unsigned>(lhs) & static_cast<unsigned>(rhs));
154 _finline CYFlags operator |(CYFlags lhs, CYFlags rhs) {
155 return static_cast<CYFlags>(static_cast<unsigned>(lhs) | static_cast<unsigned>(rhs));
158 _finline CYFlags &operator |=(CYFlags &lhs, CYFlags rhs) {
159 return lhs = lhs | rhs;
162 _finline CYFlags CYLeft(CYFlags flags) {
163 return flags & ~(CYNoDangle | CYNoInteger);
166 _finline CYFlags CYRight(CYFlags flags) {
167 return flags & ~CYNoBFC;
170 _finline CYFlags CYCenter(CYFlags flags) {
171 return CYLeft(CYRight(flags));
180 #define CYCompact(type) \
181 virtual CYCompactType Compact() const { \
182 return CYCompact ## type; \
189 void Single(CYOutput &out, CYFlags flags, CYCompactType request) const;
190 void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
191 virtual void Output(CYOutput &out) const;
193 virtual CYStatement *Replace(CYContext &context) = 0;
195 virtual CYCompactType Compact() const = 0;
196 virtual CYStatement *Return();
199 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
202 typedef CYList<CYStatement> CYStatements;
210 CYWord(const char *word) :
215 void Set(const char *value) {
219 virtual bool Constructor() const {
220 return strcmp(word_, "constructor") == 0;
223 virtual const char *Word() const;
224 virtual void Output(CYOutput &out) const;
226 virtual CYExpression *PropertyName(CYContext &context);
227 virtual void PropertyName(CYOutput &out) const;
230 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
232 return lhs << rhs.Word();
235 struct CYIdentifier :
236 CYNext<CYIdentifier>,
239 CYIdentifier *replace_;
243 CYIdentifier(const char *word) :
251 virtual const char *Word() const;
252 CYIdentifier *Replace(CYContext &context);
259 CYStatement *statement_;
261 CYLabel(CYIdentifier *name, CYStatement *statement) :
263 statement_(statement)
269 virtual CYStatement *Replace(CYContext &context);
270 virtual void Output(CYOutput &out, CYFlags flags) const;
273 struct CYCStringLess :
274 std::binary_function<const char *, const char *, bool>
276 _finline bool operator ()(const char *lhs, const char *rhs) const {
277 return strcmp(lhs, rhs) < 0;
281 struct CYIdentifierValueLess :
282 std::binary_function<CYIdentifier *, CYIdentifier *, bool>
284 _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
285 return CYCStringLess()(lhs->Word(), rhs->Word());
289 enum CYIdentifierFlags {
290 CYIdentifierArgument,
291 CYIdentifierVariable,
297 typedef std::set<const char *, CYCStringLess> CYCStringSet;
298 typedef std::set<CYIdentifier *, CYIdentifierValueLess> CYIdentifierValueSet;
299 typedef std::map<CYIdentifier *, CYIdentifierFlags> CYIdentifierAddressFlagsMap;
301 struct CYIdentifierUsage {
302 CYIdentifier *identifier_;
306 typedef std::vector<CYIdentifierUsage> CYIdentifierUsageVector;
312 CYIdentifierAddressFlagsMap internal_;
313 CYIdentifierValueSet identifiers_;
315 CYScope(bool transparent, CYContext &context);
317 void Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags);
318 virtual CYIdentifier *Lookup(CYContext &context, CYIdentifier *identifier);
319 void Merge(CYContext &context, CYIdentifier *identifier);
320 void Close(CYContext &context, CYStatement *&statements);
328 CYScript(CYStatement *code) :
333 virtual void Replace(CYContext &context);
334 virtual void Output(CYOutput &out) const;
345 CYIdentifier *super_;
347 CYIdentifierUsageVector rename_;
349 CYNonLocal *nonlocal_;
350 CYNonLocal *nextlocal_;
353 CYContext(CYOptions &options) :
364 void ReplaceAll(CYStatement *&statement) {
365 if (statement == NULL)
367 CYStatement *next(statement->next_);
372 if (statement == NULL)
375 statement->SetNext(next);
378 template <typename Type_>
379 void Replace(Type_ *&value) {
380 for (;;) if (value == NULL)
383 Type_ *replace(value->Replace(*this));
384 if (replace != value)
390 void NonLocal(CYStatement *&statements);
391 CYIdentifier *Unique();
395 CYIdentifier *identifier_;
402 CYIdentifier *Target(CYContext &context) {
403 if (identifier_ == NULL)
404 identifier_ = context.Unique();
412 CYIdentifier *identifier_;
419 CYIdentifier *Identifier(CYContext &context) {
421 return next_->Identifier(context);
422 if (identifier_ == NULL)
423 identifier_ = context.Unique();
433 CYBlock(CYStatement *code) :
440 virtual CYStatement *Replace(CYContext &context);
442 virtual void Output(CYOutput &out, CYFlags flags) const;
444 virtual CYStatement *Return();
447 struct CYForInitializer {
448 virtual CYExpression *Replace(CYContext &context) = 0;
449 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
452 struct CYForInInitializer {
453 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
454 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value) = 0;
456 virtual CYExpression *Replace(CYContext &context) = 0;
457 virtual CYAssignment *Assignment(CYContext &context) = 0;
459 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
462 struct CYFunctionParameter;
467 struct CYExpression :
472 virtual int Precedence() const = 0;
474 virtual bool RightHand() const {
478 virtual void ForIn(CYOutput &out, CYFlags flags) const;
479 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
481 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
483 virtual void Output(CYOutput &out) const;
484 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
485 void Output(CYOutput &out, int precedence, CYFlags flags) const;
487 virtual CYExpression *Replace(CYContext &context) = 0;
488 virtual CYAssignment *Assignment(CYContext &context);
490 virtual CYExpression *Primitive(CYContext &context) {
494 virtual CYFunctionParameter *Parameter() const;
496 virtual CYNumber *Number(CYContext &context) {
500 virtual CYString *String(CYContext &context) {
504 virtual const char *Word() const {
509 #define CYAlphabetic(value) \
510 virtual bool Alphabetic() const { \
514 #define CYPrecedence(value) \
515 static const int Precedence_ = value; \
516 virtual int Precedence() const { \
517 return Precedence_; \
520 #define CYRightHand(value) \
521 virtual bool RightHand() const { \
528 CYExpression *expression_;
531 CYCompound(CYExpression *expression, CYExpression *next) :
532 expression_(expression),
535 _assert(expression_ != NULL);
536 _assert(next != NULL);
541 virtual CYExpression *Replace(CYContext &context);
542 void Output(CYOutput &out, CYFlags flags) const;
544 virtual CYFunctionParameter *Parameter() const;
547 struct CYParenthetical :
550 CYExpression *expression_;
552 CYParenthetical(CYExpression *expression) :
553 expression_(expression)
559 virtual CYExpression *Replace(CYContext &context);
560 void Output(CYOutput &out, CYFlags flags) const;
563 struct CYDeclaration;
565 struct CYFunctionParameter :
566 CYNext<CYFunctionParameter>,
569 CYForInInitializer *initialiser_;
571 CYFunctionParameter(CYForInInitializer *initialiser, CYFunctionParameter *next = NULL) :
572 CYNext<CYFunctionParameter>(next),
573 initialiser_(initialiser)
577 void Replace(CYContext &context, CYStatement *&statements);
578 void Output(CYOutput &out) const;
581 struct CYComprehension :
582 CYNext<CYComprehension>,
585 CYComprehension(CYComprehension *next = NULL) :
586 CYNext<CYComprehension>(next)
590 CYComprehension *Modify(CYComprehension *next) {
595 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
596 CYFunctionParameter *Parameters(CYContext &context) const;
597 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
598 virtual void Output(CYOutput &out) const = 0;
601 struct CYForInComprehension :
604 CYDeclaration *declaration_;
607 CYForInComprehension(CYDeclaration *declaration, CYExpression *set, CYComprehension *next = NULL) :
608 CYComprehension(next),
609 declaration_(declaration),
614 virtual CYFunctionParameter *Parameter(CYContext &context) const;
615 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
616 virtual void Output(CYOutput &out) const;
619 struct CYForOfComprehension :
622 CYDeclaration *declaration_;
625 CYForOfComprehension(CYDeclaration *declaration, CYExpression *set, CYComprehension *next = NULL) :
626 CYComprehension(next),
627 declaration_(declaration),
632 virtual CYFunctionParameter *Parameter(CYContext &context) const;
633 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
634 virtual void Output(CYOutput &out) const;
637 struct CYIfComprehension :
642 CYIfComprehension(CYExpression *test, CYComprehension *next = NULL) :
643 CYComprehension(next),
648 virtual CYFunctionParameter *Parameter(CYContext &context) const;
649 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
650 virtual void Output(CYOutput &out) const;
653 struct CYArrayComprehension :
656 CYExpression *expression_;
657 CYComprehension *comprehensions_;
659 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
660 expression_(expression),
661 comprehensions_(comprehensions)
667 virtual CYExpression *Replace(CYContext &context);
668 virtual void Output(CYOutput &out, CYFlags flags) const;
677 virtual CYExpression *Primitive(CYContext &context) {
685 virtual CYExpression *Replace(CYContext &context);
699 CYRange(uint64_t lo, uint64_t hi) :
704 bool operator [](uint8_t value) const {
705 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
708 void operator()(uint8_t value) {
711 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
715 extern CYRange DigitRange_;
716 extern CYRange WordStartRange_;
717 extern CYRange WordEndRange_;
732 CYString(const char *value) :
738 CYString(const char *value, size_t size) :
744 CYString(const CYWord *word) :
745 value_(word->Word()),
746 size_(strlen(value_))
750 const char *Value() const {
754 virtual const char *Word() const;
756 virtual CYNumber *Number(CYContext &context);
757 virtual CYString *String(CYContext &context);
759 CYString *Concat(CYContext &out, CYString *rhs) const;
760 virtual void Output(CYOutput &out, CYFlags flags) const;
762 virtual CYExpression *PropertyName(CYContext &context);
763 virtual void PropertyName(CYOutput &out) const;
766 struct CYElementValue;
771 CYExpression *expression_;
774 CYSpan(CYExpression *expression, CYString *string, CYSpan *next) :
775 CYNext<CYSpan>(next),
776 expression_(expression),
781 CYElementValue *Replace(CYContext &context);
790 CYTemplate(CYString *string, CYSpan *spans) :
799 virtual CYExpression *Replace(CYContext &context);
800 virtual void Output(CYOutput &out, CYFlags flags) const;
809 CYNumber(double value) :
814 double Value() const {
818 virtual CYNumber *Number(CYContext &context);
819 virtual CYString *String(CYContext &context);
821 virtual void Output(CYOutput &out, CYFlags flags) const;
823 virtual CYExpression *PropertyName(CYContext &context);
824 virtual void PropertyName(CYOutput &out) const;
830 CYExpression *expression_;
832 CYComputed(CYExpression *expression) :
833 expression_(expression)
837 virtual bool Computed() const {
841 virtual CYExpression *PropertyName(CYContext &context);
842 virtual void PropertyName(CYOutput &out) const;
851 CYRegEx(const char *value, size_t size) :
857 const char *Value() const {
861 virtual void Output(CYOutput &out, CYFlags flags) const;
867 virtual CYNumber *Number(CYContext &context);
868 virtual CYString *String(CYContext &context);
870 virtual void Output(CYOutput &out, CYFlags flags) const;
876 virtual CYExpression *Replace(CYContext &context);
877 virtual void Output(CYOutput &out, CYFlags flags) const;
883 virtual bool Value() const = 0;
884 virtual void Output(CYOutput &out, CYFlags flags) const;
890 virtual bool Value() const {
894 virtual CYNumber *Number(CYContext &context);
895 virtual CYString *String(CYContext &context);
901 virtual bool Value() const {
905 virtual CYNumber *Number(CYContext &context);
906 virtual CYString *String(CYContext &context);
914 CYVariable(CYIdentifier *name) :
919 CYVariable(const char *name) :
920 name_(new($pool) CYIdentifier(name))
927 virtual CYExpression *Replace(CYContext &context);
928 virtual void Output(CYOutput &out, CYFlags flags) const;
930 virtual CYFunctionParameter *Parameter() const;
938 CYPrefix(CYExpression *rhs) :
943 virtual bool Alphabetic() const = 0;
944 virtual const char *Operator() const = 0;
948 virtual CYExpression *Replace(CYContext &context);
949 virtual void Output(CYOutput &out, CYFlags flags) const;
958 CYInfix(CYExpression *lhs, CYExpression *rhs) :
964 void SetLeft(CYExpression *lhs) {
968 virtual bool Alphabetic() const = 0;
969 virtual const char *Operator() const = 0;
971 virtual CYExpression *Replace(CYContext &context);
972 virtual void Output(CYOutput &out, CYFlags flags) const;
980 CYPostfix(CYExpression *lhs) :
985 virtual const char *Operator() const = 0;
989 virtual CYExpression *Replace(CYContext &context);
990 virtual void Output(CYOutput &out, CYFlags flags) const;
993 struct CYAssignment :
999 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
1005 void SetLeft(CYExpression *lhs) {
1009 virtual const char *Operator() const = 0;
1013 virtual CYExpression *Replace(CYContext &context);
1014 virtual void Output(CYOutput &out, CYFlags flags) const;
1022 CYExpression *value_;
1024 CYArgument(CYExpression *value, CYArgument *next = NULL) :
1025 CYNext<CYArgument>(next),
1031 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
1032 CYNext<CYArgument>(next),
1038 CYArgument *Replace(CYContext &context);
1039 void Output(CYOutput &out) const;
1046 CYExpression *case_;
1049 CYClause(CYExpression *_case, CYStatement *code) :
1055 void Replace(CYContext &context);
1056 virtual void Output(CYOutput &out) const;
1062 virtual bool Elision() const = 0;
1064 virtual void Replace(CYContext &context) = 0;
1067 struct CYElementValue :
1071 CYExpression *value_;
1073 CYElementValue(CYExpression *value, CYElement *next) :
1074 CYNext<CYElement>(next),
1079 virtual bool Elision() const {
1080 return value_ == NULL;
1083 virtual void Replace(CYContext &context);
1084 virtual void Output(CYOutput &out) const;
1087 struct CYElementSpread :
1090 CYExpression *value_;
1092 CYElementSpread(CYExpression *value) :
1097 virtual bool Elision() const {
1101 virtual void Replace(CYContext &context);
1102 virtual void Output(CYOutput &out) const;
1108 CYElement *elements_;
1110 CYArray(CYElement *elements = NULL) :
1115 virtual CYExpression *Replace(CYContext &context);
1116 virtual void Output(CYOutput &out, CYFlags flags) const;
1119 struct CYDeclaration :
1122 CYIdentifier *identifier_;
1123 CYExpression *initialiser_;
1125 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
1126 identifier_(identifier),
1127 initialiser_(initialiser)
1131 virtual void ForIn(CYOutput &out, CYFlags flags) const;
1132 virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
1134 virtual CYExpression *Replace(CYContext &context);
1136 virtual CYAssignment *Assignment(CYContext &context);
1137 CYVariable *Variable(CYContext &context);
1139 virtual void Output(CYOutput &out, CYFlags flags) const;
1142 struct CYDeclarations :
1143 CYNext<CYDeclarations>,
1146 CYDeclaration *declaration_;
1148 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
1149 CYNext<CYDeclarations>(next),
1150 declaration_(declaration)
1154 void Replace(CYContext &context);
1156 CYExpression *Expression(CYContext &context);
1157 CYArgument *Argument(CYContext &context);
1158 CYFunctionParameter *Parameter(CYContext &context);
1160 virtual void Output(CYOutput &out) const;
1161 virtual void Output(CYOutput &out, CYFlags flags) const;
1164 struct CYForDeclarations :
1167 CYDeclarations *declarations_;
1169 CYForDeclarations(CYDeclarations *declarations) :
1170 declarations_(declarations)
1174 virtual CYExpression *Replace(CYContext &context);
1175 virtual void Output(CYOutput &out, CYFlags flags) const;
1181 CYDeclarations *declarations_;
1183 CYVar(CYDeclarations *declarations) :
1184 declarations_(declarations)
1190 virtual CYStatement *Replace(CYContext &context);
1191 virtual void Output(CYOutput &out, CYFlags flags) const;
1194 struct CYLetStatement :
1197 CYDeclarations *declarations_;
1200 CYLetStatement(CYDeclarations *declarations, CYStatement *code) :
1201 declarations_(declarations),
1208 virtual CYStatement *Replace(CYContext &context);
1209 virtual void Output(CYOutput &out, CYFlags flags) const;
1213 CYList<CYDeclarations> declarations_;
1214 CYList<CYStatement> statements_;
1216 operator bool() const {
1217 return statements_ != NULL;
1225 CYPropertyName *name_;
1227 CYProperty(CYPropertyName *name, CYProperty *next = NULL) :
1228 CYNext<CYProperty>(next),
1233 CYProperty *ReplaceAll(CYContext &context, CYBuilder &builder, CYExpression *self, bool update);
1234 void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, bool computed);
1236 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name) = 0;
1238 virtual void Replace(CYContext &context) = 0;
1239 virtual void Output(CYOutput &out) const;
1242 struct CYPropertyValue :
1245 CYExpression *value_;
1247 CYPropertyValue(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1248 CYProperty(name, next),
1253 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name);
1254 virtual void Replace(CYContext &context);
1255 virtual void Output(CYOutput &out) const;
1261 CYForInitializer *initialiser_;
1262 CYExpression *test_;
1263 CYExpression *increment_;
1266 CYFor(CYForInitializer *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
1267 initialiser_(initialiser),
1269 increment_(increment),
1276 virtual CYStatement *Replace(CYContext &context);
1277 virtual void Output(CYOutput &out, CYFlags flags) const;
1283 CYForInInitializer *initialiser_;
1287 CYForIn(CYForInInitializer *initialiser, CYExpression *set, CYStatement *code) :
1288 initialiser_(initialiser),
1296 virtual CYStatement *Replace(CYContext &context);
1297 virtual void Output(CYOutput &out, CYFlags flags) const;
1303 CYForInInitializer *initialiser_;
1307 CYForOf(CYForInInitializer *initialiser, CYExpression *set, CYStatement *code) :
1308 initialiser_(initialiser),
1316 virtual CYStatement *Replace(CYContext &context);
1317 virtual void Output(CYOutput &out, CYFlags flags) const;
1323 CYProperty *properties_;
1325 CYObject(CYProperty *properties = NULL) :
1326 properties_(properties)
1330 virtual CYExpression *Replace(CYContext &context);
1331 void Output(CYOutput &out, CYFlags flags) const;
1337 CYExpression *object_;
1338 CYExpression *property_;
1340 CYMember(CYExpression *object, CYExpression *property) :
1346 void SetLeft(CYExpression *object) {
1351 struct CYDirectMember :
1354 CYDirectMember(CYExpression *object, CYExpression *property) :
1355 CYMember(object, property)
1362 virtual CYExpression *Replace(CYContext &context);
1363 virtual void Output(CYOutput &out, CYFlags flags) const;
1366 struct CYIndirectMember :
1369 CYIndirectMember(CYExpression *object, CYExpression *property) :
1370 CYMember(object, property)
1377 virtual CYExpression *Replace(CYContext &context);
1378 virtual void Output(CYOutput &out, CYFlags flags) const;
1387 CYExpression *constructor_;
1388 CYArgument *arguments_;
1390 New(CYExpression *constructor, CYArgument *arguments = NULL) :
1391 constructor_(constructor),
1392 arguments_(arguments)
1396 virtual int Precedence() const {
1397 return arguments_ == NULL ? 2 : 1;
1402 virtual CYExpression *Replace(CYContext &context);
1403 virtual void Output(CYOutput &out, CYFlags flags) const;
1405 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1413 CYExpression *function_;
1414 CYArgument *arguments_;
1416 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1417 function_(function),
1418 arguments_(arguments)
1425 virtual CYExpression *Replace(CYContext &context);
1426 virtual void Output(CYOutput &out, CYFlags flags) const;
1428 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1433 struct CYRubyBlock :
1436 CYExpression *call_;
1439 CYRubyBlock(CYExpression *call, CYRubyProc *proc) :
1448 virtual CYExpression *Replace(CYContext &context);
1449 virtual void Output(CYOutput &out, CYFlags flags) const;
1451 virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
1457 CYExpression *test_;
1459 CYStatement *false_;
1461 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1470 virtual CYStatement *Replace(CYContext &context);
1471 virtual void Output(CYOutput &out, CYFlags flags) const;
1473 virtual CYStatement *Return();
1479 CYExpression *test_;
1482 CYDoWhile(CYExpression *test, CYStatement *code) :
1490 virtual CYStatement *Replace(CYContext &context);
1491 virtual void Output(CYOutput &out, CYFlags flags) const;
1497 CYExpression *test_;
1500 CYWhile(CYExpression *test, CYStatement *code) :
1508 virtual CYStatement *Replace(CYContext &context);
1509 virtual void Output(CYOutput &out, CYFlags flags) const;
1513 CYFunctionParameter *parameters_;
1516 CYNonLocal *nonlocal_;
1519 CYIdentifier *super_;
1521 CYFunction(CYFunctionParameter *parameters, CYStatement *code) :
1522 parameters_(parameters),
1530 void Replace(CYContext &context);
1531 void Output(CYOutput &out) const;
1534 struct CYFunctionExpression :
1538 CYIdentifier *name_;
1540 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
1541 CYFunction(parameters, code),
1549 virtual CYExpression *Replace(CYContext &context);
1550 virtual void Output(CYOutput &out, CYFlags flags) const;
1557 CYFatArrow(CYFunctionParameter *parameters, CYStatement *code) :
1558 CYFunction(parameters, code)
1565 virtual CYExpression *Replace(CYContext &context);
1566 virtual void Output(CYOutput &out, CYFlags flags) const;
1573 CYRubyProc(CYFunctionParameter *parameters, CYStatement *code) :
1574 CYFunction(parameters, code)
1581 virtual CYExpression *Replace(CYContext &context);
1582 virtual void Output(CYOutput &out, CYFlags flags) const;
1585 struct CYFunctionStatement :
1589 CYIdentifier *name_;
1591 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
1592 CYFunction(parameters, code),
1599 virtual CYStatement *Replace(CYContext &context);
1600 virtual void Output(CYOutput &out, CYFlags flags) const;
1603 struct CYPropertyMethod;
1609 CYMethod(CYPropertyName *name, CYFunctionParameter *parameters, CYStatement *code, CYProperty *next = NULL) :
1610 CYFunction(parameters, code),
1611 CYProperty(name, next)
1615 virtual CYFunctionExpression *Constructor();
1617 using CYProperty::Replace;
1618 virtual void Replace(CYContext &context);
1621 struct CYPropertyGetter :
1624 CYPropertyGetter(CYPropertyName *name, CYStatement *code, CYProperty *next = NULL) :
1625 CYMethod(name, NULL, code, next)
1629 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name);
1630 virtual void Output(CYOutput &out) const;
1633 struct CYPropertySetter :
1636 CYPropertySetter(CYPropertyName *name, CYFunctionParameter *parameters, CYStatement *code, CYProperty *next = NULL) :
1637 CYMethod(name, parameters, code, next)
1641 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name);
1642 virtual void Output(CYOutput &out) const;
1645 struct CYPropertyMethod :
1648 CYPropertyMethod(CYPropertyName *name, CYFunctionParameter *parameters, CYStatement *code, CYProperty *next = NULL) :
1649 CYMethod(name, parameters, code, next)
1653 virtual CYFunctionExpression *Constructor();
1655 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name);
1656 virtual void Output(CYOutput &out) const;
1659 struct CYClassTail :
1662 CYExpression *extends_;
1664 CYFunctionExpression *constructor_;
1665 CYList<CYProperty> instance_;
1666 CYList<CYProperty> static_;
1668 CYClassTail(CYExpression *extends) :
1674 void Output(CYOutput &out) const;
1677 struct CYClassExpression :
1680 CYIdentifier *name_;
1683 CYClassExpression(CYIdentifier *name, CYClassTail *tail) :
1692 virtual CYExpression *Replace(CYContext &context);
1693 virtual void Output(CYOutput &out, CYFlags flags) const;
1696 struct CYClassStatement :
1699 CYIdentifier *name_;
1702 CYClassStatement(CYIdentifier *name, CYClassTail *tail) :
1710 virtual CYStatement *Replace(CYContext &context);
1711 virtual void Output(CYOutput &out, CYFlags flags) const;
1714 struct CYSuperCall :
1717 CYArgument *arguments_;
1719 CYSuperCall(CYArgument *arguments) :
1720 arguments_(arguments)
1727 virtual CYExpression *Replace(CYContext &context);
1728 virtual void Output(CYOutput &out, CYFlags flags) const;
1731 struct CYSuperAccess :
1734 CYExpression *property_;
1736 CYSuperAccess(CYExpression *property) :
1744 virtual CYExpression *Replace(CYContext &context);
1745 virtual void Output(CYOutput &out, CYFlags flags) const;
1751 CYExpression *expression_;
1753 CYExpress(CYExpression *expression) :
1754 expression_(expression)
1756 if (expression_ == NULL)
1762 virtual CYStatement *Replace(CYContext &context);
1763 virtual void Output(CYOutput &out, CYFlags flags) const;
1765 virtual CYStatement *Return();
1771 CYIdentifier *label_;
1773 CYContinue(CYIdentifier *label) :
1780 virtual CYStatement *Replace(CYContext &context);
1781 virtual void Output(CYOutput &out, CYFlags flags) const;
1787 CYIdentifier *label_;
1789 CYBreak(CYIdentifier *label) :
1796 virtual CYStatement *Replace(CYContext &context);
1797 virtual void Output(CYOutput &out, CYFlags flags) const;
1803 CYExpression *value_;
1805 CYReturn(CYExpression *value) :
1812 virtual CYStatement *Replace(CYContext &context);
1813 virtual void Output(CYOutput &out, CYFlags flags) const;
1816 struct CYYieldGenerator :
1819 CYExpression *value_;
1821 CYYieldGenerator(CYExpression *value) :
1828 virtual CYExpression *Replace(CYContext &context);
1829 virtual void Output(CYOutput &out, CYFlags flags) const;
1832 struct CYYieldValue :
1835 CYExpression *value_;
1837 CYYieldValue(CYExpression *value) :
1844 virtual CYExpression *Replace(CYContext &context);
1845 virtual void Output(CYOutput &out, CYFlags flags) const;
1853 virtual CYStatement *Replace(CYContext &context);
1854 virtual void Output(CYOutput &out, CYFlags flags) const;
1862 CYFinally(CYStatement *code) :
1867 void Replace(CYContext &context);
1868 virtual void Output(CYOutput &out) const;
1871 struct CYTypeSpecifier :
1874 virtual CYExpression *Replace(CYContext &context) = 0;
1877 struct CYTypeError :
1883 virtual CYExpression *Replace(CYContext &context);
1884 virtual void Output(CYOutput &out) const;
1893 virtual CYExpression *Replace(CYContext &context);
1894 virtual void Output(CYOutput &out) const;
1897 struct CYTypeVariable :
1900 CYIdentifier *name_;
1902 CYTypeVariable(CYIdentifier *name) :
1907 CYTypeVariable(const char *name) :
1908 name_(new($pool) CYIdentifier(name))
1912 virtual CYExpression *Replace(CYContext &context);
1913 virtual void Output(CYOutput &out) const;
1916 struct CYTypeUnsigned :
1919 CYTypeSpecifier *specifier_;
1921 CYTypeUnsigned(CYTypeSpecifier *specifier) :
1922 specifier_(specifier)
1926 virtual CYExpression *Replace(CYContext &context);
1927 virtual void Output(CYOutput &out) const;
1930 struct CYTypeSigned :
1933 CYTypeSpecifier *specifier_;
1935 CYTypeSigned(CYTypeSpecifier *specifier) :
1936 specifier_(specifier)
1940 virtual CYExpression *Replace(CYContext &context);
1941 virtual void Output(CYOutput &out) const;
1947 CYTypeSpecifier *specifier_;
1949 CYTypeLong(CYTypeSpecifier *specifier) :
1950 specifier_(specifier)
1954 virtual CYExpression *Replace(CYContext &context);
1955 virtual void Output(CYOutput &out) const;
1958 struct CYTypeShort :
1961 CYTypeSpecifier *specifier_;
1963 CYTypeShort(CYTypeSpecifier *specifier) :
1964 specifier_(specifier)
1968 virtual CYExpression *Replace(CYContext &context);
1969 virtual void Output(CYOutput &out) const;
1972 struct CYTypeFunctionWith;
1974 struct CYTypeModifier :
1975 CYNext<CYTypeModifier>
1977 CYTypeModifier(CYTypeModifier *next) :
1978 CYNext<CYTypeModifier>(next)
1982 virtual int Precedence() const = 0;
1984 virtual CYExpression *Replace_(CYContext &context, CYExpression *type) = 0;
1985 CYExpression *Replace(CYContext &context, CYExpression *type);
1987 virtual void Output(CYOutput &out, CYIdentifier *identifier) const = 0;
1988 void Output(CYOutput &out, int precedence, CYIdentifier *identifier) const;
1990 virtual CYTypeFunctionWith *Function() { return NULL; }
1993 struct CYTypeArrayOf :
1996 CYExpression *size_;
1998 CYTypeArrayOf(CYExpression *size, CYTypeModifier *next = NULL) :
1999 CYTypeModifier(next),
2006 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
2007 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2010 struct CYTypeConstant :
2013 CYTypeConstant(CYTypeModifier *next = NULL) :
2014 CYTypeModifier(next)
2020 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
2021 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2024 struct CYTypePointerTo :
2027 CYTypePointerTo(CYTypeModifier *next = NULL) :
2028 CYTypeModifier(next)
2034 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
2035 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2038 struct CYTypeVolatile :
2041 CYTypeVolatile(CYTypeModifier *next = NULL) :
2042 CYTypeModifier(next)
2048 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
2049 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2052 struct CYTypedIdentifier :
2053 CYNext<CYTypedIdentifier>,
2056 CYLocation location_;
2057 CYIdentifier *identifier_;
2058 CYTypeSpecifier *specifier_;
2059 CYTypeModifier *modifier_;
2061 CYTypedIdentifier(const CYLocation &location, CYIdentifier *identifier = NULL) :
2062 location_(location),
2063 identifier_(identifier),
2069 CYTypedIdentifier(CYTypeSpecifier *specifier, CYTypeModifier *modifier = NULL) :
2071 specifier_(specifier),
2076 inline CYTypedIdentifier *Modify(CYTypeModifier *modifier) {
2077 CYSetLast(modifier_) = modifier;
2081 virtual CYExpression *Replace(CYContext &context);
2082 virtual void Output(CYOutput &out) const;
2084 CYTypeFunctionWith *Function();
2087 struct CYEncodedType :
2090 CYTypedIdentifier *typed_;
2092 CYEncodedType(CYTypedIdentifier *typed) :
2099 virtual CYExpression *Replace(CYContext &context);
2100 virtual void Output(CYOutput &out, CYFlags flags) const;
2103 struct CYTypedParameter :
2104 CYNext<CYTypedParameter>,
2107 CYTypedIdentifier *typed_;
2109 CYTypedParameter(CYTypedIdentifier *typed, CYTypedParameter *next) :
2110 CYNext<CYTypedParameter>(next),
2115 CYArgument *Argument(CYContext &context);
2116 CYFunctionParameter *Parameters(CYContext &context);
2117 CYExpression *TypeSignature(CYContext &context, CYExpression *prefix);
2119 virtual void Output(CYOutput &out) const;
2125 CYTypedIdentifier *typed_;
2126 CYTypedParameter *parameters_;
2129 CYLambda(CYTypedIdentifier *typed, CYTypedParameter *parameters, CYStatement *code) :
2131 parameters_(parameters),
2138 virtual CYExpression *Replace(CYContext &context);
2139 virtual void Output(CYOutput &out, CYFlags flags) const;
2148 CYModule(CYWord *part, CYModule *next = NULL) :
2149 CYNext<CYModule>(next),
2154 CYString *Replace(CYContext &context, const char *separator) const;
2155 void Output(CYOutput &out) const;
2163 CYImport(CYModule *module) :
2170 virtual CYStatement *Replace(CYContext &context);
2171 virtual void Output(CYOutput &out, CYFlags flags) const;
2178 CYTypedIdentifier *typed_;
2180 CYExternal(CYString *abi, CYTypedIdentifier *typed) :
2188 virtual CYStatement *Replace(CYContext &context);
2189 virtual void Output(CYOutput &out, CYFlags flags) const;
2192 struct CYTypeDefinition :
2195 CYTypedIdentifier *typed_;
2197 CYTypeDefinition(CYTypedIdentifier *typed) :
2204 virtual CYStatement *Replace(CYContext &context);
2205 virtual void Output(CYOutput &out, CYFlags flags) const;
2208 struct CYTypeBlockWith :
2211 CYTypedParameter *parameters_;
2213 CYTypeBlockWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
2214 CYTypeModifier(next),
2215 parameters_(parameters)
2221 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
2222 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2225 struct CYTypeFunctionWith :
2228 CYTypedParameter *parameters_;
2230 CYTypeFunctionWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
2231 CYTypeModifier(next),
2232 parameters_(parameters)
2238 virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
2239 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2241 virtual CYTypeFunctionWith *Function() { return this; }
2250 CYIdentifier *name_;
2253 Catch(CYIdentifier *name, CYStatement *code) :
2259 void Replace(CYContext &context);
2260 virtual void Output(CYOutput &out) const;
2268 CYFinally *finally_;
2270 Try(CYStatement *code, Catch *_catch, CYFinally *finally) :
2279 virtual CYStatement *Replace(CYContext &context);
2280 virtual void Output(CYOutput &out, CYFlags flags) const;
2286 CYExpression *value_;
2288 Throw(CYExpression *value = NULL) :
2295 virtual CYStatement *Replace(CYContext &context);
2296 virtual void Output(CYOutput &out, CYFlags flags) const;
2304 CYExpression *scope_;
2307 CYWith(CYExpression *scope, CYStatement *code) :
2315 virtual CYStatement *Replace(CYContext &context);
2316 virtual void Output(CYOutput &out, CYFlags flags) const;
2322 CYExpression *value_;
2325 CYSwitch(CYExpression *value, CYClause *clauses) :
2333 virtual CYStatement *Replace(CYContext &context);
2334 virtual void Output(CYOutput &out, CYFlags flags) const;
2346 virtual CYStatement *Replace(CYContext &context);
2347 virtual void Output(CYOutput &out, CYFlags flags) const;
2350 struct CYCondition :
2353 CYExpression *test_;
2354 CYExpression *true_;
2355 CYExpression *false_;
2357 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
2366 virtual CYExpression *Replace(CYContext &context);
2367 virtual void Output(CYOutput &out, CYFlags flags) const;
2370 struct CYAddressOf :
2373 CYAddressOf(CYExpression *rhs) :
2378 virtual const char *Operator() const {
2384 virtual CYExpression *Replace(CYContext &context);
2390 CYIndirect(CYExpression *rhs) :
2395 virtual const char *Operator() const {
2401 virtual CYExpression *Replace(CYContext &context);
2405 virtual CYExpression *Replace(CYContext &context);
2407 #define CYPostfix_(op, name, args...) \
2408 struct CY ## name : \
2411 CY ## name(CYExpression *lhs) : \
2416 virtual const char *Operator() const { \
2421 #define CYPrefix_(alphabetic, op, name, args...) \
2422 struct CY ## name : \
2425 CY ## name(CYExpression *rhs) : \
2430 CYAlphabetic(alphabetic) \
2432 virtual const char *Operator() const { \
2437 #define CYInfix_(alphabetic, precedence, op, name, args...) \
2438 struct CY ## name : \
2441 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
2446 CYAlphabetic(alphabetic) \
2447 CYPrecedence(precedence) \
2449 virtual const char *Operator() const { \
2454 #define CYAssignment_(op, name, args...) \
2455 struct CY ## name ## Assign : \
2458 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
2459 CYAssignment(lhs, rhs) \
2463 virtual const char *Operator() const { \
2468 CYPostfix_("++", PostIncrement)
2469 CYPostfix_("--", PostDecrement)
2471 CYPrefix_(true, "delete", Delete)
2472 CYPrefix_(true, "void", Void)
2473 CYPrefix_(true, "typeof", TypeOf)
2474 CYPrefix_(false, "++", PreIncrement)
2475 CYPrefix_(false, "--", PreDecrement)
2476 CYPrefix_(false, "+", Affirm)
2477 CYPrefix_(false, "-", Negate)
2478 CYPrefix_(false, "~", BitwiseNot)
2479 CYPrefix_(false, "!", LogicalNot)
2481 CYInfix_(false, 5, "*", Multiply, CYReplace)
2482 CYInfix_(false, 5, "/", Divide)
2483 CYInfix_(false, 5, "%", Modulus)
2484 CYInfix_(false, 6, "+", Add, CYReplace)
2485 CYInfix_(false, 6, "-", Subtract)
2486 CYInfix_(false, 7, "<<", ShiftLeft)
2487 CYInfix_(false, 7, ">>", ShiftRightSigned)
2488 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
2489 CYInfix_(false, 8, "<", Less)
2490 CYInfix_(false, 8, ">", Greater)
2491 CYInfix_(false, 8, "<=", LessOrEqual)
2492 CYInfix_(false, 8, ">=", GreaterOrEqual)
2493 CYInfix_(true, 8, "instanceof", InstanceOf)
2494 CYInfix_(true, 8, "in", In)
2495 CYInfix_(false, 9, "==", Equal)
2496 CYInfix_(false, 9, "!=", NotEqual)
2497 CYInfix_(false, 9, "===", Identical)
2498 CYInfix_(false, 9, "!==", NotIdentical)
2499 CYInfix_(false, 10, "&", BitwiseAnd)
2500 CYInfix_(false, 11, "^", BitwiseXOr)
2501 CYInfix_(false, 12, "|", BitwiseOr)
2502 CYInfix_(false, 13, "&&", LogicalAnd)
2503 CYInfix_(false, 14, "||", LogicalOr)
2505 CYAssignment_("=", )
2506 CYAssignment_("*=", Multiply)
2507 CYAssignment_("/=", Divide)
2508 CYAssignment_("%=", Modulus)
2509 CYAssignment_("+=", Add)
2510 CYAssignment_("-=", Subtract)
2511 CYAssignment_("<<=", ShiftLeft)
2512 CYAssignment_(">>=", ShiftRightSigned)
2513 CYAssignment_(">>>=", ShiftRightUnsigned)
2514 CYAssignment_("&=", BitwiseAnd)
2515 CYAssignment_("^=", BitwiseXOr)
2516 CYAssignment_("|=", BitwiseOr)
2518 #endif/*CYCRIPT_PARSER_HPP*/