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
33 #include "Location.hpp"
34 #include "Options.hpp"
35 #include "Pooling.hpp"
38 double CYCastDouble(const char *value, size_t size);
39 double CYCastDouble(const char *value);
41 void CYNumerify(std::ostringstream &str, double value);
42 void CYStringify(std::ostringstream &str, const char *data, size_t size, bool c = false);
47 virtual void Output(struct CYOutput &out) const = 0;
68 CYOutput(std::streambuf &out, CYOptions &options) :
79 void Check(char value);
82 _finline void operator ()(char value) {
83 _assert(out_.sputc(value) != EOF);
91 _finline void operator ()(const char *data, std::streamsize size) {
92 _assert(out_.sputn(data, size) == size);
94 position_.Columns(size);
97 _finline void operator ()(const char *data) {
98 return operator ()(data, strlen(data));
101 CYOutput &operator <<(char rhs);
102 CYOutput &operator <<(const char *rhs);
104 _finline CYOutput &operator <<(const CYThing *rhs) {
110 _finline CYOutput &operator <<(const CYThing &rhs) {
119 struct CYPropertyName {
120 virtual bool Computed() const {
124 virtual bool Constructor() const {
128 virtual CYExpression *PropertyName(CYContext &context) = 0;
129 virtual void PropertyName(CYOutput &out) const = 0;
140 CYNoBrace = (1 << 0),
141 CYNoFunction = (1 << 1),
142 CYNoClass = (1 << 2),
145 CYNoRightHand = (1 << 5),
146 CYNoDangle = (1 << 6),
147 CYNoInteger = (1 << 7),
148 CYNoBFC = (CYNoBrace | CYNoFunction | CYNoClass),
151 _finline CYFlags operator ~(CYFlags rhs) {
152 return static_cast<CYFlags>(~static_cast<unsigned>(rhs));
155 _finline CYFlags operator &(CYFlags lhs, CYFlags rhs) {
156 return static_cast<CYFlags>(static_cast<unsigned>(lhs) & static_cast<unsigned>(rhs));
159 _finline CYFlags operator |(CYFlags lhs, CYFlags rhs) {
160 return static_cast<CYFlags>(static_cast<unsigned>(lhs) | static_cast<unsigned>(rhs));
163 _finline CYFlags &operator |=(CYFlags &lhs, CYFlags rhs) {
164 return lhs = lhs | rhs;
167 _finline CYFlags CYLeft(CYFlags flags) {
168 return flags & ~(CYNoDangle | CYNoInteger);
171 _finline CYFlags CYRight(CYFlags flags) {
172 return flags & ~CYNoBFC;
175 _finline CYFlags CYCenter(CYFlags flags) {
176 return CYLeft(CYRight(flags));
185 #define CYCompact(type) \
186 virtual CYCompactType Compact() const { \
187 return CYCompact ## type; \
194 void Single(CYOutput &out, CYFlags flags, CYCompactType request) const;
195 void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
196 virtual void Output(CYOutput &out) const;
198 virtual CYStatement *Replace(CYContext &context) = 0;
200 virtual CYCompactType Compact() const = 0;
201 virtual CYStatement *Return();
204 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
207 typedef CYList<CYStatement> CYStatements;
209 struct CYForInitializer :
212 virtual CYForInitializer *Replace(CYContext &context) = 0;
213 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
222 CYWord(const char *word) :
227 virtual bool Constructor() const {
228 return strcmp(word_, "constructor") == 0;
231 virtual const char *Word() const;
232 virtual void Output(CYOutput &out) const;
234 virtual CYExpression *PropertyName(CYContext &context);
235 virtual void PropertyName(CYOutput &out) const;
238 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
240 return lhs << rhs.Word();
243 enum CYIdentifierKind {
244 CYIdentifierArgument,
250 CYIdentifierVariable,
253 struct CYIdentifier :
254 CYNext<CYIdentifier>,
257 CYLocation location_;
261 CYIdentifier(const char *word) :
268 virtual const char *Word() const;
269 CYIdentifier *Replace(CYContext &context, CYIdentifierKind);
276 CYStatement *statement_;
278 CYLabel(CYIdentifier *name, CYStatement *statement) :
280 statement_(statement)
286 virtual CYStatement *Replace(CYContext &context);
287 virtual void Output(CYOutput &out, CYFlags flags) const;
290 struct CYCStringLess :
291 std::binary_function<const char *, const char *, bool>
293 _finline bool operator ()(const char *lhs, const char *rhs) const {
294 return strcmp(lhs, rhs) < 0;
298 struct CYIdentifierValueLess :
299 std::binary_function<CYIdentifier *, CYIdentifier *, bool>
301 _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
302 return CYCStringLess()(lhs->Word(), rhs->Word());
306 struct CYIdentifierFlags :
307 CYNext<CYIdentifierFlags>
309 CYIdentifier *identifier_;
310 CYIdentifierKind kind_;
314 CYIdentifierFlags(CYIdentifier *identifier, CYIdentifierKind kind, CYIdentifierFlags *next = NULL) :
315 CYNext<CYIdentifierFlags>(next),
316 identifier_(identifier),
328 CYIdentifierFlags *shadow_;
330 CYIdentifierFlags *internal_;
332 CYScope(bool transparent, CYContext &context);
334 CYIdentifierFlags *Lookup(CYContext &context, const char *word);
335 CYIdentifierFlags *Lookup(CYContext &context, CYIdentifier *identifier);
337 CYIdentifierFlags *Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierKind kind);
338 void Merge(CYContext &context, const CYIdentifierFlags *flags);
340 void Close(CYContext &context, CYStatement *&statements);
341 void Close(CYContext &context);
350 CYScript(CYStatement *code) :
355 virtual void Replace(CYContext &context);
356 virtual void Output(CYOutput &out) const;
367 CYIdentifier *super_;
369 CYNonLocal *nonlocal_;
370 CYNonLocal *nextlocal_;
373 std::vector<CYIdentifier *> replace_;
375 CYContext(CYOptions &options) :
386 void ReplaceAll(CYStatement *&statement) {
387 if (statement == NULL)
389 CYStatement *next(statement->next_);
394 if (statement == NULL)
397 statement->SetNext(next);
400 template <typename Type_>
401 void Replace(Type_ *&value) {
402 for (;;) if (value == NULL)
405 Type_ *replace(value->Replace(*this));
406 if (replace != value)
412 void NonLocal(CYStatement *&statements);
413 CYIdentifier *Unique();
417 CYIdentifier *identifier_;
424 CYIdentifier *Target(CYContext &context) {
425 if (identifier_ == NULL)
426 identifier_ = context.Unique();
434 CYIdentifier *identifier_;
441 CYIdentifier *Identifier(CYContext &context) {
443 return next_->Identifier(context);
444 if (identifier_ == NULL)
445 identifier_ = context.Unique();
455 CYBlock(CYStatement *code) :
462 virtual CYStatement *Replace(CYContext &context);
464 virtual void Output(CYOutput &out, CYFlags flags) const;
466 virtual CYStatement *Return();
472 struct CYForInInitializer {
473 virtual CYStatement *Initialize(CYContext &context, CYExpression *value) = 0;
475 virtual CYTarget *Replace(CYContext &context) = 0;
476 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
479 struct CYFunctionParameter;
484 struct CYExpression :
487 virtual int Precedence() const = 0;
489 virtual bool RightHand() const {
493 virtual bool Eval() const {
497 virtual CYTarget *AddArgument(CYContext &context, CYExpression *value);
499 virtual void Output(CYOutput &out) const;
500 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
501 void Output(CYOutput &out, int precedence, CYFlags flags) const;
503 virtual CYExpression *Replace(CYContext &context) = 0;
505 virtual CYExpression *Primitive(CYContext &context) {
509 virtual CYFunctionParameter *Parameter() const;
511 virtual CYNumber *Number(CYContext &context) {
515 virtual CYString *String(CYContext &context) {
519 virtual const char *Word() const {
528 virtual bool RightHand() const {
532 virtual CYStatement *Initialize(CYContext &context, CYExpression *value);
534 virtual CYTarget *Replace(CYContext &context) = 0;
535 using CYExpression::Output;
538 #define CYAlphabetic(value) \
539 virtual bool Alphabetic() const { \
543 #define CYPrecedence(value) \
544 static const int Precedence_ = value; \
545 virtual int Precedence() const { \
546 return Precedence_; \
552 CYExpression *expression_;
555 CYCompound(CYExpression *expression, CYExpression *next) :
556 expression_(expression),
559 _assert(expression_ != NULL);
560 _assert(next != NULL);
565 virtual CYExpression *Replace(CYContext &context);
566 void Output(CYOutput &out, CYFlags flags) const;
568 virtual CYFunctionParameter *Parameter() const;
571 struct CYParenthetical :
574 CYExpression *expression_;
576 CYParenthetical(CYExpression *expression) :
577 expression_(expression)
583 virtual CYTarget *Replace(CYContext &context);
584 void Output(CYOutput &out, CYFlags flags) const;
589 struct CYFunctionParameter :
590 CYNext<CYFunctionParameter>,
595 CYFunctionParameter(CYBinding *binding, CYFunctionParameter *next = NULL) :
596 CYNext<CYFunctionParameter>(next),
601 void Replace(CYContext &context, CYStatement *&statements);
602 void Output(CYOutput &out) const;
605 struct CYComprehension :
606 CYNext<CYComprehension>,
609 CYComprehension(CYComprehension *next = NULL) :
610 CYNext<CYComprehension>(next)
614 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
615 CYFunctionParameter *Parameters(CYContext &context) const;
616 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
617 virtual void Output(CYOutput &out) const = 0;
620 struct CYForInComprehension :
624 CYExpression *iterable_;
626 CYForInComprehension(CYBinding *binding, CYExpression *iterable, CYComprehension *next = NULL) :
627 CYComprehension(next),
633 virtual CYFunctionParameter *Parameter(CYContext &context) const;
634 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
635 virtual void Output(CYOutput &out) const;
638 struct CYForOfComprehension :
642 CYExpression *iterable_;
644 CYForOfComprehension(CYBinding *binding, CYExpression *iterable, CYComprehension *next = NULL) :
645 CYComprehension(next),
651 virtual CYFunctionParameter *Parameter(CYContext &context) const;
652 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
653 virtual void Output(CYOutput &out) const;
656 struct CYIfComprehension :
661 CYIfComprehension(CYExpression *test, CYComprehension *next = NULL) :
662 CYComprehension(next),
667 virtual CYFunctionParameter *Parameter(CYContext &context) const;
668 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
669 virtual void Output(CYOutput &out) const;
672 struct CYArrayComprehension :
675 CYExpression *expression_;
676 CYComprehension *comprehensions_;
678 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
679 expression_(expression),
680 comprehensions_(comprehensions)
686 virtual CYTarget *Replace(CYContext &context);
687 virtual void Output(CYOutput &out, CYFlags flags) const;
693 CYLocation location_;
697 virtual CYExpression *Primitive(CYContext &context) {
705 virtual CYTarget *Replace(CYContext &context);
718 CYRange(uint64_t lo, uint64_t hi) :
723 bool operator [](uint8_t value) const {
724 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
727 void operator()(uint8_t value) {
730 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
734 extern CYRange DigitRange_;
735 extern CYRange WordStartRange_;
736 extern CYRange WordEndRange_;
751 CYString(const char *value) :
757 CYString(const char *value, size_t size) :
763 CYString(const CYWord *word) :
764 value_(word->Word()),
765 size_(strlen(value_))
769 const char *Value() const {
773 virtual const char *Word() const;
775 virtual CYNumber *Number(CYContext &context);
776 virtual CYString *String(CYContext &context);
778 CYString *Concat(CYContext &out, CYString *rhs) const;
779 virtual void Output(CYOutput &out, CYFlags flags) const;
781 virtual CYExpression *PropertyName(CYContext &context);
782 virtual void PropertyName(CYOutput &out) const;
785 struct CYElementValue;
790 CYExpression *expression_;
793 CYSpan(CYExpression *expression, CYString *string, CYSpan *next) :
794 CYNext<CYSpan>(next),
795 expression_(expression),
800 CYElementValue *Replace(CYContext &context);
809 CYTemplate(CYString *string, CYSpan *spans) :
817 virtual CYTarget *Replace(CYContext &context);
818 virtual void Output(CYOutput &out, CYFlags flags) const;
827 CYNumber(double value) :
832 double Value() const {
836 virtual CYNumber *Number(CYContext &context);
837 virtual CYString *String(CYContext &context);
839 virtual void Output(CYOutput &out, CYFlags flags) const;
841 virtual CYExpression *PropertyName(CYContext &context);
842 virtual void PropertyName(CYOutput &out) const;
848 CYExpression *expression_;
850 CYComputed(CYExpression *expression) :
851 expression_(expression)
855 virtual bool Computed() const {
859 virtual CYExpression *PropertyName(CYContext &context);
860 virtual void PropertyName(CYOutput &out) const;
869 CYRegEx(const char *value, size_t size) :
875 const char *Value() const {
879 virtual void Output(CYOutput &out, CYFlags flags) const;
885 virtual CYNumber *Number(CYContext &context);
886 virtual CYString *String(CYContext &context);
888 virtual void Output(CYOutput &out, CYFlags flags) const;
894 virtual CYTarget *Replace(CYContext &context);
895 virtual void Output(CYOutput &out, CYFlags flags) const;
903 virtual bool RightHand() const {
907 virtual bool Value() const = 0;
908 virtual void Output(CYOutput &out, CYFlags flags) const;
914 virtual bool Value() const {
918 virtual CYNumber *Number(CYContext &context);
919 virtual CYString *String(CYContext &context);
925 virtual bool Value() const {
929 virtual CYNumber *Number(CYContext &context);
930 virtual CYString *String(CYContext &context);
938 CYVariable(CYIdentifier *name) :
943 CYVariable(const char *name) :
944 name_(new($pool) CYIdentifier(name))
950 virtual bool Eval() const {
951 return strcmp(name_->Word(), "eval") == 0;
954 virtual CYTarget *Replace(CYContext &context);
955 virtual void Output(CYOutput &out, CYFlags flags) const;
957 virtual CYFunctionParameter *Parameter() const;
965 CYPrefix(CYExpression *rhs) :
970 virtual bool Alphabetic() const = 0;
971 virtual const char *Operator() const = 0;
975 virtual CYExpression *Replace(CYContext &context);
976 virtual void Output(CYOutput &out, CYFlags flags) const;
985 CYInfix(CYExpression *lhs, CYExpression *rhs) :
991 void SetLeft(CYExpression *lhs) {
995 virtual bool Alphabetic() const = 0;
996 virtual const char *Operator() const = 0;
998 virtual CYExpression *Replace(CYContext &context);
999 virtual void Output(CYOutput &out, CYFlags flags) const;
1007 CYPostfix(CYExpression *lhs) :
1012 virtual const char *Operator() const = 0;
1016 virtual CYExpression *Replace(CYContext &context);
1017 virtual void Output(CYOutput &out, CYFlags flags) const;
1020 struct CYAssignment :
1026 CYAssignment(CYTarget *lhs, CYExpression *rhs) :
1032 void SetRight(CYExpression *rhs) {
1036 virtual const char *Operator() const = 0;
1040 virtual CYExpression *Replace(CYContext &context);
1041 virtual void Output(CYOutput &out, CYFlags flags) const;
1049 CYExpression *value_;
1051 CYArgument(CYExpression *value, CYArgument *next = NULL) :
1052 CYNext<CYArgument>(next),
1058 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
1059 CYNext<CYArgument>(next),
1065 CYArgument *Replace(CYContext &context);
1066 void Output(CYOutput &out) const;
1073 CYExpression *value_;
1076 CYClause(CYExpression *value, CYStatement *code) :
1082 void Replace(CYContext &context);
1083 virtual void Output(CYOutput &out) const;
1089 virtual bool Elision() const = 0;
1091 virtual void Replace(CYContext &context) = 0;
1094 struct CYElementValue :
1098 CYExpression *value_;
1100 CYElementValue(CYExpression *value, CYElement *next = NULL) :
1101 CYNext<CYElement>(next),
1106 virtual bool Elision() const {
1107 return value_ == NULL;
1110 virtual void Replace(CYContext &context);
1111 virtual void Output(CYOutput &out) const;
1114 struct CYElementSpread :
1117 CYExpression *value_;
1119 CYElementSpread(CYExpression *value) :
1124 virtual bool Elision() const {
1128 virtual void Replace(CYContext &context);
1129 virtual void Output(CYOutput &out) const;
1135 CYElement *elements_;
1137 CYArray(CYElement *elements = NULL) :
1142 virtual CYTarget *Replace(CYContext &context);
1143 virtual void Output(CYOutput &out, CYFlags flags) const;
1147 CYIdentifier *identifier_;
1148 CYExpression *initializer_;
1150 CYBinding(CYIdentifier *identifier, CYExpression *initializer = NULL) :
1151 identifier_(identifier),
1152 initializer_(initializer)
1156 CYTarget *Target(CYContext &context);
1158 virtual CYAssignment *Replace(CYContext &context, CYIdentifierKind kind);
1159 virtual void Output(CYOutput &out, CYFlags flags) const;
1162 struct CYForLexical :
1166 CYBinding *binding_;
1168 CYForLexical(bool constant, CYBinding *binding) :
1169 constant_(constant),
1174 virtual CYStatement *Initialize(CYContext &context, CYExpression *value);
1176 virtual CYTarget *Replace(CYContext &context);
1177 virtual void Output(CYOutput &out, CYFlags flags) const;
1180 struct CYForVariable :
1183 CYBinding *binding_;
1185 CYForVariable(CYBinding *binding) :
1190 virtual CYStatement *Initialize(CYContext &context, CYExpression *value);
1192 virtual CYTarget *Replace(CYContext &context);
1193 virtual void Output(CYOutput &out, CYFlags flags) const;
1200 CYBinding *binding_;
1202 CYBindings(CYBinding *binding, CYBindings *next = NULL) :
1203 CYNext<CYBindings>(next),
1208 CYExpression *Replace(CYContext &context, CYIdentifierKind kind);
1210 CYArgument *Argument(CYContext &context);
1211 CYFunctionParameter *Parameter(CYContext &context);
1213 virtual void Output(CYOutput &out) const;
1214 virtual void Output(CYOutput &out, CYFlags flags) const;
1220 CYBindings *bindings_;
1222 CYVar(CYBindings *bindings) :
1229 virtual CYForInitializer *Replace(CYContext &context);
1230 virtual void Output(CYOutput &out, CYFlags flags) const;
1237 CYBindings *bindings_;
1239 CYLexical(bool constant, CYBindings *bindings) :
1240 constant_(constant),
1247 virtual CYForInitializer *Replace(CYContext &context);
1248 virtual void Output(CYOutput &out, CYFlags flags) const;
1252 CYList<CYBindings> bindings_;
1253 CYList<CYStatement> statements_;
1255 operator bool() const {
1256 return statements_ != NULL;
1264 CYPropertyName *name_;
1266 CYProperty(CYPropertyName *name, CYProperty *next = NULL) :
1267 CYNext<CYProperty>(next),
1272 virtual bool Update() const;
1274 CYProperty *ReplaceAll(CYContext &context, CYBuilder &builder, CYExpression *self, bool update);
1275 void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, bool protect);
1277 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect) = 0;
1279 virtual void Replace(CYContext &context) = 0;
1280 virtual void Output(CYOutput &out) const;
1283 struct CYPropertyValue :
1286 CYExpression *value_;
1288 CYPropertyValue(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1289 CYProperty(name, next),
1294 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
1295 virtual void Replace(CYContext &context);
1296 virtual void Output(CYOutput &out) const;
1302 CYForInitializer *initializer_;
1303 CYExpression *test_;
1304 CYExpression *increment_;
1307 CYFor(CYForInitializer *initializer, CYExpression *test, CYExpression *increment, CYStatement *code) :
1308 initializer_(initializer),
1310 increment_(increment),
1317 virtual CYStatement *Replace(CYContext &context);
1318 virtual void Output(CYOutput &out, CYFlags flags) const;
1324 CYForInInitializer *initializer_;
1325 CYExpression *iterable_;
1328 CYForIn(CYForInInitializer *initializer, CYExpression *iterable, CYStatement *code) :
1329 initializer_(initializer),
1330 iterable_(iterable),
1337 virtual CYStatement *Replace(CYContext &context);
1338 virtual void Output(CYOutput &out, CYFlags flags) const;
1341 struct CYForInitialized :
1344 CYBinding *binding_;
1345 CYExpression *iterable_;
1348 CYForInitialized(CYBinding *binding, CYExpression *iterable, CYStatement *code) :
1350 iterable_(iterable),
1357 virtual CYStatement *Replace(CYContext &context);
1358 virtual void Output(CYOutput &out, CYFlags flags) const;
1364 CYForInInitializer *initializer_;
1365 CYExpression *iterable_;
1368 CYForOf(CYForInInitializer *initializer, CYExpression *iterable, CYStatement *code) :
1369 initializer_(initializer),
1370 iterable_(iterable),
1377 virtual CYStatement *Replace(CYContext &context);
1378 virtual void Output(CYOutput &out, CYFlags flags) const;
1384 CYProperty *properties_;
1386 CYObject(CYProperty *properties = NULL) :
1387 properties_(properties)
1391 virtual CYTarget *Replace(CYContext &context);
1392 void Output(CYOutput &out, CYFlags flags) const;
1398 CYExpression *object_;
1399 CYExpression *property_;
1401 CYMember(CYExpression *object, CYExpression *property) :
1407 void SetLeft(CYExpression *object) {
1412 struct CYDirectMember :
1415 CYDirectMember(CYExpression *object, CYExpression *property) :
1416 CYMember(object, property)
1422 virtual CYTarget *Replace(CYContext &context);
1423 virtual void Output(CYOutput &out, CYFlags flags) const;
1426 struct CYIndirectMember :
1429 CYIndirectMember(CYExpression *object, CYExpression *property) :
1430 CYMember(object, property)
1436 virtual CYTarget *Replace(CYContext &context);
1437 virtual void Output(CYOutput &out, CYFlags flags) const;
1446 CYExpression *constructor_;
1447 CYArgument *arguments_;
1449 New(CYExpression *constructor, CYArgument *arguments = NULL) :
1450 constructor_(constructor),
1451 arguments_(arguments)
1455 virtual int Precedence() const {
1456 return arguments_ == NULL ? 2 : 1;
1460 virtual CYTarget *Replace(CYContext &context);
1461 virtual void Output(CYOutput &out, CYFlags flags) const;
1463 virtual CYTarget *AddArgument(CYContext &context, CYExpression *value);
1471 CYArgument *arguments_;
1473 CYApply(CYArgument *arguments = NULL) :
1474 arguments_(arguments)
1480 virtual CYTarget *AddArgument(CYContext &context, CYExpression *value);
1486 CYExpression *function_;
1488 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1494 virtual void Output(CYOutput &out, CYFlags flags) const;
1495 virtual CYTarget *Replace(CYContext &context);
1501 CYEval(CYArgument *arguments) :
1506 virtual void Output(CYOutput &out, CYFlags flags) const;
1507 virtual CYTarget *Replace(CYContext &context);
1512 struct CYRubyBlock :
1515 CYExpression *call_;
1518 CYRubyBlock(CYExpression *call, CYRubyProc *proc) :
1526 virtual CYTarget *Replace(CYContext &context);
1527 virtual void Output(CYOutput &out, CYFlags flags) const;
1529 virtual CYTarget *AddArgument(CYContext &context, CYExpression *value);
1535 CYExpression *test_;
1537 CYStatement *false_;
1539 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1548 virtual CYStatement *Replace(CYContext &context);
1549 virtual void Output(CYOutput &out, CYFlags flags) const;
1551 virtual CYStatement *Return();
1557 CYExpression *test_;
1560 CYDoWhile(CYExpression *test, CYStatement *code) :
1568 virtual CYStatement *Replace(CYContext &context);
1569 virtual void Output(CYOutput &out, CYFlags flags) const;
1575 CYExpression *test_;
1578 CYWhile(CYExpression *test, CYStatement *code) :
1586 virtual CYStatement *Replace(CYContext &context);
1587 virtual void Output(CYOutput &out, CYFlags flags) const;
1591 CYFunctionParameter *parameters_;
1594 CYNonLocal *nonlocal_;
1597 CYIdentifier *super_;
1599 CYFunction(CYFunctionParameter *parameters, CYStatement *code) :
1600 parameters_(parameters),
1608 void Replace(CYContext &context);
1609 void Output(CYOutput &out) const;
1612 struct CYFunctionExpression :
1616 CYIdentifier *name_;
1618 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
1619 CYFunction(parameters, code),
1626 CYTarget *Replace(CYContext &context) override;
1627 virtual void Output(CYOutput &out, CYFlags flags) const;
1634 CYFatArrow(CYFunctionParameter *parameters, CYStatement *code) :
1635 CYFunction(parameters, code)
1641 CYExpression *Replace(CYContext &context) override;
1642 virtual void Output(CYOutput &out, CYFlags flags) const;
1649 CYRubyProc(CYFunctionParameter *parameters, CYStatement *code) :
1650 CYFunction(parameters, code)
1656 CYTarget *Replace(CYContext &context) override;
1657 virtual void Output(CYOutput &out, CYFlags flags) const;
1660 struct CYFunctionStatement :
1664 CYIdentifier *name_;
1666 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
1667 CYFunction(parameters, code),
1674 CYStatement *Replace(CYContext &context) override;
1675 virtual void Output(CYOutput &out, CYFlags flags) const;
1678 struct CYPropertyMethod;
1684 CYMethod(CYPropertyName *name, CYFunctionParameter *parameters, CYStatement *code, CYProperty *next = NULL) :
1685 CYFunction(parameters, code),
1686 CYProperty(name, next)
1690 virtual CYFunctionExpression *Constructor();
1692 using CYProperty::Replace;
1693 virtual void Replace(CYContext &context);
1696 struct CYPropertyGetter :
1699 CYPropertyGetter(CYPropertyName *name, CYStatement *code, CYProperty *next = NULL) :
1700 CYMethod(name, NULL, code, next)
1704 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
1705 virtual void Output(CYOutput &out) const;
1708 struct CYPropertySetter :
1711 CYPropertySetter(CYPropertyName *name, CYFunctionParameter *parameters, CYStatement *code, CYProperty *next = NULL) :
1712 CYMethod(name, parameters, code, next)
1716 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
1717 virtual void Output(CYOutput &out) const;
1720 struct CYPropertyMethod :
1723 CYPropertyMethod(CYPropertyName *name, CYFunctionParameter *parameters, CYStatement *code, CYProperty *next = NULL) :
1724 CYMethod(name, parameters, code, next)
1728 bool Update() const override;
1730 virtual CYFunctionExpression *Constructor();
1732 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
1733 virtual void Output(CYOutput &out) const;
1736 struct CYClassTail :
1739 CYExpression *extends_;
1741 CYFunctionExpression *constructor_;
1742 CYList<CYProperty> instance_;
1743 CYList<CYProperty> static_;
1745 CYClassTail(CYExpression *extends) :
1751 void Output(CYOutput &out) const;
1754 struct CYClassExpression :
1757 CYIdentifier *name_;
1760 CYClassExpression(CYIdentifier *name, CYClassTail *tail) :
1768 CYTarget *Replace(CYContext &context) override;
1769 virtual void Output(CYOutput &out, CYFlags flags) const;
1772 struct CYClassStatement :
1775 CYIdentifier *name_;
1778 CYClassStatement(CYIdentifier *name, CYClassTail *tail) :
1786 CYStatement *Replace(CYContext &context) override;
1787 virtual void Output(CYOutput &out, CYFlags flags) const;
1790 struct CYSuperCall :
1793 CYArgument *arguments_;
1795 CYSuperCall(CYArgument *arguments) :
1796 arguments_(arguments)
1802 CYTarget *Replace(CYContext &context) override;
1803 virtual void Output(CYOutput &out, CYFlags flags) const;
1806 struct CYSuperAccess :
1809 CYExpression *property_;
1811 CYSuperAccess(CYExpression *property) :
1818 CYTarget *Replace(CYContext &context) override;
1819 virtual void Output(CYOutput &out, CYFlags flags) const;
1825 CYExpression *expression_;
1827 CYExpress(CYExpression *expression) :
1828 expression_(expression)
1830 if (expression_ == NULL)
1836 CYForInitializer *Replace(CYContext &context) override;
1837 virtual void Output(CYOutput &out, CYFlags flags) const;
1839 virtual CYStatement *Return();
1845 CYIdentifier *label_;
1847 CYContinue(CYIdentifier *label) :
1854 CYStatement *Replace(CYContext &context) override;
1855 virtual void Output(CYOutput &out, CYFlags flags) const;
1861 CYIdentifier *label_;
1863 CYBreak(CYIdentifier *label) :
1870 CYStatement *Replace(CYContext &context) override;
1871 virtual void Output(CYOutput &out, CYFlags flags) const;
1877 CYExpression *value_;
1879 CYReturn(CYExpression *value) :
1886 CYStatement *Replace(CYContext &context) override;
1887 virtual void Output(CYOutput &out, CYFlags flags) const;
1890 struct CYYieldGenerator :
1893 CYExpression *value_;
1895 CYYieldGenerator(CYExpression *value) :
1902 CYExpression *Replace(CYContext &context) override;
1903 virtual void Output(CYOutput &out, CYFlags flags) const;
1906 struct CYYieldValue :
1909 CYExpression *value_;
1911 CYYieldValue(CYExpression *value) :
1918 virtual CYExpression *Replace(CYContext &context);
1919 virtual void Output(CYOutput &out, CYFlags flags) const;
1927 virtual CYForInitializer *Replace(CYContext &context);
1928 virtual void Output(CYOutput &out, CYFlags flags) const;
1936 CYFinally(CYStatement *code) :
1941 void Replace(CYContext &context);
1942 virtual void Output(CYOutput &out) const;
1945 struct CYTypeSpecifier :
1948 virtual CYTarget *Replace(CYContext &context) = 0;
1951 struct CYTypeError :
1957 virtual CYTarget *Replace(CYContext &context);
1958 virtual void Output(CYOutput &out) const;
1967 virtual CYTarget *Replace(CYContext &context);
1968 virtual void Output(CYOutput &out) const;
1971 struct CYTypeReference :
1974 CYIdentifier *name_;
1976 CYTypeReference(CYIdentifier *name) :
1981 virtual CYTarget *Replace(CYContext &context);
1982 virtual void Output(CYOutput &out) const;
1985 struct CYTypeVariable :
1988 CYIdentifier *name_;
1990 CYTypeVariable(CYIdentifier *name) :
1995 CYTypeVariable(const char *name) :
1996 name_(new($pool) CYIdentifier(name))
2000 virtual CYTarget *Replace(CYContext &context);
2001 virtual void Output(CYOutput &out) const;
2004 struct CYTypeUnsigned :
2007 CYTypeSpecifier *specifier_;
2009 CYTypeUnsigned(CYTypeSpecifier *specifier) :
2010 specifier_(specifier)
2014 virtual CYTarget *Replace(CYContext &context);
2015 virtual void Output(CYOutput &out) const;
2018 struct CYTypeSigned :
2021 CYTypeSpecifier *specifier_;
2023 CYTypeSigned(CYTypeSpecifier *specifier) :
2024 specifier_(specifier)
2028 virtual CYTarget *Replace(CYContext &context);
2029 virtual void Output(CYOutput &out) const;
2035 CYTypeSpecifier *specifier_;
2037 CYTypeLong(CYTypeSpecifier *specifier) :
2038 specifier_(specifier)
2042 virtual CYTarget *Replace(CYContext &context);
2043 virtual void Output(CYOutput &out) const;
2046 struct CYTypeShort :
2049 CYTypeSpecifier *specifier_;
2051 CYTypeShort(CYTypeSpecifier *specifier) :
2052 specifier_(specifier)
2056 virtual CYTarget *Replace(CYContext &context);
2057 virtual void Output(CYOutput &out) const;
2060 struct CYTypeFunctionWith;
2062 struct CYTypeModifier :
2063 CYNext<CYTypeModifier>
2065 CYTypeModifier(CYTypeModifier *next) :
2066 CYNext<CYTypeModifier>(next)
2070 virtual int Precedence() const = 0;
2072 virtual CYTarget *Replace_(CYContext &context, CYTarget *type) = 0;
2073 CYTarget *Replace(CYContext &context, CYTarget *type);
2075 virtual void Output(CYOutput &out, CYIdentifier *identifier) const = 0;
2076 void Output(CYOutput &out, int precedence, CYIdentifier *identifier) const;
2078 virtual CYTypeFunctionWith *Function() { return NULL; }
2081 struct CYTypeArrayOf :
2084 CYExpression *size_;
2086 CYTypeArrayOf(CYExpression *size, CYTypeModifier *next = NULL) :
2087 CYTypeModifier(next),
2094 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
2095 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2098 struct CYTypeConstant :
2101 CYTypeConstant(CYTypeModifier *next = NULL) :
2102 CYTypeModifier(next)
2108 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
2109 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2112 struct CYTypePointerTo :
2115 CYTypePointerTo(CYTypeModifier *next = NULL) :
2116 CYTypeModifier(next)
2122 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
2123 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2126 struct CYTypeVolatile :
2129 CYTypeVolatile(CYTypeModifier *next = NULL) :
2130 CYTypeModifier(next)
2136 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
2137 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2140 struct CYTypedIdentifier :
2141 CYNext<CYTypedIdentifier>,
2144 CYLocation location_;
2145 CYIdentifier *identifier_;
2146 CYTypeSpecifier *specifier_;
2147 CYTypeModifier *modifier_;
2149 CYTypedIdentifier(const CYLocation &location, CYIdentifier *identifier = NULL) :
2150 location_(location),
2151 identifier_(identifier),
2157 CYTypedIdentifier(CYTypeSpecifier *specifier, CYTypeModifier *modifier = NULL) :
2159 specifier_(specifier),
2164 inline CYTypedIdentifier *Modify(CYTypeModifier *modifier) {
2165 CYSetLast(modifier_) = modifier;
2169 virtual CYTarget *Replace(CYContext &context);
2170 virtual void Output(CYOutput &out) const;
2172 CYTypeFunctionWith *Function();
2175 struct CYEncodedType :
2178 CYTypedIdentifier *typed_;
2180 CYEncodedType(CYTypedIdentifier *typed) :
2187 virtual CYTarget *Replace(CYContext &context);
2188 virtual void Output(CYOutput &out, CYFlags flags) const;
2191 struct CYTypedParameter :
2192 CYNext<CYTypedParameter>,
2195 CYTypedIdentifier *typed_;
2197 CYTypedParameter(CYTypedIdentifier *typed, CYTypedParameter *next) :
2198 CYNext<CYTypedParameter>(next),
2203 CYArgument *Argument(CYContext &context);
2204 CYFunctionParameter *Parameters(CYContext &context);
2205 CYExpression *TypeSignature(CYContext &context, CYExpression *prefix);
2207 virtual void Output(CYOutput &out) const;
2213 CYTypedIdentifier *typed_;
2214 CYTypedParameter *parameters_;
2217 CYLambda(CYTypedIdentifier *typed, CYTypedParameter *parameters, CYStatement *code) :
2219 parameters_(parameters),
2226 virtual CYTarget *Replace(CYContext &context);
2227 virtual void Output(CYOutput &out, CYFlags flags) const;
2236 CYModule(CYWord *part, CYModule *next = NULL) :
2237 CYNext<CYModule>(next),
2242 CYString *Replace(CYContext &context, const char *separator) const;
2243 void Output(CYOutput &out) const;
2251 CYImport(CYModule *module) :
2258 virtual CYStatement *Replace(CYContext &context);
2259 virtual void Output(CYOutput &out, CYFlags flags) const;
2262 struct CYImportSpecifier :
2263 CYNext<CYImportSpecifier>
2266 CYIdentifier *binding_;
2268 CYImportSpecifier(CYWord *name, CYIdentifier *binding) :
2274 CYStatement *Replace(CYContext &context, CYIdentifier *module);
2277 struct CYImportDeclaration :
2280 CYImportSpecifier *specifiers_;
2283 CYImportDeclaration(CYImportSpecifier *specifiers, CYString *module) :
2284 specifiers_(specifiers),
2291 virtual CYStatement *Replace(CYContext &context);
2292 virtual void Output(CYOutput &out, CYFlags flags) const;
2299 CYTypedIdentifier *typed_;
2301 CYExternal(CYString *abi, CYTypedIdentifier *typed) :
2309 virtual CYStatement *Replace(CYContext &context);
2310 virtual void Output(CYOutput &out, CYFlags flags) const;
2313 struct CYTypeExpression :
2316 CYTypedIdentifier *typed_;
2318 CYTypeExpression(CYTypedIdentifier *typed) :
2325 virtual CYTarget *Replace(CYContext &context);
2326 virtual void Output(CYOutput &out, CYFlags flags) const;
2329 struct CYTypeDefinition :
2332 CYTypedIdentifier *typed_;
2334 CYTypeDefinition(CYTypedIdentifier *typed) :
2341 virtual CYStatement *Replace(CYContext &context);
2342 virtual void Output(CYOutput &out, CYFlags flags) const;
2345 struct CYTypeBlockWith :
2348 CYTypedParameter *parameters_;
2350 CYTypeBlockWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
2351 CYTypeModifier(next),
2352 parameters_(parameters)
2358 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
2359 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2362 struct CYTypeFunctionWith :
2365 CYTypedParameter *parameters_;
2367 CYTypeFunctionWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
2368 CYTypeModifier(next),
2369 parameters_(parameters)
2375 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
2376 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2378 virtual CYTypeFunctionWith *Function() { return this; }
2381 struct CYTypeStructField :
2382 CYNext<CYTypeStructField>
2384 CYTypedIdentifier *typed_;
2386 CYTypeStructField(CYTypedIdentifier *typed, CYTypeStructField *next = NULL) :
2387 CYNext<CYTypeStructField>(next),
2393 struct CYStructTail :
2396 CYTypeStructField *fields_;
2398 CYStructTail(CYTypeStructField *fields) :
2403 CYTarget *Replace(CYContext &context);
2404 virtual void Output(CYOutput &out) const;
2407 struct CYTypeStruct :
2410 CYIdentifier *name_;
2411 CYStructTail *tail_;
2413 CYTypeStruct(CYIdentifier *name, CYStructTail *tail) :
2419 virtual CYTarget *Replace(CYContext &context);
2420 virtual void Output(CYOutput &out) const;
2423 struct CYStructDefinition :
2426 CYIdentifier *name_;
2427 CYStructTail *tail_;
2429 CYStructDefinition(CYIdentifier *name, CYStructTail *tail) :
2437 virtual CYStatement *Replace(CYContext &context);
2438 virtual void Output(CYOutput &out, CYFlags flags) const;
2447 CYIdentifier *name_;
2450 Catch(CYIdentifier *name, CYStatement *code) :
2456 void Replace(CYContext &context);
2457 virtual void Output(CYOutput &out) const;
2465 CYFinally *finally_;
2467 Try(CYStatement *code, Catch *_catch, CYFinally *finally) :
2476 virtual CYStatement *Replace(CYContext &context);
2477 virtual void Output(CYOutput &out, CYFlags flags) const;
2483 CYExpression *value_;
2485 Throw(CYExpression *value = NULL) :
2492 virtual CYStatement *Replace(CYContext &context);
2493 virtual void Output(CYOutput &out, CYFlags flags) const;
2501 CYExpression *scope_;
2504 CYWith(CYExpression *scope, CYStatement *code) :
2512 virtual CYStatement *Replace(CYContext &context);
2513 virtual void Output(CYOutput &out, CYFlags flags) const;
2519 CYExpression *value_;
2522 CYSwitch(CYExpression *value, CYClause *clauses) :
2530 virtual CYStatement *Replace(CYContext &context);
2531 virtual void Output(CYOutput &out, CYFlags flags) const;
2543 virtual CYStatement *Replace(CYContext &context);
2544 virtual void Output(CYOutput &out, CYFlags flags) const;
2547 struct CYCondition :
2550 CYExpression *test_;
2551 CYExpression *true_;
2552 CYExpression *false_;
2554 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
2563 virtual CYExpression *Replace(CYContext &context);
2564 virtual void Output(CYOutput &out, CYFlags flags) const;
2567 struct CYAddressOf :
2570 CYAddressOf(CYExpression *rhs) :
2575 virtual const char *Operator() const {
2581 virtual CYExpression *Replace(CYContext &context);
2589 CYIndirect(CYExpression *rhs) :
2594 // XXX: this should be checked
2597 virtual CYTarget *Replace(CYContext &context);
2598 virtual void Output(CYOutput &out, CYFlags flags) const;
2602 virtual CYExpression *Replace(CYContext &context);
2604 #define CYPostfix_(op, name, args...) \
2605 struct CY ## name : \
2608 CY ## name(CYExpression *lhs) : \
2613 virtual const char *Operator() const { \
2618 #define CYPrefix_(alphabetic, op, name, args...) \
2619 struct CY ## name : \
2622 CY ## name(CYExpression *rhs) : \
2627 CYAlphabetic(alphabetic) \
2629 virtual const char *Operator() const { \
2634 #define CYInfix_(alphabetic, precedence, op, name, args...) \
2635 struct CY ## name : \
2638 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
2643 CYAlphabetic(alphabetic) \
2644 CYPrecedence(precedence) \
2646 virtual const char *Operator() const { \
2651 #define CYAssignment_(op, name, args...) \
2652 struct CY ## name ## Assign : \
2655 CY ## name ## Assign(CYTarget *lhs, CYExpression *rhs) : \
2656 CYAssignment(lhs, rhs) \
2660 virtual const char *Operator() const { \
2665 CYPostfix_("++", PostIncrement)
2666 CYPostfix_("--", PostDecrement)
2668 CYPrefix_(true, "delete", Delete)
2669 CYPrefix_(true, "void", Void)
2670 CYPrefix_(true, "typeof", TypeOf)
2671 CYPrefix_(false, "++", PreIncrement)
2672 CYPrefix_(false, "--", PreDecrement)
2673 CYPrefix_(false, "+", Affirm)
2674 CYPrefix_(false, "-", Negate)
2675 CYPrefix_(false, "~", BitwiseNot)
2676 CYPrefix_(false, "!", LogicalNot)
2678 CYInfix_(false, 5, "*", Multiply, CYReplace)
2679 CYInfix_(false, 5, "/", Divide)
2680 CYInfix_(false, 5, "%", Modulus)
2681 CYInfix_(false, 6, "+", Add, CYReplace)
2682 CYInfix_(false, 6, "-", Subtract)
2683 CYInfix_(false, 7, "<<", ShiftLeft)
2684 CYInfix_(false, 7, ">>", ShiftRightSigned)
2685 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
2686 CYInfix_(false, 8, "<", Less)
2687 CYInfix_(false, 8, ">", Greater)
2688 CYInfix_(false, 8, "<=", LessOrEqual)
2689 CYInfix_(false, 8, ">=", GreaterOrEqual)
2690 CYInfix_(true, 8, "instanceof", InstanceOf)
2691 CYInfix_(true, 8, "in", In)
2692 CYInfix_(false, 9, "==", Equal)
2693 CYInfix_(false, 9, "!=", NotEqual)
2694 CYInfix_(false, 9, "===", Identical)
2695 CYInfix_(false, 9, "!==", NotIdentical)
2696 CYInfix_(false, 10, "&", BitwiseAnd)
2697 CYInfix_(false, 11, "^", BitwiseXOr)
2698 CYInfix_(false, 12, "|", BitwiseOr)
2699 CYInfix_(false, 13, "&&", LogicalAnd)
2700 CYInfix_(false, 14, "||", LogicalOr)
2702 CYAssignment_("=", )
2703 CYAssignment_("*=", Multiply)
2704 CYAssignment_("/=", Divide)
2705 CYAssignment_("%=", Modulus)
2706 CYAssignment_("+=", Add)
2707 CYAssignment_("-=", Subtract)
2708 CYAssignment_("<<=", ShiftLeft)
2709 CYAssignment_(">>=", ShiftRightSigned)
2710 CYAssignment_(">>>=", ShiftRightUnsigned)
2711 CYAssignment_("&=", BitwiseAnd)
2712 CYAssignment_("^=", BitwiseXOr)
2713 CYAssignment_("|=", BitwiseOr)
2715 #endif/*CYCRIPT_PARSER_HPP*/