1 /* Cycript - The Truly Universal Scripting Language
2 * Copyright (C) 2009-2016 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);
40 double CYCastDouble(CYUTF8String value);
42 void CYNumerify(std::ostringstream &str, double value);
43 void CYStringify(std::ostringstream &str, const char *data, size_t size, bool c = false);
45 // XXX: this really should not be here ... :/
46 void *CYPoolFile(CYPool &pool, const char *path, size_t *psize);
47 CYUTF8String CYPoolFileUTF8String(CYPool &pool, const char *path);
52 virtual void Output(struct CYOutput &out) const = 0;
73 CYOutput(std::streambuf &out, CYOptions &options) :
84 void Check(char value);
87 _finline void operator ()(char value) {
88 _assert(out_.sputc(value) != EOF);
96 _finline void operator ()(const char *data, std::streamsize size) {
97 _assert(out_.sputn(data, size) == size);
99 position_.Columns(size);
102 _finline void operator ()(const char *data) {
103 return operator ()(data, strlen(data));
106 CYOutput &operator <<(char rhs);
107 CYOutput &operator <<(const char *rhs);
109 _finline CYOutput &operator <<(const CYThing *rhs) {
115 _finline CYOutput &operator <<(const CYThing &rhs) {
126 struct CYPropertyName {
127 virtual bool Computed() const {
131 virtual bool Constructor() const {
135 virtual CYIdentifier *Identifier() {
139 virtual CYNumber *Number(CYContext &context) {
143 virtual CYExpression *PropertyName(CYContext &context) = 0;
144 virtual void PropertyName(CYOutput &out) const = 0;
155 CYNoBrace = (1 << 0),
156 CYNoFunction = (1 << 1),
157 CYNoClass = (1 << 2),
160 CYNoRightHand = (1 << 5),
161 CYNoDangle = (1 << 6),
162 CYNoInteger = (1 << 7),
163 CYNoColon = (1 << 8),
164 CYNoBFC = (CYNoBrace | CYNoFunction | CYNoClass),
167 _finline CYFlags operator ~(CYFlags rhs) {
168 return static_cast<CYFlags>(~static_cast<unsigned>(rhs));
171 _finline CYFlags operator &(CYFlags lhs, CYFlags rhs) {
172 return static_cast<CYFlags>(static_cast<unsigned>(lhs) & static_cast<unsigned>(rhs));
175 _finline CYFlags operator |(CYFlags lhs, CYFlags rhs) {
176 return static_cast<CYFlags>(static_cast<unsigned>(lhs) | static_cast<unsigned>(rhs));
179 _finline CYFlags &operator |=(CYFlags &lhs, CYFlags rhs) {
180 return lhs = lhs | rhs;
183 _finline CYFlags CYLeft(CYFlags flags) {
184 return flags & ~(CYNoDangle | CYNoInteger);
187 _finline CYFlags CYRight(CYFlags flags) {
188 return flags & ~CYNoBFC;
191 _finline CYFlags CYCenter(CYFlags flags) {
192 return CYLeft(CYRight(flags));
201 #define CYCompact(type) \
202 virtual CYCompactType Compact() const { \
203 return CYCompact ## type; \
210 void Single(CYOutput &out, CYFlags flags, CYCompactType request) const;
211 void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
212 virtual void Output(CYOutput &out) const;
214 virtual CYStatement *Replace(CYContext &context) = 0;
216 virtual CYCompactType Compact() const = 0;
217 virtual CYStatement *Return();
220 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
223 typedef CYList<CYStatement> CYStatements;
225 struct CYForInitializer :
228 virtual CYForInitializer *Replace(CYContext &context) = 0;
229 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
238 CYWord(const char *word) :
243 virtual bool Constructor() const {
244 return strcmp(word_, "constructor") == 0;
247 virtual const char *Word() const;
248 virtual void Output(CYOutput &out) const;
250 virtual CYExpression *PropertyName(CYContext &context);
251 virtual void PropertyName(CYOutput &out) const;
254 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
256 return lhs << rhs.Word();
259 enum CYIdentifierKind {
260 CYIdentifierArgument,
266 CYIdentifierVariable,
269 struct CYIdentifier :
270 CYNext<CYIdentifier>,
273 CYLocation location_;
277 CYIdentifier(const char *word) :
284 CYIdentifier *Identifier() override {
288 virtual const char *Word() const;
289 CYIdentifier *Replace(CYContext &context, CYIdentifierKind);
296 CYStatement *statement_;
298 CYLabel(CYIdentifier *name, CYStatement *statement) :
300 statement_(statement)
306 virtual CYStatement *Replace(CYContext &context);
307 virtual void Output(CYOutput &out, CYFlags flags) const;
310 struct CYCStringLess :
311 std::binary_function<const char *, const char *, bool>
313 _finline bool operator ()(const char *lhs, const char *rhs) const {
314 return strcmp(lhs, rhs) < 0;
318 struct CYIdentifierValueLess :
319 std::binary_function<CYIdentifier *, CYIdentifier *, bool>
321 _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
322 return CYCStringLess()(lhs->Word(), rhs->Word());
326 struct CYIdentifierFlags :
327 CYNext<CYIdentifierFlags>
329 CYIdentifier *identifier_;
330 CYIdentifierKind kind_;
334 CYIdentifierFlags(CYIdentifier *identifier, CYIdentifierKind kind, CYIdentifierFlags *next = NULL) :
335 CYNext<CYIdentifierFlags>(next),
336 identifier_(identifier),
348 CYIdentifierFlags *shadow_;
350 CYIdentifierFlags *internal_;
352 CYScope(bool transparent, CYContext &context);
354 CYIdentifierFlags *Lookup(CYContext &context, const char *word);
355 CYIdentifierFlags *Lookup(CYContext &context, CYIdentifier *identifier);
357 CYIdentifierFlags *Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierKind kind);
358 void Merge(CYContext &context, const CYIdentifierFlags *flags);
360 void Close(CYContext &context, CYStatement *&statements);
361 void Close(CYContext &context);
370 CYScript(CYStatement *code) :
375 virtual void Replace(CYContext &context);
376 virtual void Output(CYOutput &out) const;
387 CYIdentifier *super_;
389 CYNonLocal *nonlocal_;
390 CYNonLocal *nextlocal_;
393 std::vector<CYIdentifier *> replace_;
395 CYContext(CYOptions &options) :
406 void ReplaceAll(CYStatement *&statement) {
407 if (statement == NULL)
409 CYStatement *next(statement->next_);
414 if (statement == NULL)
417 statement->SetNext(next);
420 template <typename Type_>
421 void Replace(Type_ *&value) {
422 for (;;) if (value == NULL)
425 Type_ *replace(value->Replace(*this));
426 if (replace != value)
432 void NonLocal(CYStatement *&statements);
433 CYIdentifier *Unique();
437 CYIdentifier *identifier_;
444 CYIdentifier *Target(CYContext &context) {
445 if (identifier_ == NULL)
446 identifier_ = context.Unique();
454 CYIdentifier *identifier_;
461 CYIdentifier *Identifier(CYContext &context) {
463 return next_->Identifier(context);
464 if (identifier_ == NULL)
465 identifier_ = context.Unique();
475 CYBlock(CYStatement *code) :
482 virtual CYStatement *Replace(CYContext &context);
484 virtual void Output(CYOutput &out, CYFlags flags) const;
486 virtual CYStatement *Return();
492 struct CYForInInitializer {
493 virtual CYStatement *Initialize(CYContext &context, CYExpression *value) = 0;
495 virtual CYTarget *Replace(CYContext &context) = 0;
496 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
499 struct CYFunctionParameter;
504 struct CYExpression :
507 virtual int Precedence() const = 0;
509 virtual bool RightHand() const {
513 virtual bool Eval() const {
517 virtual CYTarget *AddArgument(CYContext &context, CYExpression *value);
519 virtual void Output(CYOutput &out) const;
520 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
521 void Output(CYOutput &out, int precedence, CYFlags flags) const;
523 virtual CYExpression *Replace(CYContext &context) = 0;
525 virtual CYExpression *Primitive(CYContext &context) {
529 virtual CYFunctionParameter *Parameter() const;
531 virtual CYNumber *Number(CYContext &context) {
535 virtual CYString *String(CYContext &context) {
539 virtual const char *Word() const {
548 virtual bool RightHand() const {
552 virtual bool IsNew() const {
556 virtual CYStatement *Initialize(CYContext &context, CYExpression *value);
558 virtual CYTarget *Replace(CYContext &context) = 0;
559 using CYExpression::Output;
562 #define CYAlphabetic(value) \
563 virtual bool Alphabetic() const { \
567 #define CYPrecedence(value) \
568 static const int Precedence_ = value; \
569 virtual int Precedence() const { \
570 return Precedence_; \
576 CYExpression *expression_;
579 CYCompound(CYExpression *expression, CYExpression *next) :
580 expression_(expression),
583 _assert(expression_ != NULL);
584 _assert(next != NULL);
589 virtual CYExpression *Replace(CYContext &context);
590 void Output(CYOutput &out, CYFlags flags) const;
592 virtual CYFunctionParameter *Parameter() const;
595 struct CYParenthetical :
598 CYExpression *expression_;
600 CYParenthetical(CYExpression *expression) :
601 expression_(expression)
607 virtual CYTarget *Replace(CYContext &context);
608 void Output(CYOutput &out, CYFlags flags) const;
613 struct CYFunctionParameter :
614 CYNext<CYFunctionParameter>,
619 CYFunctionParameter(CYBinding *binding, CYFunctionParameter *next = NULL) :
620 CYNext<CYFunctionParameter>(next),
625 void Replace(CYContext &context, CYStatement *&statements);
626 void Output(CYOutput &out) const;
629 struct CYComprehension :
630 CYNext<CYComprehension>,
633 CYComprehension(CYComprehension *next = NULL) :
634 CYNext<CYComprehension>(next)
638 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
639 CYFunctionParameter *Parameters(CYContext &context) const;
640 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
641 virtual void Output(CYOutput &out) const = 0;
644 struct CYForInComprehension :
648 CYExpression *iterable_;
650 CYForInComprehension(CYBinding *binding, CYExpression *iterable, CYComprehension *next = NULL) :
651 CYComprehension(next),
657 virtual CYFunctionParameter *Parameter(CYContext &context) const;
658 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
659 virtual void Output(CYOutput &out) const;
662 struct CYForOfComprehension :
666 CYExpression *iterable_;
668 CYForOfComprehension(CYBinding *binding, CYExpression *iterable, CYComprehension *next = NULL) :
669 CYComprehension(next),
675 virtual CYFunctionParameter *Parameter(CYContext &context) const;
676 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
677 virtual void Output(CYOutput &out) const;
680 struct CYIfComprehension :
685 CYIfComprehension(CYExpression *test, CYComprehension *next = NULL) :
686 CYComprehension(next),
691 virtual CYFunctionParameter *Parameter(CYContext &context) const;
692 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
693 virtual void Output(CYOutput &out) const;
696 struct CYArrayComprehension :
699 CYExpression *expression_;
700 CYComprehension *comprehensions_;
702 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
703 expression_(expression),
704 comprehensions_(comprehensions)
710 virtual CYTarget *Replace(CYContext &context);
711 virtual void Output(CYOutput &out, CYFlags flags) const;
717 CYLocation location_;
721 virtual CYExpression *Primitive(CYContext &context) {
729 virtual CYTarget *Replace(CYContext &context);
742 CYRange(uint64_t lo, uint64_t hi) :
747 bool operator [](uint8_t value) const {
748 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
751 void operator()(uint8_t value) {
754 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
758 extern CYRange DigitRange_;
759 extern CYRange WordStartRange_;
760 extern CYRange WordEndRange_;
775 CYString(const char *value) :
781 CYString(const char *value, size_t size) :
787 CYString(const CYWord *word) :
788 value_(word->Word()),
789 size_(strlen(value_))
793 const char *Value() const {
797 virtual CYIdentifier *Identifier() const;
798 virtual const char *Word() const;
800 virtual CYNumber *Number(CYContext &context);
801 virtual CYString *String(CYContext &context);
803 CYString *Concat(CYContext &out, CYString *rhs) const;
804 virtual void Output(CYOutput &out, CYFlags flags) const;
806 virtual CYExpression *PropertyName(CYContext &context);
807 virtual void PropertyName(CYOutput &out) const;
810 struct CYElementValue;
815 CYExpression *expression_;
818 CYSpan(CYExpression *expression, CYString *string, CYSpan *next) :
819 CYNext<CYSpan>(next),
820 expression_(expression),
825 CYElementValue *Replace(CYContext &context);
834 CYTemplate(CYString *string, CYSpan *spans) :
842 virtual CYTarget *Replace(CYContext &context);
843 virtual void Output(CYOutput &out, CYFlags flags) const;
852 CYNumber(double value) :
857 double Value() const {
861 virtual CYNumber *Number(CYContext &context);
862 virtual CYString *String(CYContext &context);
864 virtual void Output(CYOutput &out, CYFlags flags) const;
866 virtual CYExpression *PropertyName(CYContext &context);
867 virtual void PropertyName(CYOutput &out) const;
873 CYExpression *expression_;
875 CYComputed(CYExpression *expression) :
876 expression_(expression)
880 virtual bool Computed() const {
884 virtual CYExpression *PropertyName(CYContext &context);
885 virtual void PropertyName(CYOutput &out) const;
894 CYRegEx(const char *value, size_t size) :
900 const char *Value() const {
904 virtual void Output(CYOutput &out, CYFlags flags) const;
910 virtual CYNumber *Number(CYContext &context);
911 virtual CYString *String(CYContext &context);
913 virtual void Output(CYOutput &out, CYFlags flags) const;
919 virtual CYTarget *Replace(CYContext &context);
920 virtual void Output(CYOutput &out, CYFlags flags) const;
928 virtual bool RightHand() const {
932 virtual bool Value() const = 0;
933 virtual void Output(CYOutput &out, CYFlags flags) const;
939 virtual bool Value() const {
943 virtual CYNumber *Number(CYContext &context);
944 virtual CYString *String(CYContext &context);
950 virtual bool Value() const {
954 virtual CYNumber *Number(CYContext &context);
955 virtual CYString *String(CYContext &context);
963 CYVariable(CYIdentifier *name) :
968 CYVariable(const char *name) :
969 name_(new($pool) CYIdentifier(name))
975 virtual bool Eval() const {
976 return strcmp(name_->Word(), "eval") == 0;
979 virtual CYTarget *Replace(CYContext &context);
980 virtual void Output(CYOutput &out, CYFlags flags) const;
982 virtual CYFunctionParameter *Parameter() const;
990 CYSymbol(const char *name) :
997 virtual CYTarget *Replace(CYContext &context);
998 virtual void Output(CYOutput &out, CYFlags flags) const;
1006 CYPrefix(CYExpression *rhs) :
1011 virtual bool Alphabetic() const = 0;
1012 virtual const char *Operator() const = 0;
1016 virtual CYExpression *Replace(CYContext &context);
1017 virtual void Output(CYOutput &out, CYFlags flags) const;
1026 CYInfix(CYExpression *lhs, CYExpression *rhs) :
1032 void SetLeft(CYExpression *lhs) {
1036 virtual bool Alphabetic() const = 0;
1037 virtual const char *Operator() const = 0;
1039 virtual CYExpression *Replace(CYContext &context);
1040 virtual void Output(CYOutput &out, CYFlags flags) const;
1048 CYPostfix(CYExpression *lhs) :
1053 virtual const char *Operator() const = 0;
1057 virtual CYExpression *Replace(CYContext &context);
1058 virtual void Output(CYOutput &out, CYFlags flags) const;
1061 struct CYAssignment :
1067 CYAssignment(CYTarget *lhs, CYExpression *rhs) :
1073 void SetRight(CYExpression *rhs) {
1077 virtual const char *Operator() const = 0;
1081 virtual CYExpression *Replace(CYContext &context);
1082 virtual void Output(CYOutput &out, CYFlags flags) const;
1090 CYExpression *value_;
1092 CYArgument(CYExpression *value, CYArgument *next = NULL) :
1093 CYNext<CYArgument>(next),
1099 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
1100 CYNext<CYArgument>(next),
1106 CYArgument *Replace(CYContext &context);
1107 void Output(CYOutput &out) const;
1114 CYExpression *value_;
1117 CYClause(CYExpression *value, CYStatement *code) :
1123 void Replace(CYContext &context);
1124 virtual void Output(CYOutput &out) const;
1131 CYElement(CYElement *next) :
1132 CYNext<CYElement>(next)
1136 virtual bool Elision() const = 0;
1138 virtual void Replace(CYContext &context) = 0;
1141 struct CYElementValue :
1144 CYExpression *value_;
1146 CYElementValue(CYExpression *value, CYElement *next = NULL) :
1152 virtual bool Elision() const {
1153 return value_ == NULL;
1156 virtual void Replace(CYContext &context);
1157 virtual void Output(CYOutput &out) const;
1160 struct CYElementSpread :
1163 CYExpression *value_;
1165 CYElementSpread(CYExpression *value, CYElement *next = NULL) :
1171 virtual bool Elision() const {
1175 virtual void Replace(CYContext &context);
1176 virtual void Output(CYOutput &out) const;
1182 CYElement *elements_;
1184 CYArray(CYElement *elements = NULL) :
1189 virtual CYTarget *Replace(CYContext &context);
1190 virtual void Output(CYOutput &out, CYFlags flags) const;
1194 CYIdentifier *identifier_;
1195 CYExpression *initializer_;
1197 CYBinding(CYIdentifier *identifier, CYExpression *initializer = NULL) :
1198 identifier_(identifier),
1199 initializer_(initializer)
1203 CYTarget *Target(CYContext &context);
1205 virtual CYAssignment *Replace(CYContext &context, CYIdentifierKind kind);
1206 virtual void Output(CYOutput &out, CYFlags flags) const;
1209 struct CYForLexical :
1213 CYBinding *binding_;
1215 CYForLexical(bool constant, CYBinding *binding) :
1216 constant_(constant),
1221 virtual CYStatement *Initialize(CYContext &context, CYExpression *value);
1223 virtual CYTarget *Replace(CYContext &context);
1224 virtual void Output(CYOutput &out, CYFlags flags) const;
1227 struct CYForVariable :
1230 CYBinding *binding_;
1232 CYForVariable(CYBinding *binding) :
1237 virtual CYStatement *Initialize(CYContext &context, CYExpression *value);
1239 virtual CYTarget *Replace(CYContext &context);
1240 virtual void Output(CYOutput &out, CYFlags flags) const;
1247 CYBinding *binding_;
1249 CYBindings(CYBinding *binding, CYBindings *next = NULL) :
1250 CYNext<CYBindings>(next),
1255 CYExpression *Replace(CYContext &context, CYIdentifierKind kind);
1257 CYArgument *Argument(CYContext &context);
1258 CYFunctionParameter *Parameter(CYContext &context);
1260 virtual void Output(CYOutput &out) const;
1261 virtual void Output(CYOutput &out, CYFlags flags) const;
1267 CYBindings *bindings_;
1269 CYVar(CYBindings *bindings) :
1276 virtual CYForInitializer *Replace(CYContext &context);
1277 virtual void Output(CYOutput &out, CYFlags flags) const;
1284 CYBindings *bindings_;
1286 CYLexical(bool constant, CYBindings *bindings) :
1287 constant_(constant),
1294 virtual CYForInitializer *Replace(CYContext &context);
1295 virtual void Output(CYOutput &out, CYFlags flags) const;
1299 CYList<CYBindings> bindings_;
1300 CYList<CYStatement> statements_;
1302 operator bool() const {
1303 return statements_ != NULL;
1311 CYPropertyName *name_;
1313 CYProperty(CYPropertyName *name, CYProperty *next = NULL) :
1314 CYNext<CYProperty>(next),
1319 virtual bool Update() const;
1321 CYProperty *ReplaceAll(CYContext &context, CYBuilder &builder, CYExpression *self, bool update);
1322 void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, bool protect);
1324 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect) = 0;
1326 virtual void Replace(CYContext &context) = 0;
1327 virtual void Output(CYOutput &out) const;
1330 struct CYPropertyValue :
1333 CYExpression *value_;
1335 CYPropertyValue(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1336 CYProperty(name, next),
1341 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
1342 virtual void Replace(CYContext &context);
1343 virtual void Output(CYOutput &out) const;
1349 CYForInitializer *initializer_;
1350 CYExpression *test_;
1351 CYExpression *increment_;
1354 CYFor(CYForInitializer *initializer, CYExpression *test, CYExpression *increment, CYStatement *code) :
1355 initializer_(initializer),
1357 increment_(increment),
1364 virtual CYStatement *Replace(CYContext &context);
1365 virtual void Output(CYOutput &out, CYFlags flags) const;
1371 CYForInInitializer *initializer_;
1372 CYExpression *iterable_;
1375 CYForIn(CYForInInitializer *initializer, CYExpression *iterable, CYStatement *code) :
1376 initializer_(initializer),
1377 iterable_(iterable),
1384 virtual CYStatement *Replace(CYContext &context);
1385 virtual void Output(CYOutput &out, CYFlags flags) const;
1388 struct CYForInitialized :
1391 CYBinding *binding_;
1392 CYExpression *iterable_;
1395 CYForInitialized(CYBinding *binding, CYExpression *iterable, CYStatement *code) :
1397 iterable_(iterable),
1404 virtual CYStatement *Replace(CYContext &context);
1405 virtual void Output(CYOutput &out, CYFlags flags) const;
1411 CYForInInitializer *initializer_;
1412 CYExpression *iterable_;
1415 CYForOf(CYForInInitializer *initializer, CYExpression *iterable, CYStatement *code) :
1416 initializer_(initializer),
1417 iterable_(iterable),
1424 virtual CYStatement *Replace(CYContext &context);
1425 virtual void Output(CYOutput &out, CYFlags flags) const;
1431 CYProperty *properties_;
1433 CYObject(CYProperty *properties = NULL) :
1434 properties_(properties)
1438 CYTarget *Replace(CYContext &context, CYTarget *seed);
1440 virtual CYTarget *Replace(CYContext &context);
1441 void Output(CYOutput &out, CYFlags flags) const;
1447 CYExpression *object_;
1448 CYExpression *property_;
1450 CYMember(CYExpression *object, CYExpression *property) :
1456 void SetLeft(CYExpression *object) {
1461 struct CYDirectMember :
1464 CYDirectMember(CYExpression *object, CYExpression *property) :
1465 CYMember(object, property)
1471 virtual CYTarget *Replace(CYContext &context);
1472 virtual void Output(CYOutput &out, CYFlags flags) const;
1475 struct CYIndirectMember :
1478 CYIndirectMember(CYExpression *object, CYExpression *property) :
1479 CYMember(object, property)
1485 virtual CYTarget *Replace(CYContext &context);
1486 virtual void Output(CYOutput &out, CYFlags flags) const;
1489 struct CYResolveMember :
1492 CYResolveMember(CYExpression *object, CYExpression *property) :
1493 CYMember(object, property)
1499 virtual CYTarget *Replace(CYContext &context);
1500 virtual void Output(CYOutput &out, CYFlags flags) const;
1503 struct CYSubscriptMember :
1506 CYSubscriptMember(CYExpression *object, CYExpression *property) :
1507 CYMember(object, property)
1513 virtual CYTarget *Replace(CYContext &context);
1514 virtual void Output(CYOutput &out, CYFlags flags) const;
1523 CYExpression *constructor_;
1524 CYArgument *arguments_;
1526 New(CYExpression *constructor, CYArgument *arguments = NULL) :
1527 constructor_(constructor),
1528 arguments_(arguments)
1532 virtual int Precedence() const {
1533 return arguments_ == NULL ? 2 : 1;
1536 virtual bool IsNew() const {
1540 virtual CYTarget *Replace(CYContext &context);
1541 virtual void Output(CYOutput &out, CYFlags flags) const;
1543 virtual CYTarget *AddArgument(CYContext &context, CYExpression *value);
1551 CYArgument *arguments_;
1553 CYApply(CYArgument *arguments = NULL) :
1554 arguments_(arguments)
1560 virtual CYTarget *AddArgument(CYContext &context, CYExpression *value);
1566 CYExpression *function_;
1568 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1574 virtual void Output(CYOutput &out, CYFlags flags) const;
1575 virtual CYTarget *Replace(CYContext &context);
1581 CYEval(CYArgument *arguments) :
1586 virtual void Output(CYOutput &out, CYFlags flags) const;
1587 virtual CYTarget *Replace(CYContext &context);
1597 CYBraced(CYTarget *lhs = NULL) :
1604 void SetLeft(CYTarget *lhs) {
1609 struct CYRubyBlock :
1614 CYRubyBlock(CYTarget *lhs, CYRubyProc *proc) :
1620 virtual CYTarget *Replace(CYContext &context);
1621 virtual void Output(CYOutput &out, CYFlags flags) const;
1623 virtual CYTarget *AddArgument(CYContext &context, CYExpression *value);
1631 CYExtend(CYTarget *lhs, CYProperty *properties = NULL) :
1637 virtual CYTarget *Replace(CYContext &context);
1638 virtual void Output(CYOutput &out, CYFlags flags) const;
1644 CYExpression *test_;
1646 CYStatement *false_;
1648 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
1657 virtual CYStatement *Replace(CYContext &context);
1658 virtual void Output(CYOutput &out, CYFlags flags) const;
1660 virtual CYStatement *Return();
1666 CYExpression *test_;
1669 CYDoWhile(CYExpression *test, CYStatement *code) :
1677 virtual CYStatement *Replace(CYContext &context);
1678 virtual void Output(CYOutput &out, CYFlags flags) const;
1684 CYExpression *test_;
1687 CYWhile(CYExpression *test, CYStatement *code) :
1695 virtual CYStatement *Replace(CYContext &context);
1696 virtual void Output(CYOutput &out, CYFlags flags) const;
1700 CYFunctionParameter *parameters_;
1703 CYNonLocal *nonlocal_;
1706 CYIdentifier *super_;
1708 CYFunction(CYFunctionParameter *parameters, CYStatement *code) :
1709 parameters_(parameters),
1717 void Replace(CYContext &context);
1718 void Output(CYOutput &out) const;
1721 struct CYFunctionExpression :
1725 CYIdentifier *name_;
1727 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
1728 CYFunction(parameters, code),
1735 CYTarget *Replace(CYContext &context) override;
1736 virtual void Output(CYOutput &out, CYFlags flags) const;
1743 CYFatArrow(CYFunctionParameter *parameters, CYStatement *code) :
1744 CYFunction(parameters, code)
1750 CYExpression *Replace(CYContext &context) override;
1751 virtual void Output(CYOutput &out, CYFlags flags) const;
1758 CYRubyProc(CYFunctionParameter *parameters, CYStatement *code) :
1759 CYFunction(parameters, code)
1765 CYTarget *Replace(CYContext &context) override;
1766 virtual void Output(CYOutput &out, CYFlags flags) const;
1769 struct CYFunctionStatement :
1773 CYIdentifier *name_;
1775 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
1776 CYFunction(parameters, code),
1783 CYStatement *Replace(CYContext &context) override;
1784 virtual void Output(CYOutput &out, CYFlags flags) const;
1787 struct CYPropertyMethod;
1793 CYMethod(CYPropertyName *name, CYFunctionParameter *parameters, CYStatement *code, CYProperty *next = NULL) :
1794 CYFunction(parameters, code),
1795 CYProperty(name, next)
1799 virtual CYFunctionExpression *Constructor();
1801 using CYProperty::Replace;
1802 virtual void Replace(CYContext &context);
1805 struct CYPropertyGetter :
1808 CYPropertyGetter(CYPropertyName *name, CYStatement *code, CYProperty *next = NULL) :
1809 CYMethod(name, NULL, code, next)
1813 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
1814 virtual void Output(CYOutput &out) const;
1817 struct CYPropertySetter :
1820 CYPropertySetter(CYPropertyName *name, CYFunctionParameter *parameters, CYStatement *code, CYProperty *next = NULL) :
1821 CYMethod(name, parameters, code, next)
1825 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
1826 virtual void Output(CYOutput &out) const;
1829 struct CYPropertyMethod :
1832 CYPropertyMethod(CYPropertyName *name, CYFunctionParameter *parameters, CYStatement *code, CYProperty *next = NULL) :
1833 CYMethod(name, parameters, code, next)
1837 bool Update() const override;
1839 virtual CYFunctionExpression *Constructor();
1841 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
1842 virtual void Output(CYOutput &out) const;
1845 struct CYClassTail :
1848 CYExpression *extends_;
1850 CYFunctionExpression *constructor_;
1851 CYList<CYProperty> instance_;
1852 CYList<CYProperty> static_;
1854 CYClassTail(CYExpression *extends) :
1860 void Output(CYOutput &out) const;
1863 struct CYClassExpression :
1866 CYIdentifier *name_;
1869 CYClassExpression(CYIdentifier *name, CYClassTail *tail) :
1877 CYTarget *Replace(CYContext &context) override;
1878 virtual void Output(CYOutput &out, CYFlags flags) const;
1881 struct CYClassStatement :
1884 CYIdentifier *name_;
1887 CYClassStatement(CYIdentifier *name, CYClassTail *tail) :
1895 CYStatement *Replace(CYContext &context) override;
1896 virtual void Output(CYOutput &out, CYFlags flags) const;
1899 struct CYSuperCall :
1902 CYArgument *arguments_;
1904 CYSuperCall(CYArgument *arguments) :
1905 arguments_(arguments)
1911 CYTarget *Replace(CYContext &context) override;
1912 virtual void Output(CYOutput &out, CYFlags flags) const;
1915 struct CYSuperAccess :
1918 CYExpression *property_;
1920 CYSuperAccess(CYExpression *property) :
1927 CYTarget *Replace(CYContext &context) override;
1928 virtual void Output(CYOutput &out, CYFlags flags) const;
1934 CYExpression *expression_;
1936 CYExpress(CYExpression *expression) :
1937 expression_(expression)
1939 if (expression_ == NULL)
1945 CYForInitializer *Replace(CYContext &context) override;
1946 virtual void Output(CYOutput &out, CYFlags flags) const;
1948 virtual CYStatement *Return();
1954 CYIdentifier *label_;
1956 CYContinue(CYIdentifier *label) :
1963 CYStatement *Replace(CYContext &context) override;
1964 virtual void Output(CYOutput &out, CYFlags flags) const;
1970 CYIdentifier *label_;
1972 CYBreak(CYIdentifier *label) :
1979 CYStatement *Replace(CYContext &context) override;
1980 virtual void Output(CYOutput &out, CYFlags flags) const;
1986 CYExpression *value_;
1988 CYReturn(CYExpression *value) :
1995 CYStatement *Replace(CYContext &context) override;
1996 virtual void Output(CYOutput &out, CYFlags flags) const;
1999 struct CYYieldGenerator :
2002 CYExpression *value_;
2004 CYYieldGenerator(CYExpression *value) :
2011 CYExpression *Replace(CYContext &context) override;
2012 virtual void Output(CYOutput &out, CYFlags flags) const;
2015 struct CYYieldValue :
2018 CYExpression *value_;
2020 CYYieldValue(CYExpression *value) :
2027 virtual CYExpression *Replace(CYContext &context);
2028 virtual void Output(CYOutput &out, CYFlags flags) const;
2036 virtual CYForInitializer *Replace(CYContext &context);
2037 virtual void Output(CYOutput &out, CYFlags flags) const;
2045 CYFinally(CYStatement *code) :
2050 void Replace(CYContext &context);
2051 virtual void Output(CYOutput &out) const;
2054 struct CYTypeSpecifier :
2057 virtual CYTarget *Replace(CYContext &context) = 0;
2060 struct CYTypeError :
2066 virtual CYTarget *Replace(CYContext &context);
2067 virtual void Output(CYOutput &out) const;
2070 enum CYTypeSigning {
2076 struct CYTypeCharacter :
2079 CYTypeSigning signing_;
2081 CYTypeCharacter(CYTypeSigning signing) :
2086 virtual CYTarget *Replace(CYContext &context);
2087 virtual void Output(CYOutput &out) const;
2090 struct CYTypeInt128 :
2093 CYTypeSigning signing_;
2095 CYTypeInt128(CYTypeSigning signing) :
2100 virtual CYTarget *Replace(CYContext &context);
2101 virtual void Output(CYOutput &out) const;
2104 struct CYTypeIntegral :
2107 CYTypeSigning signing_;
2110 CYTypeIntegral(CYTypeSigning signing, int length = 1) :
2116 CYTypeIntegral *Long() {
2117 if (length_ != 1 && length_ != 2)
2123 CYTypeIntegral *Short() {
2130 CYTypeIntegral *Signed() {
2131 if (signing_ != CYTypeNeutral)
2133 signing_ = CYTypeSigned;
2137 CYTypeIntegral *Unsigned() {
2138 if (signing_ != CYTypeNeutral)
2140 signing_ = CYTypeUnsigned;
2144 virtual CYTarget *Replace(CYContext &context);
2145 virtual void Output(CYOutput &out) const;
2154 virtual CYTarget *Replace(CYContext &context);
2155 virtual void Output(CYOutput &out) const;
2158 enum CYTypeReferenceKind {
2159 CYTypeReferenceStruct,
2160 CYTypeReferenceEnum,
2163 struct CYTypeReference :
2166 CYTypeReferenceKind kind_;
2167 CYIdentifier *name_;
2169 CYTypeReference(CYTypeReferenceKind kind, CYIdentifier *name) :
2175 virtual CYTarget *Replace(CYContext &context);
2176 virtual void Output(CYOutput &out) const;
2179 struct CYTypeVariable :
2182 CYIdentifier *name_;
2184 CYTypeVariable(CYIdentifier *name) :
2189 CYTypeVariable(const char *name) :
2190 name_(new($pool) CYIdentifier(name))
2194 virtual CYTarget *Replace(CYContext &context);
2195 virtual void Output(CYOutput &out) const;
2198 struct CYTypeFunctionWith;
2200 struct CYTypeModifier :
2201 CYNext<CYTypeModifier>
2203 CYTypeModifier(CYTypeModifier *next) :
2204 CYNext<CYTypeModifier>(next)
2208 virtual int Precedence() const = 0;
2210 virtual CYTarget *Replace_(CYContext &context, CYTarget *type) = 0;
2211 CYTarget *Replace(CYContext &context, CYTarget *type);
2213 virtual void Output(CYOutput &out, CYPropertyName *name) const = 0;
2214 void Output(CYOutput &out, int precedence, CYPropertyName *name, bool space) const;
2216 virtual CYTypeFunctionWith *Function() { return NULL; }
2219 struct CYTypeArrayOf :
2222 CYExpression *size_;
2224 CYTypeArrayOf(CYExpression *size, CYTypeModifier *next = NULL) :
2225 CYTypeModifier(next),
2232 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
2233 void Output(CYOutput &out, CYPropertyName *name) const override;
2236 struct CYTypeConstant :
2239 CYTypeConstant(CYTypeModifier *next = NULL) :
2240 CYTypeModifier(next)
2246 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
2247 void Output(CYOutput &out, CYPropertyName *name) const override;
2250 struct CYTypePointerTo :
2253 CYTypePointerTo(CYTypeModifier *next = NULL) :
2254 CYTypeModifier(next)
2260 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
2261 void Output(CYOutput &out, CYPropertyName *name) const override;
2264 struct CYTypeVolatile :
2267 CYTypeVolatile(CYTypeModifier *next = NULL) :
2268 CYTypeModifier(next)
2274 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
2275 void Output(CYOutput &out, CYPropertyName *name) const override;
2281 CYTypeSpecifier *specifier_;
2282 CYTypeModifier *modifier_;
2284 CYType(CYTypeSpecifier *specifier = NULL, CYTypeModifier *modifier = NULL) :
2285 specifier_(specifier),
2290 inline CYType *Modify(CYTypeModifier *modifier) {
2291 CYSetLast(modifier_) = modifier;
2295 void Output(CYOutput &out, CYPropertyName *name) const;
2297 virtual CYTarget *Replace(CYContext &context);
2298 virtual void Output(CYOutput &out) const;
2300 CYTypeFunctionWith *Function();
2303 struct CYTypedLocation :
2306 CYLocation location_;
2308 CYTypedLocation(const CYLocation &location) :
2314 struct CYTypedName :
2317 CYPropertyName *name_;
2319 CYTypedName(const CYLocation &location, CYPropertyName *name = NULL) :
2320 CYTypedLocation(location),
2326 struct CYEncodedType :
2331 CYEncodedType(CYType *typed) :
2338 virtual CYTarget *Replace(CYContext &context);
2339 virtual void Output(CYOutput &out, CYFlags flags) const;
2342 struct CYTypedParameter :
2343 CYNext<CYTypedParameter>,
2347 CYIdentifier *name_;
2349 CYTypedParameter(CYType *type, CYIdentifier *name, CYTypedParameter *next = NULL) :
2350 CYNext<CYTypedParameter>(next),
2356 CYArgument *Argument(CYContext &context);
2357 CYFunctionParameter *Parameters(CYContext &context);
2358 CYExpression *TypeSignature(CYContext &context, CYExpression *prefix);
2360 virtual void Output(CYOutput &out) const;
2363 struct CYTypedFormal {
2365 CYTypedParameter *parameters_;
2367 CYTypedFormal(bool variadic) :
2368 variadic_(variadic),
2378 CYTypedParameter *parameters_;
2381 CYLambda(CYType *typed, CYTypedParameter *parameters, CYStatement *code) :
2383 parameters_(parameters),
2390 virtual CYTarget *Replace(CYContext &context);
2391 virtual void Output(CYOutput &out, CYFlags flags) const;
2400 CYModule(CYWord *part, CYModule *next = NULL) :
2401 CYNext<CYModule>(next),
2406 CYString *Replace(CYContext &context, const char *separator) const;
2407 void Output(CYOutput &out) const;
2415 CYImport(CYModule *module) :
2422 virtual CYStatement *Replace(CYContext &context);
2423 virtual void Output(CYOutput &out, CYFlags flags) const;
2426 struct CYImportSpecifier :
2427 CYNext<CYImportSpecifier>
2430 CYIdentifier *binding_;
2432 CYImportSpecifier(CYWord *name, CYIdentifier *binding) :
2438 CYStatement *Replace(CYContext &context, CYIdentifier *module);
2441 struct CYImportDeclaration :
2444 CYImportSpecifier *specifiers_;
2447 CYImportDeclaration(CYImportSpecifier *specifiers, CYString *module) :
2448 specifiers_(specifiers),
2455 virtual CYStatement *Replace(CYContext &context);
2456 virtual void Output(CYOutput &out, CYFlags flags) const;
2459 struct CYExternalExpression :
2464 CYPropertyName *name_;
2466 CYExternalExpression(CYString *abi, CYType *type, CYPropertyName *name) :
2475 virtual CYTarget *Replace(CYContext &context);
2476 virtual void Output(CYOutput &out, CYFlags flags) const;
2479 struct CYExternalDefinition :
2484 CYIdentifier *name_;
2486 CYExternalDefinition(CYString *abi, CYType *type, CYIdentifier *name) :
2495 virtual CYStatement *Replace(CYContext &context);
2496 virtual void Output(CYOutput &out, CYFlags flags) const;
2499 struct CYTypeExpression :
2504 CYTypeExpression(CYType *typed) :
2511 virtual CYTarget *Replace(CYContext &context);
2512 virtual void Output(CYOutput &out, CYFlags flags) const;
2515 struct CYTypeDefinition :
2519 CYIdentifier *name_;
2521 CYTypeDefinition(CYType *type, CYIdentifier *name) :
2529 virtual CYStatement *Replace(CYContext &context);
2530 virtual void Output(CYOutput &out, CYFlags flags) const;
2533 struct CYTypeBlockWith :
2536 CYTypedParameter *parameters_;
2538 CYTypeBlockWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
2539 CYTypeModifier(next),
2540 parameters_(parameters)
2546 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
2547 void Output(CYOutput &out, CYPropertyName *name) const override;
2550 struct CYTypeFunctionWith :
2554 CYTypedParameter *parameters_;
2556 CYTypeFunctionWith(bool variadic, CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
2557 CYTypeModifier(next),
2558 variadic_(variadic),
2559 parameters_(parameters)
2565 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
2566 void Output(CYOutput &out, CYPropertyName *name) const override;
2568 virtual CYTypeFunctionWith *Function() { return this; }
2571 struct CYTypeStructField :
2572 CYNext<CYTypeStructField>
2575 CYPropertyName *name_;
2577 CYTypeStructField(CYType *type, CYPropertyName *name, CYTypeStructField *next = NULL) :
2578 CYNext<CYTypeStructField>(next),
2585 struct CYStructTail :
2588 CYTypeStructField *fields_;
2590 CYStructTail(CYTypeStructField *fields) :
2595 CYTarget *Replace(CYContext &context);
2596 virtual void Output(CYOutput &out) const;
2599 struct CYTypeStruct :
2602 CYIdentifier *name_;
2603 CYStructTail *tail_;
2605 CYTypeStruct(CYIdentifier *name, CYStructTail *tail) :
2611 virtual CYTarget *Replace(CYContext &context);
2612 virtual void Output(CYOutput &out) const;
2615 struct CYStructDefinition :
2618 CYIdentifier *name_;
2619 CYStructTail *tail_;
2621 CYStructDefinition(CYIdentifier *name, CYStructTail *tail) :
2629 virtual CYStatement *Replace(CYContext &context);
2630 virtual void Output(CYOutput &out, CYFlags flags) const;
2633 struct CYEnumConstant :
2634 CYNext<CYEnumConstant>
2636 CYIdentifier *name_;
2639 CYEnumConstant(CYIdentifier *name, CYNumber *value, CYEnumConstant *next = NULL) :
2640 CYNext<CYEnumConstant>(next),
2650 CYIdentifier *name_;
2651 CYTypeSpecifier *specifier_;
2652 CYEnumConstant *constants_;
2654 CYTypeEnum(CYIdentifier *name, CYTypeSpecifier *specifier, CYEnumConstant *constants) :
2656 specifier_(specifier),
2657 constants_(constants)
2661 virtual CYTarget *Replace(CYContext &context);
2662 virtual void Output(CYOutput &out) const;
2671 CYIdentifier *name_;
2674 Catch(CYIdentifier *name, CYStatement *code) :
2680 void Replace(CYContext &context);
2681 virtual void Output(CYOutput &out) const;
2689 CYFinally *finally_;
2691 Try(CYStatement *code, Catch *_catch, CYFinally *finally) :
2700 virtual CYStatement *Replace(CYContext &context);
2701 virtual void Output(CYOutput &out, CYFlags flags) const;
2707 CYExpression *value_;
2709 Throw(CYExpression *value = NULL) :
2716 virtual CYStatement *Replace(CYContext &context);
2717 virtual void Output(CYOutput &out, CYFlags flags) const;
2725 CYExpression *scope_;
2728 CYWith(CYExpression *scope, CYStatement *code) :
2736 virtual CYStatement *Replace(CYContext &context);
2737 virtual void Output(CYOutput &out, CYFlags flags) const;
2743 CYExpression *value_;
2746 CYSwitch(CYExpression *value, CYClause *clauses) :
2754 virtual CYStatement *Replace(CYContext &context);
2755 virtual void Output(CYOutput &out, CYFlags flags) const;
2767 virtual CYStatement *Replace(CYContext &context);
2768 virtual void Output(CYOutput &out, CYFlags flags) const;
2771 struct CYCondition :
2774 CYExpression *test_;
2775 CYExpression *true_;
2776 CYExpression *false_;
2778 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
2787 virtual CYExpression *Replace(CYContext &context);
2788 virtual void Output(CYOutput &out, CYFlags flags) const;
2791 struct CYAddressOf :
2794 CYAddressOf(CYExpression *rhs) :
2799 virtual const char *Operator() const {
2805 virtual CYExpression *Replace(CYContext &context);
2813 CYIndirect(CYExpression *rhs) :
2818 // XXX: this should be checked
2821 virtual CYTarget *Replace(CYContext &context);
2822 virtual void Output(CYOutput &out, CYFlags flags) const;
2826 virtual CYExpression *Replace(CYContext &context);
2828 #define CYPostfix_(op, name, args...) \
2829 struct CY ## name : \
2832 CY ## name(CYExpression *lhs) : \
2837 virtual const char *Operator() const { \
2842 #define CYPrefix_(alphabetic, op, name, args...) \
2843 struct CY ## name : \
2846 CY ## name(CYExpression *rhs) : \
2851 CYAlphabetic(alphabetic) \
2853 virtual const char *Operator() const { \
2858 #define CYInfix_(alphabetic, precedence, op, name, args...) \
2859 struct CY ## name : \
2862 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
2867 CYAlphabetic(alphabetic) \
2868 CYPrecedence(precedence) \
2870 virtual const char *Operator() const { \
2875 #define CYAssignment_(op, name, args...) \
2876 struct CY ## name ## Assign : \
2879 CY ## name ## Assign(CYTarget *lhs, CYExpression *rhs) : \
2880 CYAssignment(lhs, rhs) \
2884 virtual const char *Operator() const { \
2889 CYPostfix_("++", PostIncrement)
2890 CYPostfix_("--", PostDecrement)
2892 CYPrefix_(true, "delete", Delete)
2893 CYPrefix_(true, "void", Void)
2894 CYPrefix_(true, "typeof", TypeOf)
2895 CYPrefix_(false, "++", PreIncrement)
2896 CYPrefix_(false, "--", PreDecrement)
2897 CYPrefix_(false, "+", Affirm)
2898 CYPrefix_(false, "-", Negate)
2899 CYPrefix_(false, "~", BitwiseNot)
2900 CYPrefix_(false, "!", LogicalNot)
2902 CYInfix_(false, 5, "*", Multiply, CYReplace)
2903 CYInfix_(false, 5, "/", Divide)
2904 CYInfix_(false, 5, "%", Modulus)
2905 CYInfix_(false, 6, "+", Add, CYReplace)
2906 CYInfix_(false, 6, "-", Subtract)
2907 CYInfix_(false, 7, "<<", ShiftLeft)
2908 CYInfix_(false, 7, ">>", ShiftRightSigned)
2909 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
2910 CYInfix_(false, 8, "<", Less)
2911 CYInfix_(false, 8, ">", Greater)
2912 CYInfix_(false, 8, "<=", LessOrEqual)
2913 CYInfix_(false, 8, ">=", GreaterOrEqual)
2914 CYInfix_(true, 8, "instanceof", InstanceOf)
2915 CYInfix_(true, 8, "in", In)
2916 CYInfix_(false, 9, "==", Equal)
2917 CYInfix_(false, 9, "!=", NotEqual)
2918 CYInfix_(false, 9, "===", Identical)
2919 CYInfix_(false, 9, "!==", NotIdentical)
2920 CYInfix_(false, 10, "&", BitwiseAnd)
2921 CYInfix_(false, 11, "^", BitwiseXOr)
2922 CYInfix_(false, 12, "|", BitwiseOr)
2923 CYInfix_(false, 13, "&&", LogicalAnd)
2924 CYInfix_(false, 14, "||", LogicalOr)
2926 CYAssignment_("=", )
2927 CYAssignment_("*=", Multiply)
2928 CYAssignment_("/=", Divide)
2929 CYAssignment_("%=", Modulus)
2930 CYAssignment_("+=", Add)
2931 CYAssignment_("-=", Subtract)
2932 CYAssignment_("<<=", ShiftLeft)
2933 CYAssignment_(">>=", ShiftRightSigned)
2934 CYAssignment_(">>>=", ShiftRightUnsigned)
2935 CYAssignment_("&=", BitwiseAnd)
2936 CYAssignment_("^=", BitwiseXOr)
2937 CYAssignment_("|=", BitwiseOr)
2939 #endif/*CYCRIPT_PARSER_HPP*/