]> git.saurik.com Git - cycript.git/blame - Syntax.hpp
Always assign methods (to support JavaScriptCore).
[cycript.git] / Syntax.hpp
CommitLineData
b3378a02 1/* Cycript - Optimizing JavaScript Compiler/Runtime
c1d3e52e 2 * Copyright (C) 2009-2015 Jay Freeman (saurik)
b4aa79af
JF
3*/
4
f95d2598 5/* GNU Affero General Public License, Version 3 {{{ */
b4aa79af 6/*
f95d2598
JF
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.
11
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
c15969fd 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f95d2598
JF
15 * GNU Affero General Public License for more details.
16
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/>.
b3378a02 19**/
b4aa79af
JF
20/* }}} */
21
20052ff7
JF
22#ifndef CYCRIPT_SYNTAX_HPP
23#define CYCRIPT_SYNTAX_HPP
24
25#include <cstdio>
26#include <cstdlib>
63b4c5a8 27
efd689d8 28#include <streambuf>
5999c315 29#include <string>
c3c20102 30#include <vector>
cf7d4c69 31
da2af935 32#include "List.hpp"
00b4cb83 33#include "Location.hpp"
029bc65b 34#include "Options.hpp"
20052ff7 35#include "Pooling.hpp"
029bc65b 36
01d0f64d 37struct CYContext;
924f67b2 38
5999c315 39struct CYThing {
652ec1ba 40 virtual void Output(struct CYOutput &out) const = 0;
5999c315
JF
41};
42
652ec1ba 43struct CYOutput {
efd689d8
JF
44 std::streambuf &out_;
45 CYPosition position_;
46
029bc65b 47 CYOptions &options_;
11c1cc16
JF
48 bool pretty_;
49 unsigned indent_;
efd689d8 50 unsigned recent_;
320ce753 51 bool right_;
652ec1ba 52
96a7e5c2
JF
53 enum {
54 NoMode,
55 NoLetter,
c0bc320e 56 NoPlus,
96a7e5c2
JF
57 NoHyphen,
58 Terminated
59 } mode_;
60
efd689d8 61 CYOutput(std::streambuf &out, CYOptions &options) :
11c1cc16 62 out_(out),
029bc65b 63 options_(options),
11c1cc16 64 pretty_(false),
96a7e5c2 65 indent_(0),
efd689d8 66 recent_(0),
320ce753 67 right_(false),
96a7e5c2 68 mode_(NoMode)
652ec1ba
JF
69 {
70 }
71
96a7e5c2 72 void Check(char value);
1fdca2fa 73 void Terminate();
652ec1ba 74
efd689d8
JF
75 _finline void operator ()(char value) {
76 _assert(out_.sputc(value) != EOF);
77 recent_ = indent_;
78 if (value == '\n')
51b2dc6b 79 position_.Lines(1);
efd689d8 80 else
51b2dc6b 81 position_.Columns(1);
efd689d8
JF
82 }
83
84 _finline void operator ()(const char *data, std::streamsize size) {
85 _assert(out_.sputn(data, size) == size);
86 recent_ = indent_;
51b2dc6b 87 position_.Columns(size);
efd689d8
JF
88 }
89
90 _finline void operator ()(const char *data) {
91 return operator ()(data, strlen(data));
92 }
93
96a7e5c2
JF
94 CYOutput &operator <<(char rhs);
95 CYOutput &operator <<(const char *rhs);
96
97 _finline CYOutput &operator <<(const CYThing *rhs) {
98 if (rhs != NULL)
99 rhs->Output(*this);
652ec1ba
JF
100 return *this;
101 }
102
103 _finline CYOutput &operator <<(const CYThing &rhs) {
104 rhs.Output(*this);
105 return *this;
106 }
107};
5999c315 108
c5b15840
JF
109struct CYExpression;
110struct CYAssignment;
111
e5bc40db 112struct CYPropertyName {
c5b15840
JF
113 virtual bool Computed() const {
114 return false;
115 }
116
117 virtual bool Constructor() const {
118 return false;
119 }
120
121 virtual CYExpression *PropertyName(CYContext &context) = 0;
652ec1ba 122 virtual void PropertyName(CYOutput &out) const = 0;
e5bc40db
JF
123};
124
3b52fd1a
JF
125enum CYNeeded {
126 CYNever = -1,
127 CYSometimes = 0,
128 CYAlways = 1,
129};
130
131enum CYFlags {
132 CYNoFlags = 0,
133 CYNoBrace = (1 << 0),
134 CYNoFunction = (1 << 1),
c5b15840
JF
135 CYNoClass = (1 << 2),
136 CYNoIn = (1 << 3),
137 CYNoCall = (1 << 4),
138 CYNoRightHand = (1 << 5),
139 CYNoDangle = (1 << 6),
140 CYNoInteger = (1 << 7),
141 CYNoBFC = (CYNoBrace | CYNoFunction | CYNoClass),
3b52fd1a
JF
142};
143
5a6d4d25
JF
144_finline CYFlags operator ~(CYFlags rhs) {
145 return static_cast<CYFlags>(~static_cast<unsigned>(rhs));
146}
147
148_finline CYFlags operator &(CYFlags lhs, CYFlags rhs) {
149 return static_cast<CYFlags>(static_cast<unsigned>(lhs) & static_cast<unsigned>(rhs));
150}
151
152_finline CYFlags operator |(CYFlags lhs, CYFlags rhs) {
153 return static_cast<CYFlags>(static_cast<unsigned>(lhs) | static_cast<unsigned>(rhs));
154}
155
156_finline CYFlags &operator |=(CYFlags &lhs, CYFlags rhs) {
157 return lhs = lhs | rhs;
158}
159
160_finline CYFlags CYLeft(CYFlags flags) {
161 return flags & ~(CYNoDangle | CYNoInteger);
162}
163
164_finline CYFlags CYRight(CYFlags flags) {
c5b15840 165 return flags & ~CYNoBFC;
5a6d4d25
JF
166}
167
168_finline CYFlags CYCenter(CYFlags flags) {
169 return CYLeft(CYRight(flags));
170}
171
efd689d8
JF
172enum CYCompactType {
173 CYCompactNone,
174 CYCompactLong,
175 CYCompactShort,
176};
177
178#define CYCompact(type) \
179 virtual CYCompactType Compact() const { \
180 return CYCompact ## type; \
181 }
182
3b52fd1a 183struct CYStatement :
b0385401
JF
184 CYNext<CYStatement>,
185 CYThing
3b52fd1a 186{
efd689d8 187 void Single(CYOutput &out, CYFlags flags, CYCompactType request) const;
3b52fd1a 188 void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
b0385401 189 virtual void Output(CYOutput &out) const;
3b52fd1a 190
3b52fd1a
JF
191 virtual CYStatement *Replace(CYContext &context) = 0;
192
efd689d8 193 virtual CYCompactType Compact() const = 0;
12e37ba3
JF
194 virtual CYStatement *Return();
195
3b52fd1a
JF
196 private:
197 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
198};
199
c5b15840 200typedef CYList<CYStatement> CYStatements;
63b4c5a8 201
bfd79fae
JF
202struct CYForInitializer :
203 CYStatement
204{
205 virtual CYForInitializer *Replace(CYContext &context) = 0;
206 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
207};
208
cf7d4c69 209struct CYWord :
e5bc40db 210 CYThing,
c5b15840 211 CYPropertyName
63b4c5a8 212{
cf7d4c69
JF
213 const char *word_;
214
215 CYWord(const char *word) :
216 word_(word)
217 {
218 }
219
c5b15840
JF
220 virtual bool Constructor() const {
221 return strcmp(word_, "constructor") == 0;
222 }
223
029bc65b 224 virtual const char *Word() const;
652ec1ba 225 virtual void Output(CYOutput &out) const;
e5bc40db 226
c5b15840 227 virtual CYExpression *PropertyName(CYContext &context);
652ec1ba 228 virtual void PropertyName(CYOutput &out) const;
63b4c5a8
JF
229};
230
652ec1ba 231_finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
029bc65b
JF
232 lhs << &rhs << '=';
233 return lhs << rhs.Word();
652ec1ba
JF
234}
235
7085e1ab
JF
236enum CYIdentifierKind {
237 CYIdentifierArgument,
238 CYIdentifierCatch,
239 CYIdentifierGlobal,
240 CYIdentifierLexical,
241 CYIdentifierMagic,
242 CYIdentifierOther,
243 CYIdentifierVariable,
244};
245
cf7d4c69 246struct CYIdentifier :
14ec9e00 247 CYNext<CYIdentifier>,
cf7d4c69 248 CYWord
63b4c5a8 249{
7085e1ab 250 CYLocation location_;
6a981250 251 size_t offset_;
e013809d 252 size_t usage_;
029bc65b 253
5999c315 254 CYIdentifier(const char *word) :
029bc65b 255 CYWord(word),
e013809d
JF
256 offset_(0),
257 usage_(0)
5999c315 258 {
cf7d4c69 259 }
029bc65b
JF
260
261 virtual const char *Word() const;
7085e1ab 262 CYIdentifier *Replace(CYContext &context, CYIdentifierKind);
63b4c5a8
JF
263};
264
62014ea9 265struct CYLabel :
3b52fd1a 266 CYStatement
62014ea9 267{
9e562cfc 268 CYIdentifier *name_;
3b52fd1a 269 CYStatement *statement_;
cf7d4c69 270
3b52fd1a
JF
271 CYLabel(CYIdentifier *name, CYStatement *statement) :
272 name_(name),
273 statement_(statement)
cf7d4c69
JF
274 {
275 }
fb98ac0c 276
efd689d8
JF
277 CYCompact(Short)
278
3b52fd1a
JF
279 virtual CYStatement *Replace(CYContext &context);
280 virtual void Output(CYOutput &out, CYFlags flags) const;
fb98ac0c
JF
281};
282
14ec9e00 283struct CYCStringLess :
029bc65b
JF
284 std::binary_function<const char *, const char *, bool>
285{
286 _finline bool operator ()(const char *lhs, const char *rhs) const {
287 return strcmp(lhs, rhs) < 0;
288 }
289};
290
291struct CYIdentifierValueLess :
292 std::binary_function<CYIdentifier *, CYIdentifier *, bool>
293{
294 _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
14ec9e00 295 return CYCStringLess()(lhs->Word(), rhs->Word());
029bc65b
JF
296 }
297};
298
7085e1ab
JF
299struct CYIdentifierFlags :
300 CYNext<CYIdentifierFlags>
301{
e013809d 302 CYIdentifier *identifier_;
7085e1ab
JF
303 CYIdentifierKind kind_;
304 unsigned count_;
305 unsigned offset_;
e013809d 306
7085e1ab
JF
307 CYIdentifierFlags(CYIdentifier *identifier, CYIdentifierKind kind, CYIdentifierFlags *next = NULL) :
308 CYNext<CYIdentifierFlags>(next),
309 identifier_(identifier),
310 kind_(kind),
311 count_(0),
312 offset_(0)
313 {
314 }
315};
e013809d 316
029bc65b 317struct CYScope {
61fe0c53 318 bool transparent_;
029bc65b 319 CYScope *parent_;
7085e1ab
JF
320 bool damaged_;
321 CYIdentifierFlags *shadow_;
a86e34d0 322
7085e1ab 323 CYIdentifierFlags *internal_;
029bc65b 324
50a3d79f 325 CYScope(bool transparent, CYContext &context);
0a356474 326
7085e1ab
JF
327 CYIdentifierFlags *Lookup(CYContext &context, const char *word);
328 CYIdentifierFlags *Lookup(CYContext &context, CYIdentifier *identifier);
329
330 CYIdentifierFlags *Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierKind kind);
331 void Merge(CYContext &context, const CYIdentifierFlags *flags);
332
50a3d79f 333 void Close(CYContext &context, CYStatement *&statements);
7085e1ab
JF
334 void Close(CYContext &context);
335 void Damage();
029bc65b
JF
336};
337
a7d8b413 338struct CYScript :
3b52fd1a 339 CYThing
63b4c5a8 340{
b0385401 341 CYStatement *code_;
9e562cfc 342
a7d8b413 343 CYScript(CYStatement *code) :
b0385401 344 code_(code)
9e562cfc
JF
345 {
346 }
cf7d4c69 347
3b52fd1a 348 virtual void Replace(CYContext &context);
3b52fd1a 349 virtual void Output(CYOutput &out) const;
9e562cfc
JF
350};
351
ab2aa221 352struct CYNonLocal;
a0be43fc 353struct CYThisScope;
ab2aa221 354
2c81c6df 355struct CYContext {
6a981250 356 CYOptions &options_;
ab2aa221 357
6a981250 358 CYScope *scope_;
a0be43fc 359 CYThisScope *this_;
c5b15840 360 CYIdentifier *super_;
a0be43fc 361
ab2aa221 362 CYNonLocal *nonlocal_;
06293152 363 CYNonLocal *nextlocal_;
ab2aa221
JF
364 unsigned unique_;
365
7085e1ab
JF
366 std::vector<CYIdentifier *> replace_;
367
2eb8215d 368 CYContext(CYOptions &options) :
6a981250 369 options_(options),
ab2aa221 370 scope_(NULL),
a0be43fc 371 this_(NULL),
c5b15840 372 super_(NULL),
ab2aa221 373 nonlocal_(NULL),
06293152 374 nextlocal_(NULL),
ab2aa221 375 unique_(0)
6a981250
JF
376 {
377 }
378
b0385401
JF
379 void ReplaceAll(CYStatement *&statement) {
380 if (statement == NULL)
381 return;
382 CYStatement *next(statement->next_);
383
384 Replace(statement);
385 ReplaceAll(next);
386
387 if (statement == NULL)
388 statement = next;
389 else
390 statement->SetNext(next);
cde20a5a
JF
391 }
392
6a981250
JF
393 template <typename Type_>
394 void Replace(Type_ *&value) {
395 for (;;) if (value == NULL)
396 break;
397 else {
398 Type_ *replace(value->Replace(*this));
399 if (replace != value)
400 value = replace;
401 else break;
402 }
403 }
ab2aa221
JF
404
405 void NonLocal(CYStatement *&statements);
406 CYIdentifier *Unique();
407};
408
409struct CYNonLocal {
410 CYIdentifier *identifier_;
411
412 CYNonLocal() :
413 identifier_(NULL)
414 {
415 }
416
417 CYIdentifier *Target(CYContext &context) {
418 if (identifier_ == NULL)
419 identifier_ = context.Unique();
420 return identifier_;
421 }
6a981250
JF
422};
423
a0be43fc
JF
424struct CYThisScope :
425 CYNext<CYThisScope>
426{
427 CYIdentifier *identifier_;
428
429 CYThisScope() :
430 identifier_(NULL)
431 {
432 }
433
434 CYIdentifier *Identifier(CYContext &context) {
435 if (next_ != NULL)
436 return next_->Identifier(context);
437 if (identifier_ == NULL)
438 identifier_ = context.Unique();
439 return identifier_;
440 }
441};
442
9e562cfc 443struct CYBlock :
b0385401 444 CYStatement
9e562cfc 445{
b0385401 446 CYStatement *code_;
9e562cfc 447
b0385401
JF
448 CYBlock(CYStatement *code) :
449 code_(code)
9e562cfc 450 {
cf7d4c69 451 }
9e562cfc 452
efd689d8
JF
453 CYCompact(Short)
454
3b52fd1a
JF
455 virtual CYStatement *Replace(CYContext &context);
456
fb98ac0c 457 virtual void Output(CYOutput &out, CYFlags flags) const;
12e37ba3
JF
458
459 virtual CYStatement *Return();
cf7d4c69
JF
460};
461
7085e1ab
JF
462struct CYTarget;
463struct CYVar;
b158281e 464
7085e1ab
JF
465struct CYForInInitializer {
466 virtual CYStatement *Initialize(CYContext &context, CYExpression *value) = 0;
c8a0500b 467
7085e1ab 468 virtual CYTarget *Replace(CYContext &context) = 0;
c8a0500b 469 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
b09da87b
JF
470};
471
0afc9ba3
JF
472struct CYFunctionParameter;
473
4644480a
JF
474struct CYNumber;
475struct CYString;
476
cf7d4c69 477struct CYExpression :
96a7e5c2 478 CYThing
63b4c5a8 479{
9a39f705 480 virtual int Precedence() const = 0;
75b0a457 481
fb98ac0c
JF
482 virtual bool RightHand() const {
483 return true;
484 }
485
7085e1ab
JF
486 virtual bool Eval() const {
487 return false;
488 }
75b0a457 489
7085e1ab 490 virtual CYTarget *AddArgument(CYContext &context, CYExpression *value);
6c093cce 491
96a7e5c2 492 virtual void Output(CYOutput &out) const;
652ec1ba 493 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
9a39f705 494 void Output(CYOutput &out, int precedence, CYFlags flags) const;
dea834b0 495
3b52fd1a
JF
496 virtual CYExpression *Replace(CYContext &context) = 0;
497
4644480a 498 virtual CYExpression *Primitive(CYContext &context) {
fd5cdf97 499 return NULL;
4644480a
JF
500 }
501
0afc9ba3 502 virtual CYFunctionParameter *Parameter() const;
0afc9ba3 503
4644480a
JF
504 virtual CYNumber *Number(CYContext &context) {
505 return NULL;
506 }
507
508 virtual CYString *String(CYContext &context) {
509 return NULL;
510 }
511
dea834b0
JF
512 virtual const char *Word() const {
513 return NULL;
514 }
63b4c5a8
JF
515};
516
7085e1ab
JF
517struct CYTarget :
518 CYExpression,
519 CYForInInitializer
520{
521 virtual bool RightHand() const {
522 return false;
523 }
524
525 virtual CYStatement *Initialize(CYContext &context, CYExpression *value);
526
527 virtual CYTarget *Replace(CYContext &context) = 0;
528 using CYExpression::Output;
529};
530
b09da87b
JF
531#define CYAlphabetic(value) \
532 virtual bool Alphabetic() const { \
533 return value; \
534 }
535
d35a3b07 536#define CYPrecedence(value) \
9a39f705
JF
537 static const int Precedence_ = value; \
538 virtual int Precedence() const { \
8351aa30 539 return Precedence_; \
d35a3b07
JF
540 }
541
542struct CYCompound :
543 CYExpression
544{
fd5cdf97
JF
545 CYExpression *expression_;
546 CYExpression *next_;
d35a3b07 547
b0385401 548 CYCompound(CYExpression *expression, CYExpression *next) :
fd5cdf97
JF
549 expression_(expression),
550 next_(next)
d35a3b07 551 {
fd5cdf97 552 _assert(expression_ != NULL);
b0385401 553 _assert(next != NULL);
d35a3b07
JF
554 }
555
556 CYPrecedence(17)
557
3b52fd1a 558 virtual CYExpression *Replace(CYContext &context);
652ec1ba 559 void Output(CYOutput &out, CYFlags flags) const;
e06e5ee1 560
b0385401
JF
561 virtual CYFunctionParameter *Parameter() const;
562};
563
564struct CYParenthetical :
7085e1ab 565 CYTarget
b0385401
JF
566{
567 CYExpression *expression_;
568
569 CYParenthetical(CYExpression *expression) :
570 expression_(expression)
571 {
572 }
573
574 CYPrecedence(0)
575
7085e1ab 576 virtual CYTarget *Replace(CYContext &context);
b0385401 577 void Output(CYOutput &out, CYFlags flags) const;
d35a3b07 578};
5999c315 579
c8a0500b
JF
580struct CYDeclaration;
581
3b52fd1a
JF
582struct CYFunctionParameter :
583 CYNext<CYFunctionParameter>,
584 CYThing
585{
7085e1ab 586 CYDeclaration *initialiser_;
3b52fd1a 587
7085e1ab 588 CYFunctionParameter(CYDeclaration *initialiser, CYFunctionParameter *next = NULL) :
3b52fd1a 589 CYNext<CYFunctionParameter>(next),
c8a0500b 590 initialiser_(initialiser)
4e11a430
JF
591 {
592 }
593
b0385401 594 void Replace(CYContext &context, CYStatement *&statements);
c8a0500b 595 void Output(CYOutput &out) const;
3b52fd1a
JF
596};
597
75b0a457 598struct CYComprehension :
96a7e5c2
JF
599 CYNext<CYComprehension>,
600 CYThing
75b0a457 601{
c2529502
JF
602 CYComprehension(CYComprehension *next = NULL) :
603 CYNext<CYComprehension>(next)
604 {
605 }
606
b3aa25d8
JF
607 CYComprehension *Modify(CYComprehension *next) {
608 next_ = next;
609 return this;
610 }
611
3b52fd1a
JF
612 virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
613 CYFunctionParameter *Parameters(CYContext &context) const;
614 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
4644480a 615 virtual void Output(CYOutput &out) const = 0;
75b0a457
JF
616};
617
618struct CYForInComprehension :
619 CYComprehension
620{
4e3c9056 621 CYDeclaration *declaration_;
75b0a457
JF
622 CYExpression *set_;
623
4e3c9056 624 CYForInComprehension(CYDeclaration *declaration, CYExpression *set, CYComprehension *next = NULL) :
c2529502 625 CYComprehension(next),
4e3c9056 626 declaration_(declaration),
75b0a457
JF
627 set_(set)
628 {
629 }
630
3b52fd1a
JF
631 virtual CYFunctionParameter *Parameter(CYContext &context) const;
632 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
4644480a 633 virtual void Output(CYOutput &out) const;
75b0a457
JF
634};
635
d5618df7 636struct CYForOfComprehension :
75b0a457
JF
637 CYComprehension
638{
4e3c9056 639 CYDeclaration *declaration_;
75b0a457
JF
640 CYExpression *set_;
641
4e3c9056 642 CYForOfComprehension(CYDeclaration *declaration, CYExpression *set, CYComprehension *next = NULL) :
c2529502 643 CYComprehension(next),
4e3c9056 644 declaration_(declaration),
75b0a457
JF
645 set_(set)
646 {
647 }
648
3b52fd1a
JF
649 virtual CYFunctionParameter *Parameter(CYContext &context) const;
650 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
4644480a 651 virtual void Output(CYOutput &out) const;
75b0a457
JF
652};
653
654struct CYIfComprehension :
655 CYComprehension
656{
657 CYExpression *test_;
658
b3aa25d8
JF
659 CYIfComprehension(CYExpression *test, CYComprehension *next = NULL) :
660 CYComprehension(next),
75b0a457
JF
661 test_(test)
662 {
663 }
664
3b52fd1a
JF
665 virtual CYFunctionParameter *Parameter(CYContext &context) const;
666 virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
4644480a 667 virtual void Output(CYOutput &out) const;
75b0a457
JF
668};
669
670struct CYArrayComprehension :
7085e1ab 671 CYTarget
75b0a457
JF
672{
673 CYExpression *expression_;
674 CYComprehension *comprehensions_;
675
676 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
677 expression_(expression),
678 comprehensions_(comprehensions)
679 {
680 }
681
682 CYPrecedence(0)
683
7085e1ab 684 virtual CYTarget *Replace(CYContext &context);
652ec1ba 685 virtual void Output(CYOutput &out, CYFlags flags) const;
75b0a457
JF
686};
687
cf7d4c69 688struct CYLiteral :
7085e1ab 689 CYTarget
63b4c5a8 690{
7085e1ab
JF
691 CYLocation location_;
692
d35a3b07 693 CYPrecedence(0)
fd5cdf97
JF
694
695 virtual CYExpression *Primitive(CYContext &context) {
696 return this;
697 }
cf7d4c69 698};
63b4c5a8 699
3b52fd1a
JF
700struct CYTrivial :
701 CYLiteral
702{
7085e1ab 703 virtual CYTarget *Replace(CYContext &context);
3b52fd1a
JF
704};
705
478d4ed0 706struct CYMagic :
7085e1ab 707 CYTarget
478d4ed0
JF
708{
709 CYPrecedence(0)
710};
711
dea834b0
JF
712struct CYRange {
713 uint64_t lo_;
714 uint64_t hi_;
715
716 CYRange(uint64_t lo, uint64_t hi) :
717 lo_(lo), hi_(hi)
718 {
719 }
720
721 bool operator [](uint8_t value) const {
722 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
723 }
724
725 void operator()(uint8_t value) {
726 if (value >> 7)
727 return;
728 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
729 }
730};
731
283e7e33 732extern CYRange DigitRange_;
dea834b0
JF
733extern CYRange WordStartRange_;
734extern CYRange WordEndRange_;
735
cf7d4c69 736struct CYString :
3b52fd1a 737 CYTrivial,
e5bc40db 738 CYPropertyName
cf7d4c69
JF
739{
740 const char *value_;
5999c315 741 size_t size_;
cf7d4c69 742
3b52fd1a
JF
743 CYString() :
744 value_(NULL),
745 size_(0)
746 {
747 }
748
749 CYString(const char *value) :
750 value_(value),
751 size_(strlen(value))
752 {
753 }
754
5999c315
JF
755 CYString(const char *value, size_t size) :
756 value_(value),
757 size_(size)
cf7d4c69
JF
758 {
759 }
760
3b52fd1a 761 CYString(const CYWord *word) :
029bc65b 762 value_(word->Word()),
5999c315 763 size_(strlen(value_))
cf7d4c69
JF
764 {
765 }
766
5999c315 767 const char *Value() const {
cf7d4c69
JF
768 return value_;
769 }
770
11c1cc16 771 virtual const char *Word() const;
dea834b0 772
4644480a
JF
773 virtual CYNumber *Number(CYContext &context);
774 virtual CYString *String(CYContext &context);
775
5db9a7f5 776 CYString *Concat(CYContext &out, CYString *rhs) const;
652ec1ba 777 virtual void Output(CYOutput &out, CYFlags flags) const;
c5b15840
JF
778
779 virtual CYExpression *PropertyName(CYContext &context);
652ec1ba 780 virtual void PropertyName(CYOutput &out) const;
63b4c5a8
JF
781};
782
fc8fc33d 783struct CYElementValue;
b900e1a4
JF
784
785struct CYSpan :
786 CYNext<CYSpan>
787{
788 CYExpression *expression_;
789 CYString *string_;
790
791 CYSpan(CYExpression *expression, CYString *string, CYSpan *next) :
792 CYNext<CYSpan>(next),
793 expression_(expression),
794 string_(string)
795 {
796 }
797
fc8fc33d 798 CYElementValue *Replace(CYContext &context);
b900e1a4
JF
799};
800
801struct CYTemplate :
7085e1ab 802 CYTarget
b900e1a4
JF
803{
804 CYString *string_;
805 CYSpan *spans_;
806
807 CYTemplate(CYString *string, CYSpan *spans) :
808 string_(string),
809 spans_(spans)
810 {
811 }
812
813 CYPrecedence(0)
b900e1a4 814
7085e1ab 815 virtual CYTarget *Replace(CYContext &context);
b900e1a4
JF
816 virtual void Output(CYOutput &out, CYFlags flags) const;
817};
818
cf7d4c69 819struct CYNumber :
3b52fd1a 820 CYTrivial,
e5bc40db 821 CYPropertyName
cf7d4c69 822{
5999c315
JF
823 double value_;
824
825 CYNumber(double value) :
826 value_(value)
827 {
828 }
829
830 double Value() const {
831 return value_;
cf7d4c69
JF
832 }
833
4644480a
JF
834 virtual CYNumber *Number(CYContext &context);
835 virtual CYString *String(CYContext &context);
836
652ec1ba 837 virtual void Output(CYOutput &out, CYFlags flags) const;
c5b15840
JF
838
839 virtual CYExpression *PropertyName(CYContext &context);
840 virtual void PropertyName(CYOutput &out) const;
841};
842
843struct CYComputed :
844 CYPropertyName
845{
846 CYExpression *expression_;
847
848 CYComputed(CYExpression *expression) :
849 expression_(expression)
850 {
851 }
852
853 virtual bool Computed() const {
854 return true;
855 }
856
857 virtual CYExpression *PropertyName(CYContext &context);
652ec1ba 858 virtual void PropertyName(CYOutput &out) const;
cf7d4c69
JF
859};
860
63cd45c9 861struct CYRegEx :
3b52fd1a 862 CYTrivial
63cd45c9
JF
863{
864 const char *value_;
c8a2a786 865 size_t size_;
63cd45c9 866
c8a2a786
JF
867 CYRegEx(const char *value, size_t size) :
868 value_(value),
869 size_(size)
63cd45c9
JF
870 {
871 }
872
873 const char *Value() const {
874 return value_;
875 }
876
877 virtual void Output(CYOutput &out, CYFlags flags) const;
878};
879
cf7d4c69 880struct CYNull :
3b52fd1a 881 CYTrivial
cf7d4c69 882{
4644480a
JF
883 virtual CYNumber *Number(CYContext &context);
884 virtual CYString *String(CYContext &context);
885
652ec1ba 886 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
887};
888
889struct CYThis :
478d4ed0 890 CYMagic
cf7d4c69 891{
7085e1ab 892 virtual CYTarget *Replace(CYContext &context);
652ec1ba 893 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
894};
895
896struct CYBoolean :
3b52fd1a 897 CYTrivial
cf7d4c69 898{
5999c315 899 virtual bool Value() const = 0;
652ec1ba 900 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
901};
902
903struct CYFalse :
cf7d4c69
JF
904 CYBoolean
905{
11c1cc16
JF
906 virtual bool Value() const {
907 return false;
908 }
4644480a
JF
909
910 virtual CYNumber *Number(CYContext &context);
911 virtual CYString *String(CYContext &context);
cf7d4c69
JF
912};
913
914struct CYTrue :
cf7d4c69
JF
915 CYBoolean
916{
11c1cc16
JF
917 virtual bool Value() const {
918 return true;
919 }
4644480a
JF
920
921 virtual CYNumber *Number(CYContext &context);
922 virtual CYString *String(CYContext &context);
cf7d4c69
JF
923};
924
925struct CYVariable :
7085e1ab 926 CYTarget
cf7d4c69
JF
927{
928 CYIdentifier *name_;
929
930 CYVariable(CYIdentifier *name) :
931 name_(name)
932 {
933 }
5999c315 934
2eb8215d
JF
935 CYVariable(const char *name) :
936 name_(new($pool) CYIdentifier(name))
937 {
938 }
939
d35a3b07
JF
940 CYPrecedence(0)
941
7085e1ab
JF
942 virtual bool Eval() const {
943 return strcmp(name_->Word(), "eval") == 0;
944 }
945
946 virtual CYTarget *Replace(CYContext &context);
652ec1ba 947 virtual void Output(CYOutput &out, CYFlags flags) const;
0afc9ba3
JF
948
949 virtual CYFunctionParameter *Parameter() const;
cf7d4c69
JF
950};
951
952struct CYPrefix :
63b4c5a8
JF
953 CYExpression
954{
955 CYExpression *rhs_;
956
cf7d4c69 957 CYPrefix(CYExpression *rhs) :
63b4c5a8
JF
958 rhs_(rhs)
959 {
960 }
5999c315 961
b09da87b 962 virtual bool Alphabetic() const = 0;
5999c315
JF
963 virtual const char *Operator() const = 0;
964
3b52fd1a
JF
965 CYPrecedence(4)
966
967 virtual CYExpression *Replace(CYContext &context);
652ec1ba 968 virtual void Output(CYOutput &out, CYFlags flags) const;
63b4c5a8
JF
969};
970
cf7d4c69 971struct CYInfix :
63b4c5a8
JF
972 CYExpression
973{
974 CYExpression *lhs_;
975 CYExpression *rhs_;
976
cf7d4c69 977 CYInfix(CYExpression *lhs, CYExpression *rhs) :
63b4c5a8
JF
978 lhs_(lhs),
979 rhs_(rhs)
980 {
981 }
5999c315 982
0ff9f149
JF
983 void SetLeft(CYExpression *lhs) {
984 lhs_ = lhs;
985 }
986
b09da87b 987 virtual bool Alphabetic() const = 0;
5999c315
JF
988 virtual const char *Operator() const = 0;
989
3b52fd1a 990 virtual CYExpression *Replace(CYContext &context);
652ec1ba 991 virtual void Output(CYOutput &out, CYFlags flags) const;
63b4c5a8
JF
992};
993
cf7d4c69 994struct CYPostfix :
63b4c5a8
JF
995 CYExpression
996{
997 CYExpression *lhs_;
998
cf7d4c69 999 CYPostfix(CYExpression *lhs) :
63b4c5a8
JF
1000 lhs_(lhs)
1001 {
1002 }
5999c315
JF
1003
1004 virtual const char *Operator() const = 0;
1005
3b52fd1a
JF
1006 CYPrecedence(3)
1007
1008 virtual CYExpression *Replace(CYContext &context);
652ec1ba 1009 virtual void Output(CYOutput &out, CYFlags flags) const;
63b4c5a8
JF
1010};
1011
cf7d4c69 1012struct CYAssignment :
d35a3b07 1013 CYExpression
cf7d4c69 1014{
7085e1ab 1015 CYTarget *lhs_;
d35a3b07
JF
1016 CYExpression *rhs_;
1017
7085e1ab 1018 CYAssignment(CYTarget *lhs, CYExpression *rhs) :
d35a3b07
JF
1019 lhs_(lhs),
1020 rhs_(rhs)
cf7d4c69
JF
1021 {
1022 }
5999c315 1023
8b77acf1
JF
1024 void SetRight(CYExpression *rhs) {
1025 rhs_ = rhs;
0ff9f149
JF
1026 }
1027
5999c315 1028 virtual const char *Operator() const = 0;
d35a3b07 1029
4de0686f
JF
1030 CYPrecedence(16)
1031
3b52fd1a 1032 virtual CYExpression *Replace(CYContext &context);
652ec1ba 1033 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1034};
1035
62014ea9 1036struct CYArgument :
96a7e5c2
JF
1037 CYNext<CYArgument>,
1038 CYThing
62014ea9 1039{
cf7d4c69
JF
1040 CYWord *name_;
1041 CYExpression *value_;
cf7d4c69 1042
3b52fd1a
JF
1043 CYArgument(CYExpression *value, CYArgument *next = NULL) :
1044 CYNext<CYArgument>(next),
1045 name_(NULL),
1046 value_(value)
1047 {
1048 }
1049
cf7d4c69 1050 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
62014ea9 1051 CYNext<CYArgument>(next),
cf7d4c69 1052 name_(name),
62014ea9 1053 value_(value)
cf7d4c69
JF
1054 {
1055 }
5999c315 1056
5192746c 1057 CYArgument *Replace(CYContext &context);
652ec1ba 1058 void Output(CYOutput &out) const;
cf7d4c69
JF
1059};
1060
5999c315
JF
1061struct CYClause :
1062 CYThing,
1063 CYNext<CYClause>
1064{
cf7d4c69 1065 CYExpression *case_;
b0385401 1066 CYStatement *code_;
cf7d4c69 1067
b0385401 1068 CYClause(CYExpression *_case, CYStatement *code) :
cf7d4c69 1069 case_(_case),
b0385401 1070 code_(code)
cf7d4c69
JF
1071 {
1072 }
1073
fa389b0f 1074 void Replace(CYContext &context);
652ec1ba 1075 virtual void Output(CYOutput &out) const;
cf7d4c69
JF
1076};
1077
62014ea9 1078struct CYElement :
96a7e5c2 1079 CYThing
fc8fc33d
JF
1080{
1081 virtual bool Elision() const = 0;
1082
1083 virtual void Replace(CYContext &context) = 0;
1084};
1085
1086struct CYElementValue :
1087 CYNext<CYElement>,
1088 CYElement
62014ea9 1089{
cf7d4c69 1090 CYExpression *value_;
cf7d4c69 1091
fc8fc33d 1092 CYElementValue(CYExpression *value, CYElement *next) :
62014ea9
JF
1093 CYNext<CYElement>(next),
1094 value_(value)
cf7d4c69
JF
1095 {
1096 }
5999c315 1097
fc8fc33d
JF
1098 virtual bool Elision() const {
1099 return value_ == NULL;
1100 }
1101
1102 virtual void Replace(CYContext &context);
1103 virtual void Output(CYOutput &out) const;
1104};
1105
1106struct CYElementSpread :
1107 CYElement
1108{
1109 CYExpression *value_;
1110
1111 CYElementSpread(CYExpression *value) :
1112 value_(value)
1113 {
1114 }
1115
1116 virtual bool Elision() const {
1117 return false;
1118 }
1119
1120 virtual void Replace(CYContext &context);
1121 virtual void Output(CYOutput &out) const;
5befe15e
JF
1122};
1123
1124struct CYArray :
1125 CYLiteral
1126{
1127 CYElement *elements_;
1128
3b52fd1a 1129 CYArray(CYElement *elements = NULL) :
5befe15e
JF
1130 elements_(elements)
1131 {
1132 }
1133
7085e1ab 1134 virtual CYTarget *Replace(CYContext &context);
652ec1ba 1135 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1136};
1137
7085e1ab 1138struct CYDeclaration {
cf7d4c69
JF
1139 CYIdentifier *identifier_;
1140 CYExpression *initialiser_;
1141
550ee46a 1142 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
cf7d4c69
JF
1143 identifier_(identifier),
1144 initialiser_(initialiser)
1145 {
1146 }
5999c315 1147
7085e1ab 1148 CYTarget *Target(CYContext &context);
3b52fd1a 1149
7085e1ab
JF
1150 virtual CYAssignment *Replace(CYContext &context, CYIdentifierKind kind);
1151 virtual void Output(CYOutput &out, CYFlags flags) const;
1152};
1153
1154struct CYForLexical :
1155 CYForInInitializer
1156{
1157 bool constant_;
1158 CYDeclaration *declaration_;
1159
1160 CYForLexical(bool constant, CYDeclaration *declaration) :
1161 constant_(constant),
1162 declaration_(declaration)
1163 {
1164 }
1165
1166 virtual CYStatement *Initialize(CYContext &context, CYExpression *value);
1167
1168 virtual CYTarget *Replace(CYContext &context);
1169 virtual void Output(CYOutput &out, CYFlags flags) const;
1170};
15b88a33 1171
7085e1ab
JF
1172struct CYForVariable :
1173 CYForInInitializer
1174{
1175 CYDeclaration *declaration_;
75b0a457 1176
7085e1ab
JF
1177 CYForVariable(CYDeclaration *declaration) :
1178 declaration_(declaration)
1179 {
1180 }
1181
1182 virtual CYStatement *Initialize(CYContext &context, CYExpression *value);
1183
1184 virtual CYTarget *Replace(CYContext &context);
652ec1ba 1185 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1186};
1187
1188struct CYDeclarations :
cac61857 1189 CYNext<CYDeclarations>,
15b88a33 1190 CYThing
cf7d4c69
JF
1191{
1192 CYDeclaration *declaration_;
cf7d4c69 1193
cacd1a88 1194 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
cac61857
JF
1195 CYNext<CYDeclarations>(next),
1196 declaration_(declaration)
1197 {
1198 }
1199
7085e1ab 1200 CYExpression *Replace(CYContext &context, CYIdentifierKind kind);
96a7e5c2 1201
15b88a33
JF
1202 CYArgument *Argument(CYContext &context);
1203 CYFunctionParameter *Parameter(CYContext &context);
3b52fd1a 1204
96a7e5c2 1205 virtual void Output(CYOutput &out) const;
652ec1ba 1206 virtual void Output(CYOutput &out, CYFlags flags) const;
cac61857
JF
1207};
1208
1209struct CYVar :
bfd79fae 1210 CYForInitializer
cac61857
JF
1211{
1212 CYDeclarations *declarations_;
1213
1214 CYVar(CYDeclarations *declarations) :
1215 declarations_(declarations)
1216 {
1217 }
1218
efd689d8
JF
1219 CYCompact(None)
1220
bfd79fae 1221 virtual CYForInitializer *Replace(CYContext &context);
fb98ac0c 1222 virtual void Output(CYOutput &out, CYFlags flags) const;
cac61857
JF
1223};
1224
ca6a1b2b 1225struct CYLet :
bfd79fae 1226 CYForInitializer
cac61857 1227{
7085e1ab 1228 bool constant_;
cac61857 1229 CYDeclarations *declarations_;
cac61857 1230
7085e1ab
JF
1231 CYLet(bool constant, CYDeclarations *declarations) :
1232 constant_(constant),
ca6a1b2b 1233 declarations_(declarations)
cf7d4c69
JF
1234 {
1235 }
5999c315 1236
ca6a1b2b 1237 CYCompact(None)
efd689d8 1238
bfd79fae 1239 virtual CYForInitializer *Replace(CYContext &context);
fb98ac0c 1240 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1241};
1242
c5b15840
JF
1243struct CYBuilder {
1244 CYList<CYDeclarations> declarations_;
1245 CYList<CYStatement> statements_;
1246
1247 operator bool() const {
1248 return statements_ != NULL;
1249 }
1250};
1251
1252struct CYProperty :
1253 CYNext<CYProperty>,
1254 CYThing
1255{
1256 CYPropertyName *name_;
1257
1258 CYProperty(CYPropertyName *name, CYProperty *next = NULL) :
1259 CYNext<CYProperty>(next),
1260 name_(name)
1261 {
1262 }
1263
7b87d205
JF
1264 virtual bool Update() const;
1265
c5b15840 1266 CYProperty *ReplaceAll(CYContext &context, CYBuilder &builder, CYExpression *self, bool update);
a196a97a 1267 void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, bool protect);
c5b15840 1268
a196a97a 1269 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect) = 0;
c5b15840
JF
1270
1271 virtual void Replace(CYContext &context) = 0;
1272 virtual void Output(CYOutput &out) const;
1273};
1274
1275struct CYPropertyValue :
1276 CYProperty
1277{
1278 CYExpression *value_;
1279
1280 CYPropertyValue(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) :
1281 CYProperty(name, next),
1282 value_(value)
1283 {
1284 }
1285
a196a97a 1286 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
c5b15840
JF
1287 virtual void Replace(CYContext &context);
1288 virtual void Output(CYOutput &out) const;
1289};
1290
cf7d4c69
JF
1291struct CYFor :
1292 CYStatement
1293{
a7d8b413 1294 CYForInitializer *initialiser_;
cf7d4c69
JF
1295 CYExpression *test_;
1296 CYExpression *increment_;
1297 CYStatement *code_;
1298
a7d8b413 1299 CYFor(CYForInitializer *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
cf7d4c69
JF
1300 initialiser_(initialiser),
1301 test_(test),
1302 increment_(increment),
1303 code_(code)
1304 {
1305 }
5999c315 1306
efd689d8
JF
1307 CYCompact(Long)
1308
3b52fd1a 1309 virtual CYStatement *Replace(CYContext &context);
fb98ac0c 1310 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1311};
1312
1313struct CYForIn :
1314 CYStatement
1315{
a7d8b413 1316 CYForInInitializer *initialiser_;
cf7d4c69
JF
1317 CYExpression *set_;
1318 CYStatement *code_;
1319
a7d8b413 1320 CYForIn(CYForInInitializer *initialiser, CYExpression *set, CYStatement *code) :
cf7d4c69
JF
1321 initialiser_(initialiser),
1322 set_(set),
1323 code_(code)
1324 {
1325 }
5999c315 1326
efd689d8
JF
1327 CYCompact(Long)
1328
3b52fd1a 1329 virtual CYStatement *Replace(CYContext &context);
23111dca
JF
1330 virtual void Output(CYOutput &out, CYFlags flags) const;
1331};
1332
1333struct CYForInitialized :
1334 CYStatement
1335{
1336 CYDeclaration *declaration_;
1337 CYExpression *set_;
1338 CYStatement *code_;
1339
1340 CYForInitialized(CYDeclaration *declaration, CYExpression *set, CYStatement *code) :
1341 declaration_(declaration),
1342 set_(set),
1343 code_(code)
1344 {
1345 }
1346
1347 CYCompact(Long)
1348
1349 virtual CYStatement *Replace(CYContext &context);
fb98ac0c 1350 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1351};
1352
d5618df7 1353struct CYForOf :
75b0a457
JF
1354 CYStatement
1355{
a7d8b413 1356 CYForInInitializer *initialiser_;
75b0a457
JF
1357 CYExpression *set_;
1358 CYStatement *code_;
1359
a7d8b413 1360 CYForOf(CYForInInitializer *initialiser, CYExpression *set, CYStatement *code) :
75b0a457
JF
1361 initialiser_(initialiser),
1362 set_(set),
1363 code_(code)
1364 {
1365 }
1366
efd689d8
JF
1367 CYCompact(Long)
1368
3b52fd1a 1369 virtual CYStatement *Replace(CYContext &context);
fb98ac0c 1370 virtual void Output(CYOutput &out, CYFlags flags) const;
75b0a457
JF
1371};
1372
693d501b
JF
1373struct CYObject :
1374 CYLiteral
1375{
3b52fd1a 1376 CYProperty *properties_;
693d501b 1377
ab2aa221 1378 CYObject(CYProperty *properties = NULL) :
3b52fd1a 1379 properties_(properties)
693d501b
JF
1380 {
1381 }
1382
7085e1ab 1383 virtual CYTarget *Replace(CYContext &context);
652ec1ba 1384 void Output(CYOutput &out, CYFlags flags) const;
693d501b
JF
1385};
1386
cf7d4c69 1387struct CYMember :
7085e1ab 1388 CYTarget
cf7d4c69
JF
1389{
1390 CYExpression *object_;
1391 CYExpression *property_;
1392
1393 CYMember(CYExpression *object, CYExpression *property) :
1394 object_(object),
1395 property_(property)
1396 {
1397 }
5999c315 1398
9b5527f0
JF
1399 void SetLeft(CYExpression *object) {
1400 object_ = object;
1401 }
1402};
1403
1404struct CYDirectMember :
1405 CYMember
1406{
1407 CYDirectMember(CYExpression *object, CYExpression *property) :
1408 CYMember(object, property)
1409 {
1410 }
1411
1412 CYPrecedence(1)
1413
7085e1ab 1414 virtual CYTarget *Replace(CYContext &context);
652ec1ba 1415 virtual void Output(CYOutput &out, CYFlags flags) const;
9b5527f0
JF
1416};
1417
1418struct CYIndirectMember :
1419 CYMember
1420{
1421 CYIndirectMember(CYExpression *object, CYExpression *property) :
1422 CYMember(object, property)
1423 {
1424 }
1425
d35a3b07
JF
1426 CYPrecedence(1)
1427
7085e1ab 1428 virtual CYTarget *Replace(CYContext &context);
652ec1ba 1429 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1430};
1431
2eb8215d
JF
1432namespace cy {
1433namespace Syntax {
1434
1435struct New :
7085e1ab 1436 CYTarget
cf7d4c69
JF
1437{
1438 CYExpression *constructor_;
1439 CYArgument *arguments_;
1440
c5b15840 1441 New(CYExpression *constructor, CYArgument *arguments = NULL) :
cf7d4c69
JF
1442 constructor_(constructor),
1443 arguments_(arguments)
1444 {
1445 }
5999c315 1446
9a39f705 1447 virtual int Precedence() const {
fb98ac0c
JF
1448 return arguments_ == NULL ? 2 : 1;
1449 }
1450
d35a3b07 1451
7085e1ab 1452 virtual CYTarget *Replace(CYContext &context);
652ec1ba 1453 virtual void Output(CYOutput &out, CYFlags flags) const;
6c093cce 1454
7085e1ab 1455 virtual CYTarget *AddArgument(CYContext &context, CYExpression *value);
cf7d4c69
JF
1456};
1457
2eb8215d
JF
1458} }
1459
7085e1ab
JF
1460struct CYApply :
1461 CYTarget
cf7d4c69 1462{
cf7d4c69
JF
1463 CYArgument *arguments_;
1464
7085e1ab 1465 CYApply(CYArgument *arguments = NULL) :
cf7d4c69
JF
1466 arguments_(arguments)
1467 {
1468 }
5999c315 1469
fb98ac0c 1470 CYPrecedence(1)
d35a3b07 1471
7085e1ab
JF
1472 virtual CYTarget *AddArgument(CYContext &context, CYExpression *value);
1473};
1474
1475struct CYCall :
1476 CYApply
1477{
1478 CYExpression *function_;
1479
1480 CYCall(CYExpression *function, CYArgument *arguments = NULL) :
1481 CYApply(arguments),
1482 function_(function)
1483 {
1484 }
1485
652ec1ba 1486 virtual void Output(CYOutput &out, CYFlags flags) const;
7085e1ab
JF
1487 virtual CYTarget *Replace(CYContext &context);
1488};
1489
1490struct CYEval :
1491 CYApply
1492{
1493 CYEval(CYArgument *arguments) :
1494 CYApply(arguments)
1495 {
1496 }
6c093cce 1497
7085e1ab
JF
1498 virtual void Output(CYOutput &out, CYFlags flags) const;
1499 virtual CYTarget *Replace(CYContext &context);
6c093cce
JF
1500};
1501
1502struct CYRubyProc;
1503
1504struct CYRubyBlock :
7085e1ab 1505 CYTarget
6c093cce
JF
1506{
1507 CYExpression *call_;
1508 CYRubyProc *proc_;
1509
1510 CYRubyBlock(CYExpression *call, CYRubyProc *proc) :
1511 call_(call),
1512 proc_(proc)
1513 {
1514 }
1515
1516 CYPrecedence(1)
6c093cce 1517
7085e1ab 1518 virtual CYTarget *Replace(CYContext &context);
6c093cce 1519 virtual void Output(CYOutput &out, CYFlags flags) const;
1abe53bf 1520
7085e1ab 1521 virtual CYTarget *AddArgument(CYContext &context, CYExpression *value);
cf7d4c69
JF
1522};
1523
1524struct CYIf :
1525 CYStatement
1526{
1527 CYExpression *test_;
1528 CYStatement *true_;
1529 CYStatement *false_;
1530
3b52fd1a 1531 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false = NULL) :
cf7d4c69
JF
1532 test_(test),
1533 true_(_true),
1534 false_(_false)
1535 {
1536 }
5999c315 1537
efd689d8
JF
1538 CYCompact(Long)
1539
3b52fd1a 1540 virtual CYStatement *Replace(CYContext &context);
fb98ac0c 1541 virtual void Output(CYOutput &out, CYFlags flags) const;
12e37ba3
JF
1542
1543 virtual CYStatement *Return();
cf7d4c69
JF
1544};
1545
1546struct CYDoWhile :
1547 CYStatement
1548{
1549 CYExpression *test_;
1550 CYStatement *code_;
1551
1552 CYDoWhile(CYExpression *test, CYStatement *code) :
1553 test_(test),
1554 code_(code)
1555 {
1556 }
5999c315 1557
efd689d8
JF
1558 CYCompact(None)
1559
3b52fd1a 1560 virtual CYStatement *Replace(CYContext &context);
fb98ac0c 1561 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1562};
1563
1564struct CYWhile :
1565 CYStatement
1566{
1567 CYExpression *test_;
1568 CYStatement *code_;
1569
1570 CYWhile(CYExpression *test, CYStatement *code) :
1571 test_(test),
1572 code_(code)
1573 {
1574 }
5999c315 1575
efd689d8
JF
1576 CYCompact(Long)
1577
3b52fd1a 1578 virtual CYStatement *Replace(CYContext &context);
fb98ac0c 1579 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1580};
1581
a846a8cd 1582struct CYFunction {
b09da87b 1583 CYFunctionParameter *parameters_;
b0385401 1584 CYStatement *code_;
a0be43fc 1585
ab2aa221 1586 CYNonLocal *nonlocal_;
12e37ba3 1587 bool implicit_;
a0be43fc 1588 CYThisScope this_;
c5b15840 1589 CYIdentifier *super_;
cf7d4c69 1590
c5b15840 1591 CYFunction(CYFunctionParameter *parameters, CYStatement *code) :
cf7d4c69 1592 parameters_(parameters),
b0385401 1593 code_(code),
12e37ba3 1594 nonlocal_(NULL),
c5b15840
JF
1595 implicit_(false),
1596 super_(NULL)
cf7d4c69
JF
1597 {
1598 }
5999c315 1599
c5b15840
JF
1600 void Replace(CYContext &context);
1601 void Output(CYOutput &out) const;
fb98ac0c
JF
1602};
1603
1604struct CYFunctionExpression :
1605 CYFunction,
7085e1ab 1606 CYTarget
fb98ac0c 1607{
c5b15840
JF
1608 CYIdentifier *name_;
1609
b0385401 1610 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
c5b15840
JF
1611 CYFunction(parameters, code),
1612 name_(name)
fb98ac0c
JF
1613 {
1614 }
1615
a0be43fc 1616 CYPrecedence(0)
a0be43fc 1617
7085e1ab 1618 CYTarget *Replace(CYContext &context) override;
a0be43fc
JF
1619 virtual void Output(CYOutput &out, CYFlags flags) const;
1620};
1621
a0be43fc
JF
1622struct CYFatArrow :
1623 CYFunction,
1624 CYExpression
1625{
b0385401 1626 CYFatArrow(CYFunctionParameter *parameters, CYStatement *code) :
c5b15840 1627 CYFunction(parameters, code)
a0be43fc
JF
1628 {
1629 }
1630
d35a3b07
JF
1631 CYPrecedence(0)
1632
7085e1ab 1633 CYExpression *Replace(CYContext &context) override;
652ec1ba 1634 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1635};
1636
6c093cce 1637struct CYRubyProc :
6ce0f978 1638 CYFunction,
7085e1ab 1639 CYTarget
6c093cce 1640{
b0385401 1641 CYRubyProc(CYFunctionParameter *parameters, CYStatement *code) :
c5b15840 1642 CYFunction(parameters, code)
6c093cce
JF
1643 {
1644 }
1645
c5b15840 1646 CYPrecedence(0)
c5b15840 1647
7085e1ab 1648 CYTarget *Replace(CYContext &context) override;
6c093cce
JF
1649 virtual void Output(CYOutput &out, CYFlags flags) const;
1650};
1651
fb98ac0c
JF
1652struct CYFunctionStatement :
1653 CYFunction,
b10bd496 1654 CYStatement
cf7d4c69 1655{
c5b15840
JF
1656 CYIdentifier *name_;
1657
b0385401 1658 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *code) :
c5b15840
JF
1659 CYFunction(parameters, code),
1660 name_(name)
cf7d4c69
JF
1661 {
1662 }
5999c315 1663
efd689d8
JF
1664 CYCompact(None)
1665
7085e1ab 1666 CYStatement *Replace(CYContext &context) override;
fb98ac0c 1667 virtual void Output(CYOutput &out, CYFlags flags) const;
5999c315
JF
1668};
1669
c5b15840
JF
1670struct CYPropertyMethod;
1671
1672struct CYMethod :
1673 CYFunction,
1674 CYProperty
1675{
1676 CYMethod(CYPropertyName *name, CYFunctionParameter *parameters, CYStatement *code, CYProperty *next = NULL) :
1677 CYFunction(parameters, code),
1678 CYProperty(name, next)
1679 {
1680 }
1681
1682 virtual CYFunctionExpression *Constructor();
1683
1684 using CYProperty::Replace;
1685 virtual void Replace(CYContext &context);
1686};
1687
1688struct CYPropertyGetter :
1689 CYMethod
1690{
1691 CYPropertyGetter(CYPropertyName *name, CYStatement *code, CYProperty *next = NULL) :
1692 CYMethod(name, NULL, code, next)
1693 {
1694 }
1695
a196a97a 1696 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
c5b15840
JF
1697 virtual void Output(CYOutput &out) const;
1698};
1699
1700struct CYPropertySetter :
1701 CYMethod
1702{
1703 CYPropertySetter(CYPropertyName *name, CYFunctionParameter *parameters, CYStatement *code, CYProperty *next = NULL) :
1704 CYMethod(name, parameters, code, next)
1705 {
1706 }
1707
a196a97a 1708 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
c5b15840
JF
1709 virtual void Output(CYOutput &out) const;
1710};
1711
1712struct CYPropertyMethod :
1713 CYMethod
1714{
1715 CYPropertyMethod(CYPropertyName *name, CYFunctionParameter *parameters, CYStatement *code, CYProperty *next = NULL) :
1716 CYMethod(name, parameters, code, next)
1717 {
1718 }
1719
7b87d205
JF
1720 bool Update() const override;
1721
c5b15840
JF
1722 virtual CYFunctionExpression *Constructor();
1723
a196a97a 1724 virtual void Replace(CYContext &context, CYBuilder &builder, CYExpression *self, CYExpression *name, bool protect);
c5b15840
JF
1725 virtual void Output(CYOutput &out) const;
1726};
1727
1728struct CYClassTail :
1729 CYThing
1730{
1731 CYExpression *extends_;
1732
1733 CYFunctionExpression *constructor_;
1734 CYList<CYProperty> instance_;
1735 CYList<CYProperty> static_;
1736
1737 CYClassTail(CYExpression *extends) :
1738 extends_(extends),
1739 constructor_(NULL)
1740 {
1741 }
1742
1743 void Output(CYOutput &out) const;
1744};
1745
1746struct CYClassExpression :
7085e1ab 1747 CYTarget
c5b15840
JF
1748{
1749 CYIdentifier *name_;
1750 CYClassTail *tail_;
1751
1752 CYClassExpression(CYIdentifier *name, CYClassTail *tail) :
1753 name_(name),
1754 tail_(tail)
1755 {
1756 }
1757
1758 CYPrecedence(0)
c5b15840 1759
7085e1ab 1760 CYTarget *Replace(CYContext &context) override;
c5b15840
JF
1761 virtual void Output(CYOutput &out, CYFlags flags) const;
1762};
1763
1764struct CYClassStatement :
1765 CYStatement
1766{
1767 CYIdentifier *name_;
1768 CYClassTail *tail_;
1769
1770 CYClassStatement(CYIdentifier *name, CYClassTail *tail) :
1771 name_(name),
1772 tail_(tail)
1773 {
1774 }
1775
1776 CYCompact(Long)
1777
7085e1ab 1778 CYStatement *Replace(CYContext &context) override;
c5b15840
JF
1779 virtual void Output(CYOutput &out, CYFlags flags) const;
1780};
1781
1782struct CYSuperCall :
7085e1ab 1783 CYTarget
c5b15840
JF
1784{
1785 CYArgument *arguments_;
1786
1787 CYSuperCall(CYArgument *arguments) :
1788 arguments_(arguments)
1789 {
1790 }
1791
1792 CYPrecedence(2)
c5b15840 1793
7085e1ab 1794 CYTarget *Replace(CYContext &context) override;
c5b15840
JF
1795 virtual void Output(CYOutput &out, CYFlags flags) const;
1796};
1797
1798struct CYSuperAccess :
7085e1ab 1799 CYTarget
c5b15840
JF
1800{
1801 CYExpression *property_;
1802
1803 CYSuperAccess(CYExpression *property) :
1804 property_(property)
1805 {
1806 }
1807
1808 CYPrecedence(1)
c5b15840 1809
7085e1ab 1810 CYTarget *Replace(CYContext &context) override;
c5b15840
JF
1811 virtual void Output(CYOutput &out, CYFlags flags) const;
1812};
1813
5999c315 1814struct CYExpress :
bfd79fae 1815 CYForInitializer
5999c315
JF
1816{
1817 CYExpression *expression_;
1818
1819 CYExpress(CYExpression *expression) :
1820 expression_(expression)
1821 {
fd5cdf97 1822 if (expression_ == NULL)
029bc65b 1823 throw;
5999c315
JF
1824 }
1825
efd689d8
JF
1826 CYCompact(None)
1827
bfd79fae 1828 CYForInitializer *Replace(CYContext &context) override;
fb98ac0c 1829 virtual void Output(CYOutput &out, CYFlags flags) const;
12e37ba3
JF
1830
1831 virtual CYStatement *Return();
cf7d4c69
JF
1832};
1833
1834struct CYContinue :
1835 CYStatement
1836{
1837 CYIdentifier *label_;
1838
1839 CYContinue(CYIdentifier *label) :
1840 label_(label)
1841 {
1842 }
5999c315 1843
efd689d8
JF
1844 CYCompact(Short)
1845
7085e1ab 1846 CYStatement *Replace(CYContext &context) override;
fb98ac0c 1847 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1848};
1849
1850struct CYBreak :
1851 CYStatement
1852{
1853 CYIdentifier *label_;
1854
1855 CYBreak(CYIdentifier *label) :
1856 label_(label)
1857 {
1858 }
5999c315 1859
efd689d8
JF
1860 CYCompact(Short)
1861
7085e1ab 1862 CYStatement *Replace(CYContext &context) override;
fb98ac0c 1863 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1864};
1865
1866struct CYReturn :
1867 CYStatement
1868{
1869 CYExpression *value_;
1870
1871 CYReturn(CYExpression *value) :
1872 value_(value)
1873 {
1874 }
5999c315 1875
efd689d8
JF
1876 CYCompact(None)
1877
7085e1ab 1878 CYStatement *Replace(CYContext &context) override;
9d2b125d
JF
1879 virtual void Output(CYOutput &out, CYFlags flags) const;
1880};
1881
1882struct CYYieldGenerator :
1883 CYExpression
1884{
1885 CYExpression *value_;
1886
1887 CYYieldGenerator(CYExpression *value) :
1888 value_(value)
1889 {
1890 }
1891
1892 CYPrecedence(0)
1893
7085e1ab 1894 CYExpression *Replace(CYContext &context) override;
9d2b125d
JF
1895 virtual void Output(CYOutput &out, CYFlags flags) const;
1896};
1897
1898struct CYYieldValue :
1899 CYExpression
1900{
1901 CYExpression *value_;
1902
1903 CYYieldValue(CYExpression *value) :
1904 value_(value)
1905 {
1906 }
1907
1908 CYPrecedence(0)
1909
1910 virtual CYExpression *Replace(CYContext &context);
fb98ac0c 1911 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1912};
1913
1914struct CYEmpty :
bfd79fae 1915 CYForInitializer
cf7d4c69 1916{
efd689d8
JF
1917 CYCompact(Short)
1918
bfd79fae 1919 virtual CYForInitializer *Replace(CYContext &context);
fb98ac0c 1920 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1921};
1922
96a7e5c2
JF
1923struct CYFinally :
1924 CYThing
1925{
b0385401 1926 CYStatement *code_;
b10bd496 1927
b0385401
JF
1928 CYFinally(CYStatement *code) :
1929 code_(code)
b10bd496
JF
1930 {
1931 }
1932
3b52fd1a 1933 void Replace(CYContext &context);
b10bd496
JF
1934 virtual void Output(CYOutput &out) const;
1935};
1936
3fe283c5
JF
1937struct CYTypeSpecifier :
1938 CYThing
1939{
7085e1ab 1940 virtual CYTarget *Replace(CYContext &context) = 0;
3fe283c5
JF
1941};
1942
03db6a67
JF
1943struct CYTypeError :
1944 CYTypeSpecifier
1945{
1946 CYTypeError() {
1947 }
1948
7085e1ab 1949 virtual CYTarget *Replace(CYContext &context);
03db6a67
JF
1950 virtual void Output(CYOutput &out) const;
1951};
1952
3fe283c5
JF
1953struct CYTypeVoid :
1954 CYTypeSpecifier
1955{
1956 CYTypeVoid() {
1957 }
1958
7085e1ab 1959 virtual CYTarget *Replace(CYContext &context);
3fe283c5
JF
1960 virtual void Output(CYOutput &out) const;
1961};
1962
1963struct CYTypeVariable :
1964 CYTypeSpecifier
1965{
1966 CYIdentifier *name_;
1967
1968 CYTypeVariable(CYIdentifier *name) :
1969 name_(name)
1970 {
1971 }
1972
1973 CYTypeVariable(const char *name) :
1974 name_(new($pool) CYIdentifier(name))
1975 {
1976 }
1977
7085e1ab 1978 virtual CYTarget *Replace(CYContext &context);
3fe283c5
JF
1979 virtual void Output(CYOutput &out) const;
1980};
1981
1982struct CYTypeUnsigned :
1983 CYTypeSpecifier
1984{
1985 CYTypeSpecifier *specifier_;
1986
1987 CYTypeUnsigned(CYTypeSpecifier *specifier) :
1988 specifier_(specifier)
1989 {
1990 }
1991
7085e1ab 1992 virtual CYTarget *Replace(CYContext &context);
3fe283c5
JF
1993 virtual void Output(CYOutput &out) const;
1994};
1995
1996struct CYTypeSigned :
1997 CYTypeSpecifier
1998{
1999 CYTypeSpecifier *specifier_;
2000
2001 CYTypeSigned(CYTypeSpecifier *specifier) :
2002 specifier_(specifier)
2003 {
2004 }
2005
7085e1ab 2006 virtual CYTarget *Replace(CYContext &context);
3fe283c5
JF
2007 virtual void Output(CYOutput &out) const;
2008};
2009
2010struct CYTypeLong :
2011 CYTypeSpecifier
2012{
2013 CYTypeSpecifier *specifier_;
2014
2015 CYTypeLong(CYTypeSpecifier *specifier) :
2016 specifier_(specifier)
2017 {
2018 }
2019
7085e1ab 2020 virtual CYTarget *Replace(CYContext &context);
3fe283c5
JF
2021 virtual void Output(CYOutput &out) const;
2022};
2023
2024struct CYTypeShort :
2025 CYTypeSpecifier
2026{
2027 CYTypeSpecifier *specifier_;
2028
2029 CYTypeShort(CYTypeSpecifier *specifier) :
2030 specifier_(specifier)
2031 {
2032 }
2033
7085e1ab 2034 virtual CYTarget *Replace(CYContext &context);
3fe283c5
JF
2035 virtual void Output(CYOutput &out) const;
2036};
2037
00b4cb83
JF
2038struct CYTypeFunctionWith;
2039
690cf1a8
JF
2040struct CYTypeModifier :
2041 CYNext<CYTypeModifier>
2042{
2043 CYTypeModifier(CYTypeModifier *next) :
2044 CYNext<CYTypeModifier>(next)
2045 {
2046 }
2047
9a39f705
JF
2048 virtual int Precedence() const = 0;
2049
7085e1ab
JF
2050 virtual CYTarget *Replace_(CYContext &context, CYTarget *type) = 0;
2051 CYTarget *Replace(CYContext &context, CYTarget *type);
9a39f705
JF
2052
2053 virtual void Output(CYOutput &out, CYIdentifier *identifier) const = 0;
2054 void Output(CYOutput &out, int precedence, CYIdentifier *identifier) const;
00b4cb83
JF
2055
2056 virtual CYTypeFunctionWith *Function() { return NULL; }
690cf1a8
JF
2057};
2058
2059struct CYTypeArrayOf :
2060 CYTypeModifier
2061{
2062 CYExpression *size_;
2063
2064 CYTypeArrayOf(CYExpression *size, CYTypeModifier *next = NULL) :
2065 CYTypeModifier(next),
2066 size_(size)
2067 {
2068 }
2069
9a39f705 2070 CYPrecedence(1)
690cf1a8 2071
7085e1ab 2072 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
9a39f705 2073 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
690cf1a8
JF
2074};
2075
2076struct CYTypeConstant :
2077 CYTypeModifier
2078{
2079 CYTypeConstant(CYTypeModifier *next = NULL) :
2080 CYTypeModifier(next)
2081 {
2082 }
2083
9a39f705 2084 CYPrecedence(0)
690cf1a8 2085
7085e1ab 2086 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
9a39f705 2087 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
690cf1a8
JF
2088};
2089
2090struct CYTypePointerTo :
2091 CYTypeModifier
2092{
2093 CYTypePointerTo(CYTypeModifier *next = NULL) :
2094 CYTypeModifier(next)
2095 {
2096 }
2097
9a39f705 2098 CYPrecedence(0)
690cf1a8 2099
7085e1ab 2100 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
9a39f705 2101 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
690cf1a8
JF
2102};
2103
9a39f705 2104struct CYTypeVolatile :
690cf1a8
JF
2105 CYTypeModifier
2106{
9a39f705
JF
2107 CYTypeVolatile(CYTypeModifier *next = NULL) :
2108 CYTypeModifier(next)
690cf1a8
JF
2109 {
2110 }
2111
9a39f705 2112 CYPrecedence(0)
690cf1a8 2113
7085e1ab 2114 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
9a39f705 2115 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
690cf1a8
JF
2116};
2117
2118struct CYTypedIdentifier :
60097023
JF
2119 CYNext<CYTypedIdentifier>,
2120 CYThing
690cf1a8 2121{
00b4cb83 2122 CYLocation location_;
690cf1a8 2123 CYIdentifier *identifier_;
3fe283c5 2124 CYTypeSpecifier *specifier_;
9a39f705 2125 CYTypeModifier *modifier_;
690cf1a8 2126
00b4cb83
JF
2127 CYTypedIdentifier(const CYLocation &location, CYIdentifier *identifier = NULL) :
2128 location_(location),
690cf1a8 2129 identifier_(identifier),
3fe283c5 2130 specifier_(NULL),
9a39f705 2131 modifier_(NULL)
690cf1a8
JF
2132 {
2133 }
60097023 2134
3fe283c5 2135 CYTypedIdentifier(CYTypeSpecifier *specifier, CYTypeModifier *modifier = NULL) :
9a39f705 2136 identifier_(NULL),
3fe283c5 2137 specifier_(specifier),
9a39f705
JF
2138 modifier_(modifier)
2139 {
2140 }
2141
2142 inline CYTypedIdentifier *Modify(CYTypeModifier *modifier) {
2143 CYSetLast(modifier_) = modifier;
2144 return this;
2145 }
2146
7085e1ab 2147 virtual CYTarget *Replace(CYContext &context);
60097023 2148 virtual void Output(CYOutput &out) const;
00b4cb83
JF
2149
2150 CYTypeFunctionWith *Function();
690cf1a8
JF
2151};
2152
9a39f705 2153struct CYEncodedType :
7085e1ab 2154 CYTarget
9a39f705
JF
2155{
2156 CYTypedIdentifier *typed_;
2157
2158 CYEncodedType(CYTypedIdentifier *typed) :
2159 typed_(typed)
2160 {
2161 }
2162
2163 CYPrecedence(1)
2164
7085e1ab 2165 virtual CYTarget *Replace(CYContext &context);
9a39f705
JF
2166 virtual void Output(CYOutput &out, CYFlags flags) const;
2167};
2168
690cf1a8 2169struct CYTypedParameter :
9a39f705
JF
2170 CYNext<CYTypedParameter>,
2171 CYThing
690cf1a8
JF
2172{
2173 CYTypedIdentifier *typed_;
2174
2175 CYTypedParameter(CYTypedIdentifier *typed, CYTypedParameter *next) :
2176 CYNext<CYTypedParameter>(next),
2177 typed_(typed)
2178 {
2179 }
2180
663c538f 2181 CYArgument *Argument(CYContext &context);
690cf1a8
JF
2182 CYFunctionParameter *Parameters(CYContext &context);
2183 CYExpression *TypeSignature(CYContext &context, CYExpression *prefix);
9a39f705
JF
2184
2185 virtual void Output(CYOutput &out) const;
690cf1a8
JF
2186};
2187
2188struct CYLambda :
7085e1ab 2189 CYTarget
690cf1a8 2190{
9a39f705 2191 CYTypedIdentifier *typed_;
690cf1a8 2192 CYTypedParameter *parameters_;
b0385401 2193 CYStatement *code_;
690cf1a8 2194
b0385401 2195 CYLambda(CYTypedIdentifier *typed, CYTypedParameter *parameters, CYStatement *code) :
9a39f705 2196 typed_(typed),
690cf1a8 2197 parameters_(parameters),
b0385401 2198 code_(code)
690cf1a8
JF
2199 {
2200 }
2201
2202 CYPrecedence(1)
2203
7085e1ab 2204 virtual CYTarget *Replace(CYContext &context);
690cf1a8
JF
2205 virtual void Output(CYOutput &out, CYFlags flags) const;
2206};
2207
7b750785
JF
2208struct CYModule :
2209 CYNext<CYModule>,
2210 CYThing
2211{
2212 CYWord *part_;
2213
2214 CYModule(CYWord *part, CYModule *next = NULL) :
2215 CYNext<CYModule>(next),
2216 part_(part)
2217 {
2218 }
2219
2220 CYString *Replace(CYContext &context, const char *separator) const;
2221 void Output(CYOutput &out) const;
2222};
2223
2224struct CYImport :
2225 CYStatement
2226{
2227 CYModule *module_;
2228
2229 CYImport(CYModule *module) :
2230 module_(module)
2231 {
2232 }
2233
efd689d8
JF
2234 CYCompact(None)
2235
7b750785
JF
2236 virtual CYStatement *Replace(CYContext &context);
2237 virtual void Output(CYOutput &out, CYFlags flags) const;
2238};
2239
c5587ed7
JF
2240struct CYExternal :
2241 CYStatement
2242{
2243 CYString *abi_;
2244 CYTypedIdentifier *typed_;
2245
2246 CYExternal(CYString *abi, CYTypedIdentifier *typed) :
2247 abi_(abi),
2248 typed_(typed)
2249 {
2250 }
2251
efd689d8
JF
2252 CYCompact(None)
2253
c5587ed7
JF
2254 virtual CYStatement *Replace(CYContext &context);
2255 virtual void Output(CYOutput &out, CYFlags flags) const;
2256};
2257
60097023
JF
2258struct CYTypeDefinition :
2259 CYStatement
2260{
2261 CYTypedIdentifier *typed_;
2262
2263 CYTypeDefinition(CYTypedIdentifier *typed) :
2264 typed_(typed)
2265 {
2266 }
2267
efd689d8
JF
2268 CYCompact(None)
2269
60097023
JF
2270 virtual CYStatement *Replace(CYContext &context);
2271 virtual void Output(CYOutput &out, CYFlags flags) const;
2272};
2273
3fe16be7
JF
2274struct CYTypeBlockWith :
2275 CYTypeModifier
2276{
2277 CYTypedParameter *parameters_;
2278
2279 CYTypeBlockWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
2280 CYTypeModifier(next),
2281 parameters_(parameters)
2282 {
2283 }
2284
2285 CYPrecedence(0)
2286
7085e1ab 2287 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
3fe16be7
JF
2288 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
2289};
2290
663c538f
JF
2291struct CYTypeFunctionWith :
2292 CYTypeModifier
2293{
2294 CYTypedParameter *parameters_;
2295
2296 CYTypeFunctionWith(CYTypedParameter *parameters, CYTypeModifier *next = NULL) :
2297 CYTypeModifier(next),
2298 parameters_(parameters)
2299 {
2300 }
2301
9a39f705 2302 CYPrecedence(1)
663c538f 2303
7085e1ab 2304 virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
9a39f705 2305 virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
00b4cb83
JF
2306
2307 virtual CYTypeFunctionWith *Function() { return this; }
663c538f
JF
2308};
2309
37954781
JF
2310namespace cy {
2311namespace Syntax {
2312
2313struct Catch :
2314 CYThing
2315{
2316 CYIdentifier *name_;
b0385401 2317 CYStatement *code_;
37954781 2318
b0385401 2319 Catch(CYIdentifier *name, CYStatement *code) :
37954781 2320 name_(name),
b0385401 2321 code_(code)
37954781
JF
2322 {
2323 }
2324
2325 void Replace(CYContext &context);
2326 virtual void Output(CYOutput &out) const;
2327};
2328
2329struct Try :
cf7d4c69
JF
2330 CYStatement
2331{
b0385401 2332 CYStatement *code_;
37954781 2333 Catch *catch_;
b10bd496 2334 CYFinally *finally_;
cf7d4c69 2335
b0385401
JF
2336 Try(CYStatement *code, Catch *_catch, CYFinally *finally) :
2337 code_(code),
cf7d4c69
JF
2338 catch_(_catch),
2339 finally_(finally)
2340 {
2341 }
5999c315 2342
efd689d8
JF
2343 CYCompact(Short)
2344
3b52fd1a 2345 virtual CYStatement *Replace(CYContext &context);
fb98ac0c 2346 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
2347};
2348
37954781 2349struct Throw :
cf7d4c69
JF
2350 CYStatement
2351{
2352 CYExpression *value_;
2353
ab2aa221 2354 Throw(CYExpression *value = NULL) :
cf7d4c69
JF
2355 value_(value)
2356 {
2357 }
5999c315 2358
efd689d8
JF
2359 CYCompact(None)
2360
3b52fd1a 2361 virtual CYStatement *Replace(CYContext &context);
fb98ac0c 2362 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
2363};
2364
37954781
JF
2365} }
2366
cf7d4c69
JF
2367struct CYWith :
2368 CYStatement
2369{
2370 CYExpression *scope_;
2371 CYStatement *code_;
2372
2373 CYWith(CYExpression *scope, CYStatement *code) :
2374 scope_(scope),
2375 code_(code)
2376 {
2377 }
5999c315 2378
efd689d8
JF
2379 CYCompact(Long)
2380
3b52fd1a 2381 virtual CYStatement *Replace(CYContext &context);
fb98ac0c 2382 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
2383};
2384
2385struct CYSwitch :
2386 CYStatement
2387{
2388 CYExpression *value_;
2389 CYClause *clauses_;
2390
2391 CYSwitch(CYExpression *value, CYClause *clauses) :
2392 value_(value),
2393 clauses_(clauses)
2394 {
2395 }
5999c315 2396
efd689d8
JF
2397 CYCompact(Long)
2398
3b52fd1a 2399 virtual CYStatement *Replace(CYContext &context);
c8a0500b
JF
2400 virtual void Output(CYOutput &out, CYFlags flags) const;
2401};
2402
2403struct CYDebugger :
2404 CYStatement
2405{
2406 CYDebugger()
2407 {
2408 }
2409
efd689d8
JF
2410 CYCompact(None)
2411
c8a0500b 2412 virtual CYStatement *Replace(CYContext &context);
fb98ac0c 2413 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
2414};
2415
2416struct CYCondition :
2417 CYExpression
2418{
2419 CYExpression *test_;
2420 CYExpression *true_;
2421 CYExpression *false_;
2422
2423 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
91a416e4 2424 test_(test),
cf7d4c69
JF
2425 true_(_true),
2426 false_(_false)
2427 {
2428 }
5999c315 2429
d35a3b07
JF
2430 CYPrecedence(15)
2431
3b52fd1a 2432 virtual CYExpression *Replace(CYContext &context);
652ec1ba 2433 virtual void Output(CYOutput &out, CYFlags flags) const;
5999c315
JF
2434};
2435
2436struct CYAddressOf :
2437 CYPrefix
2438{
2439 CYAddressOf(CYExpression *rhs) :
2440 CYPrefix(rhs)
2441 {
2442 }
2443
2444 virtual const char *Operator() const {
2445 return "&";
2446 }
2447
b09da87b 2448 CYAlphabetic(false)
d35a3b07 2449
3b52fd1a 2450 virtual CYExpression *Replace(CYContext &context);
5999c315
JF
2451};
2452
2453struct CYIndirect :
7085e1ab 2454 CYTarget
5999c315 2455{
7085e1ab
JF
2456 CYExpression *rhs_;
2457
5999c315 2458 CYIndirect(CYExpression *rhs) :
7085e1ab 2459 rhs_(rhs)
5999c315
JF
2460 {
2461 }
2462
7085e1ab
JF
2463 // XXX: this should be checked
2464 CYPrecedence(2)
d35a3b07 2465
7085e1ab
JF
2466 virtual CYTarget *Replace(CYContext &context);
2467 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
2468};
2469
4644480a
JF
2470#define CYReplace \
2471 virtual CYExpression *Replace(CYContext &context);
2472
2473#define CYPostfix_(op, name, args...) \
cf7d4c69
JF
2474 struct CY ## name : \
2475 CYPostfix \
4644480a 2476 { args \
cf7d4c69
JF
2477 CY ## name(CYExpression *lhs) : \
2478 CYPostfix(lhs) \
2479 { \
2480 } \
5999c315
JF
2481 \
2482 virtual const char *Operator() const { \
2483 return op; \
2484 } \
cf7d4c69
JF
2485 };
2486
4644480a 2487#define CYPrefix_(alphabetic, op, name, args...) \
cf7d4c69
JF
2488 struct CY ## name : \
2489 CYPrefix \
4644480a 2490 { args \
cf7d4c69
JF
2491 CY ## name(CYExpression *rhs) : \
2492 CYPrefix(rhs) \
2493 { \
2494 } \
d35a3b07 2495 \
b09da87b 2496 CYAlphabetic(alphabetic) \
5999c315
JF
2497 \
2498 virtual const char *Operator() const { \
2499 return op; \
2500 } \
cf7d4c69
JF
2501 };
2502
4644480a 2503#define CYInfix_(alphabetic, precedence, op, name, args...) \
cf7d4c69
JF
2504 struct CY ## name : \
2505 CYInfix \
4644480a 2506 { args \
cf7d4c69
JF
2507 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
2508 CYInfix(lhs, rhs) \
2509 { \
2510 } \
d35a3b07 2511 \
b09da87b 2512 CYAlphabetic(alphabetic) \
d35a3b07 2513 CYPrecedence(precedence) \
5999c315
JF
2514 \
2515 virtual const char *Operator() const { \
2516 return op; \
2517 } \
cf7d4c69
JF
2518 };
2519
4644480a 2520#define CYAssignment_(op, name, args...) \
cf7d4c69
JF
2521 struct CY ## name ## Assign : \
2522 CYAssignment \
4644480a 2523 { args \
7085e1ab 2524 CY ## name ## Assign(CYTarget *lhs, CYExpression *rhs) : \
cf7d4c69
JF
2525 CYAssignment(lhs, rhs) \
2526 { \
2527 } \
5999c315
JF
2528 \
2529 virtual const char *Operator() const { \
2530 return op; \
2531 } \
cf7d4c69
JF
2532 };
2533
2534CYPostfix_("++", PostIncrement)
2535CYPostfix_("--", PostDecrement)
2536
b09da87b
JF
2537CYPrefix_(true, "delete", Delete)
2538CYPrefix_(true, "void", Void)
2539CYPrefix_(true, "typeof", TypeOf)
2540CYPrefix_(false, "++", PreIncrement)
2541CYPrefix_(false, "--", PreDecrement)
c0bc320e 2542CYPrefix_(false, "+", Affirm)
b09da87b
JF
2543CYPrefix_(false, "-", Negate)
2544CYPrefix_(false, "~", BitwiseNot)
2545CYPrefix_(false, "!", LogicalNot)
2546
62f398e4 2547CYInfix_(false, 5, "*", Multiply, CYReplace)
b09da87b
JF
2548CYInfix_(false, 5, "/", Divide)
2549CYInfix_(false, 5, "%", Modulus)
4644480a 2550CYInfix_(false, 6, "+", Add, CYReplace)
b09da87b
JF
2551CYInfix_(false, 6, "-", Subtract)
2552CYInfix_(false, 7, "<<", ShiftLeft)
2553CYInfix_(false, 7, ">>", ShiftRightSigned)
2554CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
2555CYInfix_(false, 8, "<", Less)
2556CYInfix_(false, 8, ">", Greater)
2557CYInfix_(false, 8, "<=", LessOrEqual)
2558CYInfix_(false, 8, ">=", GreaterOrEqual)
2559CYInfix_(true, 8, "instanceof", InstanceOf)
2560CYInfix_(true, 8, "in", In)
2561CYInfix_(false, 9, "==", Equal)
2562CYInfix_(false, 9, "!=", NotEqual)
2563CYInfix_(false, 9, "===", Identical)
2564CYInfix_(false, 9, "!==", NotIdentical)
2565CYInfix_(false, 10, "&", BitwiseAnd)
2566CYInfix_(false, 11, "^", BitwiseXOr)
2567CYInfix_(false, 12, "|", BitwiseOr)
2568CYInfix_(false, 13, "&&", LogicalAnd)
2569CYInfix_(false, 14, "||", LogicalOr)
cf7d4c69
JF
2570
2571CYAssignment_("=", )
2572CYAssignment_("*=", Multiply)
2573CYAssignment_("/=", Divide)
2574CYAssignment_("%=", Modulus)
2575CYAssignment_("+=", Add)
2576CYAssignment_("-=", Subtract)
2577CYAssignment_("<<=", ShiftLeft)
2578CYAssignment_(">>=", ShiftRightSigned)
2579CYAssignment_(">>>=", ShiftRightUnsigned)
2580CYAssignment_("&=", BitwiseAnd)
2581CYAssignment_("^=", BitwiseXOr)
2582CYAssignment_("|=", BitwiseOr)
2583
c5fa2867 2584#endif/*CYCRIPT_PARSER_HPP*/