1 /* Cycript - Optimizing JavaScript Compiler/Runtime
 
   2  * Copyright (C) 2009-2015  Jay Freeman (saurik)
 
   5 /* GNU Affero General Public License, Version 3 {{{ */
 
   7  * This program is free software: you can redistribute it and/or modify
 
   8  * it under the terms of the GNU Affero General Public License as published by
 
   9  * the Free Software Foundation, either version 3 of the License, or
 
  10  * (at your option) any later version.
 
  12  * This program is distributed in the hope that it will be useful,
 
  13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  15  * GNU Affero General Public License for more details.
 
  17  * You should have received a copy of the GNU Affero General Public License
 
  18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
  22 #ifndef CYCRIPT_PARSER_HPP
 
  23 #define CYCRIPT_PARSER_HPP
 
  36 #include "Location.hpp"
 
  37 #include "Pooling.hpp"
 
  38 #include "Options.hpp"
 
  46     virtual void Output(struct CYOutput &out) const = 0;
 
  64     CYOutput(std::ostream &out, CYOptions &options) :
 
  74     void Check(char value);
 
  77     CYOutput &operator <<(char rhs);
 
  78     CYOutput &operator <<(const char *rhs);
 
  80     _finline CYOutput &operator <<(const CYThing *rhs) {
 
  86     _finline CYOutput &operator <<(const CYThing &rhs) {
 
  92 struct CYPropertyName {
 
  93     virtual void PropertyName(CYOutput &out) const = 0;
 
  95     virtual ~CYPropertyName() {
 
 110     CYNoBrace =      (1 << 0),
 
 111     CYNoFunction =   (1 << 1),
 
 114     CYNoRightHand =  (1 << 4),
 
 115     CYNoDangle =     (1 << 5),
 
 116     CYNoInteger =    (1 << 6),
 
 117     CYNoBF =         (CYNoBrace | CYNoFunction),
 
 120 _finline CYFlags operator ~(CYFlags rhs) {
 
 121     return static_cast<CYFlags>(~static_cast<unsigned>(rhs));
 
 124 _finline CYFlags operator &(CYFlags lhs, CYFlags rhs) {
 
 125     return static_cast<CYFlags>(static_cast<unsigned>(lhs) & static_cast<unsigned>(rhs));
 
 128 _finline CYFlags operator |(CYFlags lhs, CYFlags rhs) {
 
 129     return static_cast<CYFlags>(static_cast<unsigned>(lhs) | static_cast<unsigned>(rhs));
 
 132 _finline CYFlags &operator |=(CYFlags &lhs, CYFlags rhs) {
 
 133     return lhs = lhs | rhs;
 
 136 _finline CYFlags CYLeft(CYFlags flags) {
 
 137     return flags & ~(CYNoDangle | CYNoInteger);
 
 140 _finline CYFlags CYRight(CYFlags flags) {
 
 141     return flags & ~CYNoBF;
 
 144 _finline CYFlags CYCenter(CYFlags flags) {
 
 145     return CYLeft(CYRight(flags));
 
 151     virtual ~CYStatement() {
 
 154     void Single(CYOutput &out, CYFlags flags) const;
 
 155     void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
 
 157     virtual CYStatement *Replace(CYContext &context) = 0;
 
 160     virtual void Output(CYOutput &out, CYFlags flags) const = 0;
 
 163 struct CYStatements {
 
 173     operator CYStatement *() const {
 
 177     CYStatements &operator ->*(CYStatement *next) {
 
 179             if (first_ == NULL) {
 
 182             } else for (;; last_ = last_->next_)
 
 183                 if (last_->next_ == NULL) {
 
 193     virtual ~CYClassName() {
 
 196     virtual CYExpression *ClassName(CYContext &context, bool object) = 0;
 
 197     virtual void ClassName(CYOutput &out, bool object) const = 0;
 
 207     CYWord(const char *word) :
 
 212     void Set(const char *value) {
 
 216     virtual const char *Word() const;
 
 217     virtual void Output(CYOutput &out) const;
 
 219     virtual CYExpression *ClassName(CYContext &context, bool object);
 
 220     virtual void ClassName(CYOutput &out, bool object) const;
 
 221     virtual void PropertyName(CYOutput &out) const;
 
 224 _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
 
 226     return lhs << rhs.Word();
 
 229 struct CYIdentifier :
 
 230     CYNext<CYIdentifier>,
 
 233     CYIdentifier *replace_;
 
 237     CYIdentifier(const char *word) :
 
 245     virtual const char *Word() const;
 
 246     CYIdentifier *Replace(CYContext &context);
 
 254     CYComment(const char *value) :
 
 259     virtual CYStatement *Replace(CYContext &context);
 
 260     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 267     CYStatement *statement_;
 
 269     CYLabel(CYIdentifier *name, CYStatement *statement) :
 
 271         statement_(statement)
 
 275     virtual CYStatement *Replace(CYContext &context);
 
 276     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 279 struct CYCStringLess :
 
 280     std::binary_function<const char *, const char *, bool>
 
 282     _finline bool operator ()(const char *lhs, const char *rhs) const {
 
 283         return strcmp(lhs, rhs) < 0;
 
 287 struct CYIdentifierValueLess :
 
 288     std::binary_function<CYIdentifier *, CYIdentifier *, bool>
 
 290     _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
 
 291         return CYCStringLess()(lhs->Word(), rhs->Word());
 
 295 enum CYIdentifierFlags {
 
 296     CYIdentifierArgument,
 
 297     CYIdentifierVariable,
 
 303 typedef std::set<const char *, CYCStringLess> CYCStringSet;
 
 304 typedef std::set<CYIdentifier *, CYIdentifierValueLess> CYIdentifierValueSet;
 
 305 typedef std::map<CYIdentifier *, CYIdentifierFlags> CYIdentifierAddressFlagsMap;
 
 307 struct CYIdentifierUsage {
 
 308     CYIdentifier *identifier_;
 
 312 typedef std::vector<CYIdentifierUsage> CYIdentifierUsageVector;
 
 318     CYStatement *&statements_;
 
 322     CYIdentifierAddressFlagsMap internal_;
 
 323     CYIdentifierValueSet identifiers_;
 
 325     CYScope(bool transparent, CYContext &context, CYStatement *&statements);
 
 330     void Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags);
 
 331     virtual CYIdentifier *Lookup(CYContext &context, CYIdentifier *identifier);
 
 332     void Merge(CYContext &context, CYIdentifier *identifier);
 
 333     void Scope(CYContext &context, CYStatement *&statements);
 
 339     CYStatement *statements_;
 
 341     CYProgram(CYStatement *statements) :
 
 342         statements_(statements)
 
 346     virtual void Replace(CYContext &context);
 
 347     virtual void Output(CYOutput &out) const;
 
 359     CYIdentifierUsageVector rename_;
 
 361     CYNonLocal *nonlocal_;
 
 362     CYNonLocal *nextlocal_;
 
 365     CYContext(CYOptions &options) :
 
 375     virtual ~CYContext() {
 
 378     template <typename Type_>
 
 379     void ReplaceAll(Type_ *&values) {
 
 380         Type_ **last(&values);
 
 381         CYForEach (next, values) {
 
 382             Replace(*last = next);
 
 384                 last = &(*last)->next_;
 
 388     template <typename Type_>
 
 389     void Replace(Type_ *&value) {
 
 390         for (;;) if (value == NULL)
 
 393             Type_ *replace(value->Replace(*this));
 
 394             if (replace != value)
 
 400     void NonLocal(CYStatement *&statements);
 
 401     CYIdentifier *Unique();
 
 405     CYIdentifier *identifier_;
 
 412     CYIdentifier *Target(CYContext &context) {
 
 413         if (identifier_ == NULL)
 
 414             identifier_ = context.Unique();
 
 422     CYIdentifier *identifier_;
 
 429     CYIdentifier *Identifier(CYContext &context) {
 
 431             return next_->Identifier(context);
 
 432         if (identifier_ == NULL)
 
 433             identifier_ = context.Unique();
 
 442     CYStatement *statements_;
 
 444     CYBlock(CYStatement *statements) :
 
 445         statements_(statements)
 
 449     operator CYStatement *() const {
 
 453     void AddPrev(CYStatement *statement) {
 
 454         CYSetLast(statement) = statements_;
 
 455         statements_ = statement;
 
 458     virtual CYStatement *Replace(CYContext &context);
 
 460     virtual void Output(CYOutput &out) const;
 
 461     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 464 struct CYForInitialiser {
 
 465     virtual ~CYForInitialiser() {
 
 468     virtual CYExpression *Replace(CYContext &context) = 0;
 
 469     virtual void Output(CYOutput &out, CYFlags flags) const = 0;
 
 472 struct CYForInInitialiser {
 
 473     virtual ~CYForInInitialiser() {
 
 476     virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
 
 477     virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value) = 0;
 
 479     virtual CYExpression *Replace(CYContext &context) = 0;
 
 480     virtual CYAssignment *Assignment(CYContext &context) = 0;
 
 482     virtual void Output(CYOutput &out, CYFlags flags) const = 0;
 
 485 struct CYFunctionParameter;
 
 490 struct CYExpression :
 
 496     virtual int Precedence() const = 0;
 
 498     virtual bool RightHand() const {
 
 502     virtual void ForIn(CYOutput &out, CYFlags flags) const;
 
 503     virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
 
 505     virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
 
 507     virtual void Output(CYOutput &out) const;
 
 508     virtual void Output(CYOutput &out, CYFlags flags) const = 0;
 
 509     void Output(CYOutput &out, int precedence, CYFlags flags) const;
 
 511     virtual CYExpression *ClassName(CYContext &context, bool object);
 
 512     virtual void ClassName(CYOutput &out, bool object) const;
 
 514     virtual CYExpression *Replace(CYContext &context) = 0;
 
 515     virtual CYAssignment *Assignment(CYContext &context);
 
 517     virtual CYExpression *Primitive(CYContext &context) {
 
 521     virtual CYFunctionParameter *Parameter() const;
 
 522     virtual CYFunctionParameter *Parameters() const;
 
 524     virtual CYNumber *Number(CYContext &context) {
 
 528     virtual CYString *String(CYContext &context) {
 
 532     virtual const char *Word() const {
 
 537 #define CYAlphabetic(value) \
 
 538     virtual bool Alphabetic() const { \
 
 542 #define CYPrecedence(value) \
 
 543     static const int Precedence_ = value; \
 
 544     virtual int Precedence() const { \
 
 545         return Precedence_; \
 
 548 #define CYRightHand(value) \
 
 549     virtual bool RightHand() const { \
 
 556     CYExpression *expression_;
 
 559     CYCompound(CYExpression *expression, CYExpression *next = NULL) :
 
 560         expression_(expression),
 
 563         if (expression_ == NULL)
 
 565         _assert(expression_ != NULL);
 
 570     virtual CYExpression *Replace(CYContext &context);
 
 571     void Output(CYOutput &out, CYFlags flags) const;
 
 573     virtual CYExpression *Primitive(CYContext &context);
 
 574     virtual CYFunctionParameter *Parameters() const;
 
 577 struct CYDeclaration;
 
 579 struct CYFunctionParameter :
 
 580     CYNext<CYFunctionParameter>,
 
 583     CYForInInitialiser *initialiser_;
 
 585     CYFunctionParameter(CYForInInitialiser *initialiser, CYFunctionParameter *next = NULL) :
 
 586         CYNext<CYFunctionParameter>(next),
 
 587         initialiser_(initialiser)
 
 591     void Replace(CYContext &context, CYBlock &code);
 
 592     void Output(CYOutput &out) const;
 
 595 struct CYComprehension :
 
 596     CYNext<CYComprehension>,
 
 599     CYComprehension(CYComprehension *next = NULL) :
 
 600         CYNext<CYComprehension>(next)
 
 604     CYComprehension *Modify(CYComprehension *next) {
 
 609     virtual const char *Name() const = 0;
 
 611     virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
 
 612     CYFunctionParameter *Parameters(CYContext &context) const;
 
 613     virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
 
 614     virtual void Output(CYOutput &out) const = 0;
 
 617 struct CYForInComprehension :
 
 623     CYForInComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
 
 624         CYComprehension(next),
 
 630     virtual const char *Name() const {
 
 631         return name_->Word();
 
 634     virtual CYFunctionParameter *Parameter(CYContext &context) const;
 
 635     virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
 
 636     virtual void Output(CYOutput &out) const;
 
 639 struct CYForOfComprehension :
 
 645     CYForOfComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
 
 646         CYComprehension(next),
 
 652     virtual const char *Name() const {
 
 653         return name_->Word();
 
 656     virtual CYFunctionParameter *Parameter(CYContext &context) const;
 
 657     virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
 
 658     virtual void Output(CYOutput &out) const;
 
 661 struct CYIfComprehension :
 
 666     CYIfComprehension(CYExpression *test, CYComprehension *next = NULL) :
 
 667         CYComprehension(next),
 
 672     virtual const char *Name() const {
 
 676     virtual CYFunctionParameter *Parameter(CYContext &context) const;
 
 677     virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
 
 678     virtual void Output(CYOutput &out) const;
 
 681 struct CYArrayComprehension :
 
 684     CYExpression *expression_;
 
 685     CYComprehension *comprehensions_;
 
 687     CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
 
 688         expression_(expression),
 
 689         comprehensions_(comprehensions)
 
 695     virtual CYExpression *Replace(CYContext &context);
 
 696     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 705     virtual CYExpression *Primitive(CYContext &context) {
 
 713     virtual CYExpression *Replace(CYContext &context);
 
 727     CYRange(uint64_t lo, uint64_t hi) :
 
 732     bool operator [](uint8_t value) const {
 
 733         return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
 
 736     void operator()(uint8_t value) {
 
 739         (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
 
 743 extern CYRange DigitRange_;
 
 744 extern CYRange WordStartRange_;
 
 745 extern CYRange WordEndRange_;
 
 760     CYString(const char *value) :
 
 766     CYString(const char *value, size_t size) :
 
 772     CYString(const CYWord *word) :
 
 773         value_(word->Word()),
 
 774         size_(strlen(value_))
 
 778     const char *Value() const {
 
 782     virtual const char *Word() const;
 
 784     virtual CYNumber *Number(CYContext &context);
 
 785     virtual CYString *String(CYContext &context);
 
 787     CYString *Concat(CYContext &out, CYString *rhs) const;
 
 788     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 789     virtual void PropertyName(CYOutput &out) const;
 
 798     CYNumber(double value) :
 
 803     double Value() const {
 
 807     virtual CYNumber *Number(CYContext &context);
 
 808     virtual CYString *String(CYContext &context);
 
 810     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 811     virtual void PropertyName(CYOutput &out) const;
 
 819     CYRegEx(const char *value) :
 
 824     const char *Value() const {
 
 828     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 840     virtual CYNumber *Number(CYContext &context);
 
 841     virtual CYString *String(CYContext &context);
 
 843     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 855     virtual CYExpression *Replace(CYContext &context);
 
 856     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 862     virtual bool Value() const = 0;
 
 863     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 875     virtual bool Value() const {
 
 879     virtual CYNumber *Number(CYContext &context);
 
 880     virtual CYString *String(CYContext &context);
 
 892     virtual bool Value() const {
 
 896     virtual CYNumber *Number(CYContext &context);
 
 897     virtual CYString *String(CYContext &context);
 
 905     CYVariable(CYIdentifier *name) :
 
 910     CYVariable(const char *name) :
 
 911         name_(new($pool) CYIdentifier(name))
 
 918     virtual CYExpression *Replace(CYContext &context);
 
 919     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 921     virtual CYFunctionParameter *Parameter() const;
 
 929     CYPrefix(CYExpression *rhs) :
 
 934     virtual bool Alphabetic() const = 0;
 
 935     virtual const char *Operator() const = 0;
 
 939     virtual CYExpression *Replace(CYContext &context);
 
 940     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 949     CYInfix(CYExpression *lhs, CYExpression *rhs) :
 
 955     void SetLeft(CYExpression *lhs) {
 
 959     virtual bool Alphabetic() const = 0;
 
 960     virtual const char *Operator() const = 0;
 
 962     virtual CYExpression *Replace(CYContext &context);
 
 963     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 971     CYPostfix(CYExpression *lhs) :
 
 976     virtual const char *Operator() const = 0;
 
 980     virtual CYExpression *Replace(CYContext &context);
 
 981     virtual void Output(CYOutput &out, CYFlags flags) const;
 
 984 struct CYAssignment :
 
 990     CYAssignment(CYExpression *lhs, CYExpression *rhs) :
 
 996     void SetLeft(CYExpression *lhs) {
 
1000     virtual const char *Operator() const = 0;
 
1004     virtual CYExpression *Replace(CYContext &context);
 
1005     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1013     CYExpression *value_;
 
1015     CYArgument(CYExpression *value, CYArgument *next = NULL) :
 
1016         CYNext<CYArgument>(next),
 
1022     CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
 
1023         CYNext<CYArgument>(next),
 
1029     CYArgument *Replace(CYContext &context);
 
1030     void Output(CYOutput &out) const;
 
1046     CYExpression *case_;
 
1047     CYStatement *statements_;
 
1049     CYClause(CYExpression *_case, CYStatement *statements) :
 
1051         statements_(statements)
 
1055     void Replace(CYContext &context);
 
1056     virtual void Output(CYOutput &out) const;
 
1063     CYExpression *value_;
 
1065     CYElement(CYExpression *value, CYElement *next) :
 
1066         CYNext<CYElement>(next),
 
1071     void Replace(CYContext &context);
 
1072     void Output(CYOutput &out) const;
 
1078     CYElement *elements_;
 
1080     CYArray(CYElement *elements = NULL) :
 
1085     virtual CYExpression *Replace(CYContext &context);
 
1086     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1093     CYPropertyName *name_;
 
1094     CYExpression *value_;
 
1096     CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
 
1097         CYNext<CYProperty>(next),
 
1103     void Replace(CYContext &context);
 
1104     virtual void Output(CYOutput &out) const;
 
1107 struct CYDeclaration :
 
1110     CYIdentifier *identifier_;
 
1111     CYExpression *initialiser_;
 
1113     CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
 
1114         identifier_(identifier),
 
1115         initialiser_(initialiser)
 
1119     virtual void ForIn(CYOutput &out, CYFlags flags) const;
 
1120     virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
 
1122     virtual CYExpression *Replace(CYContext &context);
 
1124     virtual CYAssignment *Assignment(CYContext &context);
 
1125     CYVariable *Variable(CYContext &context);
 
1127     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1130 struct CYDeclarations :
 
1131     CYNext<CYDeclarations>,
 
1134     CYDeclaration *declaration_;
 
1136     CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
 
1137         CYNext<CYDeclarations>(next),
 
1138         declaration_(declaration)
 
1142     void Replace(CYContext &context);
 
1144     CYCompound *Compound(CYContext &context);
 
1145     CYProperty *Property(CYContext &context);
 
1146     CYArgument *Argument(CYContext &context);
 
1147     CYFunctionParameter *Parameter(CYContext &context);
 
1149     virtual void Output(CYOutput &out) const;
 
1150     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1153 struct CYForDeclarations :
 
1156     CYDeclarations *declarations_;
 
1158     CYForDeclarations(CYDeclarations *declarations) :
 
1159         declarations_(declarations)
 
1163     virtual CYCompound *Replace(CYContext &context);
 
1164     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1170     CYDeclarations *declarations_;
 
1172     CYVar(CYDeclarations *declarations) :
 
1173         declarations_(declarations)
 
1177     virtual CYStatement *Replace(CYContext &context);
 
1178     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1181 struct CYLetStatement :
 
1184     CYDeclarations *declarations_;
 
1187     CYLetStatement(CYDeclarations *declarations, CYStatement *code) :
 
1188         declarations_(declarations),
 
1193     virtual CYStatement *Replace(CYContext &context);
 
1194     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1200     CYForInitialiser *initialiser_;
 
1201     CYExpression *test_;
 
1202     CYExpression *increment_;
 
1205     CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
 
1206         initialiser_(initialiser),
 
1208         increment_(increment),
 
1213     virtual CYStatement *Replace(CYContext &context);
 
1214     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1220     CYForInInitialiser *initialiser_;
 
1224     CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
 
1225         initialiser_(initialiser),
 
1231     virtual CYStatement *Replace(CYContext &context);
 
1232     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1238     CYForInInitialiser *initialiser_;
 
1242     CYForOf(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
 
1243         initialiser_(initialiser),
 
1249     virtual CYStatement *Replace(CYContext &context);
 
1250     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1256     CYProperty *properties_;
 
1258     CYObject(CYProperty *properties = NULL) :
 
1259         properties_(properties)
 
1263     virtual CYExpression *Replace(CYContext &context);
 
1264     void Output(CYOutput &out, CYFlags flags) const;
 
1270     CYExpression *object_;
 
1271     CYExpression *property_;
 
1273     CYMember(CYExpression *object, CYExpression *property) :
 
1279     void SetLeft(CYExpression *object) {
 
1284 struct CYDirectMember :
 
1287     CYDirectMember(CYExpression *object, CYExpression *property) :
 
1288         CYMember(object, property)
 
1295     virtual CYExpression *Replace(CYContext &context);
 
1296     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1299 struct CYIndirectMember :
 
1302     CYIndirectMember(CYExpression *object, CYExpression *property) :
 
1303         CYMember(object, property)
 
1310     virtual CYExpression *Replace(CYContext &context);
 
1311     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1320     CYExpression *constructor_;
 
1321     CYArgument *arguments_;
 
1323     New(CYExpression *constructor, CYArgument *arguments) :
 
1324         constructor_(constructor),
 
1325         arguments_(arguments)
 
1329     virtual int Precedence() const {
 
1330         return arguments_ == NULL ? 2 : 1;
 
1335     virtual CYExpression *Replace(CYContext &context);
 
1336     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1338     virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
 
1346     CYExpression *function_;
 
1347     CYArgument *arguments_;
 
1349     CYCall(CYExpression *function, CYArgument *arguments = NULL) :
 
1350         function_(function),
 
1351         arguments_(arguments)
 
1358     virtual CYExpression *Replace(CYContext &context);
 
1359     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1361     virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
 
1366 struct CYRubyBlock :
 
1369     CYExpression *call_;
 
1372     CYRubyBlock(CYExpression *call, CYRubyProc *proc) :
 
1381     virtual CYExpression *Replace(CYContext &context);
 
1382     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1388     CYExpression *test_;
 
1390     CYStatement *false_;
 
1392     CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
 
1399     virtual CYStatement *Replace(CYContext &context);
 
1400     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1406     CYExpression *test_;
 
1409     CYDoWhile(CYExpression *test, CYStatement *code) :
 
1415     virtual CYStatement *Replace(CYContext &context);
 
1416     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1422     CYExpression *test_;
 
1425     CYWhile(CYExpression *test, CYStatement *code) :
 
1431     virtual CYStatement *Replace(CYContext &context);
 
1432     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1435 // XXX: this should be split up into CYAnonymousFunction and CYNamedFunction (subclass)
 
1437     CYIdentifier *name_;
 
1438     CYFunctionParameter *parameters_;
 
1441     CYNonLocal *nonlocal_;
 
1444     CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
 
1446         parameters_(parameters),
 
1452     virtual ~CYFunction() {
 
1455     void Inject(CYContext &context);
 
1456     virtual void Replace_(CYContext &context, bool outer);
 
1457     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1460 // XXX: this should be split up into CYAnonymousFunctionExpression and CYNamedFunctionExpression
 
1461 struct CYFunctionExpression :
 
1465     CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
 
1466         CYFunction(name, parameters, statements)
 
1473     virtual CYExpression *Replace(CYContext &context);
 
1474     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1477 // XXX: this should derive from CYAnonymousFunction
 
1482     CYFatArrow(CYFunctionParameter *parameters, CYStatement *statements) :
 
1483         CYFunction(NULL, parameters, statements)
 
1490     virtual CYExpression *Replace(CYContext &context);
 
1491     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1494 // XXX: this should derive from CYAnonymousFunctionExpression
 
1496     CYFunctionExpression
 
1498     CYRubyProc(CYFunctionParameter *parameters, CYStatement *statements) :
 
1499         CYFunctionExpression(NULL, parameters, statements)
 
1503     virtual CYExpression *Replace(CYContext &context);
 
1504     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1507 // XXX: this should derive from CYNamedFunction
 
1508 struct CYFunctionStatement :
 
1512     CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
 
1513         CYFunction(name, parameters, statements)
 
1517     virtual CYStatement *Replace(CYContext &context);
 
1518     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1524     CYExpression *expression_;
 
1526     CYExpress(CYExpression *expression) :
 
1527         expression_(expression)
 
1529         if (expression_ == NULL)
 
1533     virtual CYStatement *Replace(CYContext &context);
 
1534     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1540     CYIdentifier *label_;
 
1542     CYContinue(CYIdentifier *label) :
 
1547     virtual CYStatement *Replace(CYContext &context);
 
1548     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1554     CYIdentifier *label_;
 
1556     CYBreak(CYIdentifier *label) :
 
1561     virtual CYStatement *Replace(CYContext &context);
 
1562     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1568     CYExpression *value_;
 
1570     CYReturn(CYExpression *value) :
 
1575     virtual CYStatement *Replace(CYContext &context);
 
1576     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1582     virtual CYStatement *Replace(CYContext &context);
 
1583     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1591     CYFinally(CYStatement *statements) :
 
1596     void Replace(CYContext &context);
 
1597     virtual void Output(CYOutput &out) const;
 
1600 struct CYTypeSpecifier :
 
1603     virtual CYExpression *Replace(CYContext &context) = 0;
 
1606 struct CYTypeError :
 
1612     virtual CYExpression *Replace(CYContext &context);
 
1613     virtual void Output(CYOutput &out) const;
 
1622     virtual CYExpression *Replace(CYContext &context);
 
1623     virtual void Output(CYOutput &out) const;
 
1626 struct CYTypeVariable :
 
1629     CYIdentifier *name_;
 
1631     CYTypeVariable(CYIdentifier *name) :
 
1636     CYTypeVariable(const char *name) :
 
1637         name_(new($pool) CYIdentifier(name))
 
1641     virtual CYExpression *Replace(CYContext &context);
 
1642     virtual void Output(CYOutput &out) const;
 
1645 struct CYTypeUnsigned :
 
1648     CYTypeSpecifier *specifier_;
 
1650     CYTypeUnsigned(CYTypeSpecifier *specifier) :
 
1651         specifier_(specifier)
 
1655     virtual CYExpression *Replace(CYContext &context);
 
1656     virtual void Output(CYOutput &out) const;
 
1659 struct CYTypeSigned :
 
1662     CYTypeSpecifier *specifier_;
 
1664     CYTypeSigned(CYTypeSpecifier *specifier) :
 
1665         specifier_(specifier)
 
1669     virtual CYExpression *Replace(CYContext &context);
 
1670     virtual void Output(CYOutput &out) const;
 
1676     CYTypeSpecifier *specifier_;
 
1678     CYTypeLong(CYTypeSpecifier *specifier) :
 
1679         specifier_(specifier)
 
1683     virtual CYExpression *Replace(CYContext &context);
 
1684     virtual void Output(CYOutput &out) const;
 
1687 struct CYTypeShort :
 
1690     CYTypeSpecifier *specifier_;
 
1692     CYTypeShort(CYTypeSpecifier *specifier) :
 
1693         specifier_(specifier)
 
1697     virtual CYExpression *Replace(CYContext &context);
 
1698     virtual void Output(CYOutput &out) const;
 
1701 struct CYTypeFunctionWith;
 
1703 struct CYTypeModifier :
 
1704     CYNext<CYTypeModifier>
 
1706     CYTypeModifier(CYTypeModifier *next) :
 
1707         CYNext<CYTypeModifier>(next)
 
1711     virtual int Precedence() const = 0;
 
1713     virtual CYExpression *Replace_(CYContext &context, CYExpression *type) = 0;
 
1714     CYExpression *Replace(CYContext &context, CYExpression *type);
 
1716     virtual void Output(CYOutput &out, CYIdentifier *identifier) const = 0;
 
1717     void Output(CYOutput &out, int precedence, CYIdentifier *identifier) const;
 
1719     virtual CYTypeFunctionWith *Function() { return NULL; }
 
1722 struct CYTypeArrayOf :
 
1725     CYExpression *size_;
 
1727     CYTypeArrayOf(CYExpression *size, CYTypeModifier *next = NULL) :
 
1728         CYTypeModifier(next),
 
1735     virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
 
1736     virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
 
1739 struct CYTypeConstant :
 
1742     CYTypeConstant(CYTypeModifier *next = NULL) :
 
1743         CYTypeModifier(next)
 
1749     virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
 
1750     virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
 
1753 struct CYTypePointerTo :
 
1756     CYTypePointerTo(CYTypeModifier *next = NULL) :
 
1757         CYTypeModifier(next)
 
1763     virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
 
1764     virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
 
1767 struct CYTypeVolatile :
 
1770     CYTypeVolatile(CYTypeModifier *next = NULL) :
 
1771         CYTypeModifier(next)
 
1777     virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
 
1778     virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
 
1781 struct CYTypedIdentifier :
 
1782     CYNext<CYTypedIdentifier>,
 
1785     CYLocation location_;
 
1786     CYIdentifier *identifier_;
 
1787     CYTypeSpecifier *specifier_;
 
1788     CYTypeModifier *modifier_;
 
1790     CYTypedIdentifier(const CYLocation &location, CYIdentifier *identifier = NULL) :
 
1791         location_(location),
 
1792         identifier_(identifier),
 
1798     CYTypedIdentifier(CYTypeSpecifier *specifier, CYTypeModifier *modifier = NULL) :
 
1800         specifier_(specifier),
 
1805     inline CYTypedIdentifier *Modify(CYTypeModifier *modifier) {
 
1806         CYSetLast(modifier_) = modifier;
 
1810     virtual CYExpression *Replace(CYContext &context);
 
1811     virtual void Output(CYOutput &out) const;
 
1813     CYTypeFunctionWith *Function();
 
1816 struct CYEncodedType :
 
1819     CYTypedIdentifier *typed_;
 
1821     CYEncodedType(CYTypedIdentifier *typed) :
 
1828     virtual CYExpression *Replace(CYContext &context);
 
1829     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1832 struct CYTypedParameter :
 
1833     CYNext<CYTypedParameter>,
 
1836     CYTypedIdentifier *typed_;
 
1838     CYTypedParameter(CYTypedIdentifier *typed, CYTypedParameter *next) :
 
1839         CYNext<CYTypedParameter>(next),
 
1844     CYArgument *Argument(CYContext &context);
 
1845     CYFunctionParameter *Parameters(CYContext &context);
 
1846     CYExpression *TypeSignature(CYContext &context, CYExpression *prefix);
 
1848     virtual void Output(CYOutput &out) const;
 
1854     CYTypedIdentifier *typed_;
 
1855     CYTypedParameter *parameters_;
 
1856     CYStatement *statements_;
 
1858     CYLambda(CYTypedIdentifier *typed, CYTypedParameter *parameters, CYStatement *statements) :
 
1860         parameters_(parameters),
 
1861         statements_(statements)
 
1867     virtual CYExpression *Replace(CYContext &context);
 
1868     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1877     CYModule(CYWord *part, CYModule *next = NULL) :
 
1878         CYNext<CYModule>(next),
 
1883     CYString *Replace(CYContext &context, const char *separator) const;
 
1884     void Output(CYOutput &out) const;
 
1892     CYImport(CYModule *module) :
 
1897     virtual CYStatement *Replace(CYContext &context);
 
1898     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1905     CYTypedIdentifier *typed_;
 
1907     CYExternal(CYString *abi, CYTypedIdentifier *typed) :
 
1913     virtual CYStatement *Replace(CYContext &context);
 
1914     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1917 struct CYTypeDefinition :
 
1920     CYTypedIdentifier *typed_;
 
1922     CYTypeDefinition(CYTypedIdentifier *typed) :
 
1927     virtual CYStatement *Replace(CYContext &context);
 
1928     virtual void Output(CYOutput &out, CYFlags flags) const;
 
1931 struct CYTypeBlockWith :
 
1934     CYTypedParameter *parameters_;
 
1936     CYTypeBlockWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
 
1937         CYTypeModifier(next),
 
1938         parameters_(parameters)
 
1944     virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
 
1945     virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
 
1948 struct CYTypeFunctionWith :
 
1951     CYTypedParameter *parameters_;
 
1953     CYTypeFunctionWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
 
1954         CYTypeModifier(next),
 
1955         parameters_(parameters)
 
1961     virtual CYExpression *Replace_(CYContext &context, CYExpression *type);
 
1962     virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
 
1964     virtual CYTypeFunctionWith *Function() { return this; }
 
1973     CYIdentifier *name_;
 
1976     Catch(CYIdentifier *name, CYStatement *statements) :
 
1982     void Replace(CYContext &context);
 
1983     virtual void Output(CYOutput &out) const;
 
1991     CYFinally *finally_;
 
1993     Try(CYStatement *statements, Catch *_catch, CYFinally *finally) :
 
2000     virtual CYStatement *Replace(CYContext &context);
 
2001     virtual void Output(CYOutput &out, CYFlags flags) const;
 
2007     CYExpression *value_;
 
2009     Throw(CYExpression *value = NULL) :
 
2014     virtual CYStatement *Replace(CYContext &context);
 
2015     virtual void Output(CYOutput &out, CYFlags flags) const;
 
2023     CYExpression *scope_;
 
2026     CYWith(CYExpression *scope, CYStatement *code) :
 
2032     virtual CYStatement *Replace(CYContext &context);
 
2033     virtual void Output(CYOutput &out, CYFlags flags) const;
 
2039     CYExpression *value_;
 
2042     CYSwitch(CYExpression *value, CYClause *clauses) :
 
2048     virtual CYStatement *Replace(CYContext &context);
 
2049     virtual void Output(CYOutput &out, CYFlags flags) const;
 
2059     virtual CYStatement *Replace(CYContext &context);
 
2060     virtual void Output(CYOutput &out, CYFlags flags) const;
 
2063 struct CYCondition :
 
2066     CYExpression *test_;
 
2067     CYExpression *true_;
 
2068     CYExpression *false_;
 
2070     CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
 
2079     virtual CYExpression *Replace(CYContext &context);
 
2080     virtual void Output(CYOutput &out, CYFlags flags) const;
 
2083 struct CYAddressOf :
 
2086     CYAddressOf(CYExpression *rhs) :
 
2091     virtual const char *Operator() const {
 
2097     virtual CYExpression *Replace(CYContext &context);
 
2103     CYIndirect(CYExpression *rhs) :
 
2108     virtual const char *Operator() const {
 
2114     virtual CYExpression *Replace(CYContext &context);
 
2118     virtual CYExpression *Replace(CYContext &context);
 
2120 #define CYPostfix_(op, name, args...) \
 
2121     struct CY ## name : \
 
2124         CY ## name(CYExpression *lhs) : \
 
2129         virtual const char *Operator() const { \
 
2134 #define CYPrefix_(alphabetic, op, name, args...) \
 
2135     struct CY ## name : \
 
2138         CY ## name(CYExpression *rhs) : \
 
2143         CYAlphabetic(alphabetic) \
 
2145         virtual const char *Operator() const { \
 
2150 #define CYInfix_(alphabetic, precedence, op, name, args...) \
 
2151     struct CY ## name : \
 
2154         CY ## name(CYExpression *lhs, CYExpression *rhs) : \
 
2159         CYAlphabetic(alphabetic) \
 
2160         CYPrecedence(precedence) \
 
2162         virtual const char *Operator() const { \
 
2167 #define CYAssignment_(op, name, args...) \
 
2168     struct CY ## name ## Assign : \
 
2171         CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
 
2172             CYAssignment(lhs, rhs) \
 
2176         virtual const char *Operator() const { \
 
2181 CYPostfix_("++", PostIncrement)
 
2182 CYPostfix_("--", PostDecrement)
 
2184 CYPrefix_(true, "delete", Delete)
 
2185 CYPrefix_(true, "void", Void)
 
2186 CYPrefix_(true, "typeof", TypeOf)
 
2187 CYPrefix_(false, "++", PreIncrement)
 
2188 CYPrefix_(false, "--", PreDecrement)
 
2189 CYPrefix_(false, "+", Affirm)
 
2190 CYPrefix_(false, "-", Negate)
 
2191 CYPrefix_(false, "~", BitwiseNot)
 
2192 CYPrefix_(false, "!", LogicalNot)
 
2194 CYInfix_(false, 5, "*", Multiply, CYReplace)
 
2195 CYInfix_(false, 5, "/", Divide)
 
2196 CYInfix_(false, 5, "%", Modulus)
 
2197 CYInfix_(false, 6, "+", Add, CYReplace)
 
2198 CYInfix_(false, 6, "-", Subtract)
 
2199 CYInfix_(false, 7, "<<", ShiftLeft)
 
2200 CYInfix_(false, 7, ">>", ShiftRightSigned)
 
2201 CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
 
2202 CYInfix_(false, 8, "<", Less)
 
2203 CYInfix_(false, 8, ">", Greater)
 
2204 CYInfix_(false, 8, "<=", LessOrEqual)
 
2205 CYInfix_(false, 8, ">=", GreaterOrEqual)
 
2206 CYInfix_(true, 8, "instanceof", InstanceOf)
 
2207 CYInfix_(true, 8, "in", In)
 
2208 CYInfix_(false, 9, "==", Equal)
 
2209 CYInfix_(false, 9, "!=", NotEqual)
 
2210 CYInfix_(false, 9, "===", Identical)
 
2211 CYInfix_(false, 9, "!==", NotIdentical)
 
2212 CYInfix_(false, 10, "&", BitwiseAnd)
 
2213 CYInfix_(false, 11, "^", BitwiseXOr)
 
2214 CYInfix_(false, 12, "|", BitwiseOr)
 
2215 CYInfix_(false, 13, "&&", LogicalAnd)
 
2216 CYInfix_(false, 14, "||", LogicalOr)
 
2218 CYAssignment_("=", )
 
2219 CYAssignment_("*=", Multiply)
 
2220 CYAssignment_("/=", Divide)
 
2221 CYAssignment_("%=", Modulus)
 
2222 CYAssignment_("+=", Add)
 
2223 CYAssignment_("-=", Subtract)
 
2224 CYAssignment_("<<=", ShiftLeft)
 
2225 CYAssignment_(">>=", ShiftRightSigned)
 
2226 CYAssignment_(">>>=", ShiftRightUnsigned)
 
2227 CYAssignment_("&=", BitwiseAnd)
 
2228 CYAssignment_("^=", BitwiseXOr)
 
2229 CYAssignment_("|=", BitwiseOr)
 
2231 #endif/*CYCRIPT_PARSER_HPP*/