]> git.saurik.com Git - cycript.git/blame - Parser.hpp
Drastically simplified serializer logic.
[cycript.git] / Parser.hpp
CommitLineData
b4aa79af
JF
1/* Cycript - Remove Execution Server and Disassembler
2 * Copyright (C) 2009 Jay Freeman (saurik)
3*/
4
5/* Modified BSD License {{{ */
6/*
7 * Redistribution and use in source and binary
8 * forms, with or without modification, are permitted
9 * provided that the following conditions are met:
10 *
11 * 1. Redistributions of source code must retain the
12 * above copyright notice, this list of conditions
13 * and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the
15 * above copyright notice, this list of conditions
16 * and the following disclaimer in the documentation
17 * and/or other materials provided with the
18 * distribution.
19 * 3. The name of the author may not be used to endorse
20 * or promote products derived from this software
21 * without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS''
24 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
25 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
26 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
30 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
34 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
36 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37*/
38/* }}} */
39
63b4c5a8
JF
40#ifndef CYPARSER_HPP
41#define CYPARSER_HPP
42
cf7d4c69 43#include <cstdlib>
5999c315 44#include <string>
c3c20102 45#include <vector>
cf7d4c69 46
5befe15e 47#include "location.hh"
5999c315 48#include "Pooling.hpp"
924f67b2 49
5999c315
JF
50template <typename Type_>
51struct CYNext {
52 Type_ *next_;
63b4c5a8 53
5999c315
JF
54 CYNext() :
55 next_(NULL)
56 {
57 }
cf7d4c69 58
62014ea9
JF
59 CYNext(Type_ *next) :
60 next_(next)
61 {
62 }
63
5999c315 64 void SetNext(Type_ *next) {
cf7d4c69
JF
65 next_ = next;
66 }
67};
68
5999c315 69struct CYThing {
652ec1ba 70 virtual void Output(struct CYOutput &out) const = 0;
5999c315
JF
71};
72
652ec1ba
JF
73struct CYOutput {
74 std::ostream &out_;
11c1cc16
JF
75 bool pretty_;
76 unsigned indent_;
652ec1ba 77
96a7e5c2
JF
78 enum {
79 NoMode,
80 NoLetter,
81 NoHyphen,
82 Terminated
83 } mode_;
84
652ec1ba 85 CYOutput(std::ostream &out) :
11c1cc16
JF
86 out_(out),
87 pretty_(false),
96a7e5c2
JF
88 indent_(0),
89 mode_(NoMode)
652ec1ba
JF
90 {
91 }
92
96a7e5c2 93 void Check(char value);
652ec1ba 94
96a7e5c2
JF
95 CYOutput &operator <<(char rhs);
96 CYOutput &operator <<(const char *rhs);
97
98 _finline CYOutput &operator <<(const CYThing *rhs) {
99 if (rhs != NULL)
100 rhs->Output(*this);
652ec1ba
JF
101 return *this;
102 }
103
104 _finline CYOutput &operator <<(const CYThing &rhs) {
105 rhs.Output(*this);
106 return *this;
107 }
11c1cc16
JF
108
109 void Indent();
96a7e5c2 110 void Space();
652ec1ba 111};
5999c315 112
e5bc40db 113struct CYPropertyName {
652ec1ba 114 virtual void PropertyName(CYOutput &out) const = 0;
e5bc40db
JF
115};
116
117struct CYClassName {
652ec1ba 118 virtual void ClassName(CYOutput &out, bool object) const = 0;
63b4c5a8
JF
119};
120
cf7d4c69 121struct CYWord :
e5bc40db
JF
122 CYThing,
123 CYPropertyName,
124 CYClassName
63b4c5a8 125{
cf7d4c69
JF
126 const char *word_;
127
128 CYWord(const char *word) :
129 word_(word)
130 {
131 }
132
5999c315 133 const char *Value() const {
cf7d4c69
JF
134 return word_;
135 }
136
652ec1ba 137 virtual void Output(CYOutput &out) const;
e5bc40db 138
652ec1ba
JF
139 virtual void ClassName(CYOutput &out, bool object) const;
140 virtual void PropertyName(CYOutput &out) const;
63b4c5a8
JF
141};
142
652ec1ba
JF
143_finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) {
144 return lhs << rhs.Value();
145}
146
cf7d4c69
JF
147struct CYIdentifier :
148 CYWord
63b4c5a8 149{
5999c315
JF
150 CYIdentifier(const char *word) :
151 CYWord(word)
152 {
cf7d4c69 153 }
63b4c5a8
JF
154};
155
62014ea9
JF
156struct CYLabel :
157 CYNext<CYLabel>
158{
9e562cfc 159 CYIdentifier *name_;
cf7d4c69 160
9e562cfc 161 CYLabel(CYIdentifier *name, CYLabel *next) :
62014ea9 162 CYNext<CYLabel>(next),
9e562cfc 163 name_(name)
cf7d4c69
JF
164 {
165 }
166};
167
fb98ac0c
JF
168enum CYNeeded {
169 CYNever = -1,
170 CYSometimes = 0,
171 CYAlways = 1,
172};
173
174enum CYFlags {
175 CYNoFlags = 0,
176 CYNoBrace = (1 << 0),
177 CYNoFunction = (1 << 1),
96a7e5c2
JF
178 CYNoIn = (1 << 2),
179 CYNoCall = (1 << 3),
180 CYNoRightHand = (1 << 4),
181 CYNoDangle = (1 << 5),
fb98ac0c
JF
182 CYNoBF = (CYNoBrace | CYNoFunction),
183};
184
cf7d4c69 185struct CYStatement :
b10bd496 186 CYNext<CYStatement>
63b4c5a8 187{
9e562cfc
JF
188 CYLabel *labels_;
189
190 CYStatement() :
191 labels_(NULL)
192 {
193 }
cf7d4c69
JF
194
195 void AddLabel(CYIdentifier *identifier) {
9e562cfc
JF
196 labels_ = new CYLabel(identifier, labels_);
197 }
198
b10bd496
JF
199 virtual bool IsBlock() const {
200 return next_ != NULL;
201 }
202
fb98ac0c
JF
203 virtual void Single(CYOutput &out, CYFlags flags) const;
204 virtual void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const;
205
206 private:
207 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
9e562cfc
JF
208};
209
210struct CYBlock :
211 CYStatement
212{
213 CYStatement *statements_;
214
215 CYBlock(CYStatement *statements) :
216 statements_(statements)
217 {
cf7d4c69 218 }
9e562cfc
JF
219
220 virtual bool IsBlock() const {
221 return true;
222 }
223
fb98ac0c 224 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
225};
226
db5e2840
JF
227enum CYState {
228 CYClear,
229 CYRestricted,
230 CYNewLine
231};
232
5999c315
JF
233class CYDriver {
234 public:
235 CYPool pool_;
e7ed5354 236
db5e2840 237 CYState state_;
e7ed5354
JF
238 void *scanner_;
239
240 const char *data_;
241 size_t size_;
48e3be8a 242 FILE *file_;
e7ed5354 243
b10bd496
JF
244 bool strict_;
245
63cd45c9
JF
246 enum Condition {
247 RegExStart,
248 RegExRest
249 };
250
5999c315 251 std::string filename_;
e7ed5354 252
5befe15e 253 struct Error {
b10bd496 254 bool warning_;
5befe15e
JF
255 cy::location location_;
256 std::string message_;
257 };
258
259 typedef std::vector<Error> Errors;
260
b10bd496 261 CYStatement *program_;
5befe15e 262 Errors errors_;
5999c315
JF
263
264 private:
265 void ScannerInit();
266 void ScannerDestroy();
267
268 public:
269 CYDriver(const std::string &filename);
270 ~CYDriver();
63cd45c9
JF
271
272 void SetCondition(Condition condition);
b10bd496
JF
273
274 void Warning(const cy::location &location, const char *message);
5999c315
JF
275};
276
cac61857 277struct CYForInitialiser {
652ec1ba 278 virtual void For(CYOutput &out) const = 0;
dea834b0
JF
279};
280
cac61857 281struct CYForInInitialiser {
652ec1ba 282 virtual void ForIn(CYOutput &out, CYFlags flags) const = 0;
75b0a457 283 virtual const char *ForEachIn() const = 0;
652ec1ba 284 virtual void ForEachIn(CYOutput &out) const = 0;
b09da87b
JF
285};
286
cf7d4c69 287struct CYExpression :
5999c315 288 CYNext<CYExpression>,
cf7d4c69 289 CYForInitialiser,
e5bc40db 290 CYForInInitialiser,
96a7e5c2
JF
291 CYClassName,
292 CYThing
63b4c5a8 293{
d35a3b07 294 virtual unsigned Precedence() const = 0;
75b0a457 295
fb98ac0c
JF
296 virtual bool RightHand() const {
297 return true;
298 }
299
652ec1ba
JF
300 virtual void For(CYOutput &out) const;
301 virtual void ForIn(CYOutput &out, CYFlags flags) const;
75b0a457 302
cac61857 303 virtual const char *ForEachIn() const;
652ec1ba 304 virtual void ForEachIn(CYOutput &out) const;
75b0a457 305
96a7e5c2 306 virtual void Output(CYOutput &out) const;
652ec1ba
JF
307 virtual void Output(CYOutput &out, CYFlags flags) const = 0;
308 void Output(CYOutput &out, unsigned precedence, CYFlags flags) const;
dea834b0 309
652ec1ba 310 virtual void ClassName(CYOutput &out, bool object) const;
e5bc40db 311
dea834b0
JF
312 virtual const char *Word() const {
313 return NULL;
314 }
63b4c5a8
JF
315};
316
b09da87b
JF
317#define CYAlphabetic(value) \
318 virtual bool Alphabetic() const { \
319 return value; \
320 }
321
d35a3b07
JF
322#define CYPrecedence(value) \
323 virtual unsigned Precedence() const { \
324 return value; \
325 }
326
fb98ac0c
JF
327#define CYRightHand(value) \
328 virtual bool RightHand() const { \
329 return value; \
330 }
331
d35a3b07
JF
332struct CYCompound :
333 CYExpression
334{
335 CYExpression *expressions_;
336
337 CYCompound(CYExpression *expressions) :
338 expressions_(expressions)
339 {
340 }
341
342 void AddPrev(CYExpression *expression) {
343 CYExpression *last(expression);
344 while (last->next_ != NULL)
345 last = last->next_;
346 last->SetNext(expressions_);
347 expressions_ = expression;
348 }
349
350 CYPrecedence(17)
351
652ec1ba 352 void Output(CYOutput &out, CYFlags flags) const;
d35a3b07 353};
5999c315 354
75b0a457 355struct CYComprehension :
96a7e5c2
JF
356 CYNext<CYComprehension>,
357 CYThing
75b0a457 358{
652ec1ba 359 void Output(CYOutput &out) const;
75b0a457
JF
360 virtual const char *Name() const = 0;
361
652ec1ba 362 virtual void Begin_(CYOutput &out) const = 0;
75b0a457 363
652ec1ba 364 virtual void End_(CYOutput &out) const {
75b0a457
JF
365 }
366};
367
368struct CYForInComprehension :
369 CYComprehension
370{
371 CYIdentifier *name_;
372 CYExpression *set_;
373
374 CYForInComprehension(CYIdentifier *name, CYExpression *set) :
375 name_(name),
376 set_(set)
377 {
378 }
379
380 virtual const char *Name() const {
381 return name_->Value();
382 }
383
652ec1ba 384 virtual void Begin_(CYOutput &out) const;
75b0a457
JF
385};
386
387struct CYForEachInComprehension :
388 CYComprehension
389{
390 CYIdentifier *name_;
391 CYExpression *set_;
392
393 CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
394 name_(name),
395 set_(set)
396 {
397 }
398
399 virtual const char *Name() const {
400 return name_->Value();
401 }
402
652ec1ba
JF
403 virtual void Begin_(CYOutput &out) const;
404 virtual void End_(CYOutput &out) const;
75b0a457
JF
405};
406
407struct CYIfComprehension :
408 CYComprehension
409{
410 CYExpression *test_;
411
412 CYIfComprehension(CYExpression *test) :
413 test_(test)
414 {
415 }
416
417 virtual const char *Name() const {
418 return NULL;
419 }
420
652ec1ba 421 virtual void Begin_(CYOutput &out) const;
75b0a457
JF
422};
423
424struct CYArrayComprehension :
425 CYExpression
426{
427 CYExpression *expression_;
428 CYComprehension *comprehensions_;
429
430 CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) :
431 expression_(expression),
432 comprehensions_(comprehensions)
433 {
434 }
435
436 CYPrecedence(0)
437
652ec1ba 438 virtual void Output(CYOutput &out, CYFlags flags) const;
75b0a457
JF
439};
440
cf7d4c69
JF
441struct CYLiteral :
442 CYExpression
63b4c5a8 443{
d35a3b07 444 CYPrecedence(0)
fb98ac0c 445 CYRightHand(false)
cf7d4c69 446};
63b4c5a8 447
478d4ed0
JF
448struct CYMagic :
449 CYExpression
450{
451 CYPrecedence(0)
fb98ac0c 452 CYRightHand(false)
478d4ed0
JF
453};
454
62014ea9 455struct CYSelectorPart :
96a7e5c2
JF
456 CYNext<CYSelectorPart>,
457 CYThing
e7ed5354
JF
458{
459 CYWord *name_;
460 bool value_;
e7ed5354 461
62014ea9
JF
462 CYSelectorPart(CYWord *name, bool value, CYSelectorPart *next) :
463 CYNext<CYSelectorPart>(next),
e7ed5354 464 name_(name),
62014ea9
JF
465 value_(value)
466 {
467 }
468
652ec1ba 469 virtual void Output(CYOutput &out) const;
62014ea9
JF
470};
471
472struct CYSelector :
473 CYLiteral
474{
475 CYSelectorPart *name_;
476
477 CYSelector(CYSelectorPart *name) :
478 name_(name)
e7ed5354
JF
479 {
480 }
481
dea834b0
JF
482 CYPrecedence(1)
483
652ec1ba 484 virtual void Output(CYOutput &out, CYFlags flags) const;
e7ed5354
JF
485};
486
dea834b0
JF
487struct CYRange {
488 uint64_t lo_;
489 uint64_t hi_;
490
491 CYRange(uint64_t lo, uint64_t hi) :
492 lo_(lo), hi_(hi)
493 {
494 }
495
496 bool operator [](uint8_t value) const {
497 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
498 }
499
500 void operator()(uint8_t value) {
501 if (value >> 7)
502 return;
503 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
504 }
505};
506
283e7e33 507extern CYRange DigitRange_;
dea834b0
JF
508extern CYRange WordStartRange_;
509extern CYRange WordEndRange_;
510
cf7d4c69
JF
511struct CYString :
512 CYLiteral,
e5bc40db 513 CYPropertyName
cf7d4c69
JF
514{
515 const char *value_;
5999c315 516 size_t size_;
cf7d4c69 517
5999c315
JF
518 CYString(const char *value, size_t size) :
519 value_(value),
520 size_(size)
cf7d4c69
JF
521 {
522 }
523
524 CYString(const CYIdentifier *identifier) :
5999c315
JF
525 value_(identifier->Value()),
526 size_(strlen(value_))
cf7d4c69
JF
527 {
528 }
529
5999c315 530 const char *Value() const {
cf7d4c69
JF
531 return value_;
532 }
533
11c1cc16 534 virtual const char *Word() const;
dea834b0 535
652ec1ba
JF
536 virtual void Output(CYOutput &out, CYFlags flags) const;
537 virtual void PropertyName(CYOutput &out) const;
63b4c5a8
JF
538};
539
cf7d4c69 540struct CYNumber :
cf7d4c69 541 CYLiteral,
e5bc40db 542 CYPropertyName
cf7d4c69 543{
5999c315
JF
544 double value_;
545
546 CYNumber(double value) :
547 value_(value)
548 {
549 }
550
551 double Value() const {
552 return value_;
cf7d4c69
JF
553 }
554
652ec1ba
JF
555 virtual void Output(CYOutput &out, CYFlags flags) const;
556 virtual void PropertyName(CYOutput &out) const;
cf7d4c69
JF
557};
558
63cd45c9
JF
559struct CYRegEx :
560 CYLiteral
561{
562 const char *value_;
563
564 CYRegEx(const char *value) :
565 value_(value)
566 {
567 }
568
569 const char *Value() const {
570 return value_;
571 }
572
573 virtual void Output(CYOutput &out, CYFlags flags) const;
574};
575
cf7d4c69
JF
576struct CYNull :
577 CYWord,
578 CYLiteral
579{
580 CYNull() :
581 CYWord("null")
582 {
583 }
5999c315 584
652ec1ba 585 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
586};
587
588struct CYThis :
589 CYWord,
478d4ed0 590 CYMagic
cf7d4c69
JF
591{
592 CYThis() :
593 CYWord("this")
594 {
595 }
5999c315 596
652ec1ba 597 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
598};
599
600struct CYBoolean :
601 CYLiteral
602{
5999c315 603 virtual bool Value() const = 0;
652ec1ba 604 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
605};
606
607struct CYFalse :
608 CYWord,
609 CYBoolean
610{
611 CYFalse() :
612 CYWord("false")
613 {
614 }
5999c315 615
11c1cc16
JF
616 virtual bool Value() const {
617 return false;
618 }
cf7d4c69
JF
619};
620
621struct CYTrue :
622 CYWord,
623 CYBoolean
624{
625 CYTrue() :
626 CYWord("true")
627 {
628 }
5999c315 629
11c1cc16
JF
630 virtual bool Value() const {
631 return true;
632 }
cf7d4c69
JF
633};
634
635struct CYVariable :
636 CYExpression
637{
638 CYIdentifier *name_;
639
640 CYVariable(CYIdentifier *name) :
641 name_(name)
642 {
643 }
5999c315 644
d35a3b07 645 CYPrecedence(0)
fb98ac0c 646 CYRightHand(false)
d35a3b07 647
652ec1ba 648 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
649};
650
651struct CYPrefix :
63b4c5a8
JF
652 CYExpression
653{
654 CYExpression *rhs_;
655
cf7d4c69 656 CYPrefix(CYExpression *rhs) :
63b4c5a8
JF
657 rhs_(rhs)
658 {
659 }
5999c315 660
b09da87b 661 virtual bool Alphabetic() const = 0;
5999c315
JF
662 virtual const char *Operator() const = 0;
663
652ec1ba 664 virtual void Output(CYOutput &out, CYFlags flags) const;
63b4c5a8
JF
665};
666
cf7d4c69 667struct CYInfix :
63b4c5a8
JF
668 CYExpression
669{
670 CYExpression *lhs_;
671 CYExpression *rhs_;
672
cf7d4c69 673 CYInfix(CYExpression *lhs, CYExpression *rhs) :
63b4c5a8
JF
674 lhs_(lhs),
675 rhs_(rhs)
676 {
677 }
5999c315 678
0ff9f149
JF
679 void SetLeft(CYExpression *lhs) {
680 lhs_ = lhs;
681 }
682
b09da87b 683 virtual bool Alphabetic() const = 0;
5999c315
JF
684 virtual const char *Operator() const = 0;
685
652ec1ba 686 virtual void Output(CYOutput &out, CYFlags flags) const;
63b4c5a8
JF
687};
688
cf7d4c69 689struct CYPostfix :
63b4c5a8
JF
690 CYExpression
691{
692 CYExpression *lhs_;
693
cf7d4c69 694 CYPostfix(CYExpression *lhs) :
63b4c5a8
JF
695 lhs_(lhs)
696 {
697 }
5999c315
JF
698
699 virtual const char *Operator() const = 0;
700
652ec1ba 701 virtual void Output(CYOutput &out, CYFlags flags) const;
63b4c5a8
JF
702};
703
cf7d4c69 704struct CYAssignment :
d35a3b07 705 CYExpression
cf7d4c69 706{
d35a3b07
JF
707 CYExpression *lhs_;
708 CYExpression *rhs_;
709
cf7d4c69 710 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
d35a3b07
JF
711 lhs_(lhs),
712 rhs_(rhs)
cf7d4c69
JF
713 {
714 }
5999c315 715
0ff9f149
JF
716 void SetLeft(CYExpression *lhs) {
717 lhs_ = lhs;
718 }
719
5999c315 720 virtual const char *Operator() const = 0;
d35a3b07 721
652ec1ba 722 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
723};
724
62014ea9 725struct CYArgument :
96a7e5c2
JF
726 CYNext<CYArgument>,
727 CYThing
62014ea9 728{
cf7d4c69
JF
729 CYWord *name_;
730 CYExpression *value_;
cf7d4c69
JF
731
732 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
62014ea9 733 CYNext<CYArgument>(next),
cf7d4c69 734 name_(name),
62014ea9 735 value_(value)
cf7d4c69
JF
736 {
737 }
5999c315 738
652ec1ba 739 void Output(CYOutput &out) const;
cf7d4c69
JF
740};
741
742struct CYBlank :
743 public CYWord
744{
745 CYBlank() :
746 CYWord("")
747 {
748 }
749};
750
5999c315
JF
751struct CYClause :
752 CYThing,
753 CYNext<CYClause>
754{
cf7d4c69
JF
755 CYExpression *case_;
756 CYStatement *code_;
cf7d4c69
JF
757
758 CYClause(CYExpression *_case, CYStatement *code) :
759 case_(_case),
760 code_(code)
761 {
762 }
763
652ec1ba 764 virtual void Output(CYOutput &out) const;
cf7d4c69
JF
765};
766
62014ea9 767struct CYElement :
96a7e5c2
JF
768 CYNext<CYElement>,
769 CYThing
62014ea9 770{
cf7d4c69 771 CYExpression *value_;
cf7d4c69
JF
772
773 CYElement(CYExpression *value, CYElement *next) :
62014ea9
JF
774 CYNext<CYElement>(next),
775 value_(value)
cf7d4c69
JF
776 {
777 }
5999c315 778
652ec1ba 779 void Output(CYOutput &out) const;
5befe15e
JF
780};
781
782struct CYArray :
783 CYLiteral
784{
785 CYElement *elements_;
786
787 CYArray(CYElement *elements) :
788 elements_(elements)
789 {
790 }
791
652ec1ba 792 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
793};
794
795struct CYDeclaration :
796 CYForInInitialiser
797{
798 CYIdentifier *identifier_;
799 CYExpression *initialiser_;
800
801 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser) :
802 identifier_(identifier),
803 initialiser_(initialiser)
804 {
805 }
5999c315 806
652ec1ba 807 virtual void ForIn(CYOutput &out, CYFlags flags) const;
75b0a457 808
cac61857 809 virtual const char *ForEachIn() const;
652ec1ba 810 virtual void ForEachIn(CYOutput &out) const;
75b0a457 811
652ec1ba 812 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
813};
814
815struct CYDeclarations :
cac61857 816 CYNext<CYDeclarations>,
96a7e5c2
JF
817 CYForInitialiser,
818 CYThing
cf7d4c69
JF
819{
820 CYDeclaration *declaration_;
cf7d4c69
JF
821
822 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next) :
cac61857
JF
823 CYNext<CYDeclarations>(next),
824 declaration_(declaration)
825 {
826 }
827
652ec1ba 828 virtual void For(CYOutput &out) const;
96a7e5c2
JF
829
830 virtual void Output(CYOutput &out) const;
652ec1ba 831 virtual void Output(CYOutput &out, CYFlags flags) const;
cac61857
JF
832};
833
834struct CYVar :
835 CYStatement
836{
837 CYDeclarations *declarations_;
838
839 CYVar(CYDeclarations *declarations) :
840 declarations_(declarations)
841 {
842 }
843
fb98ac0c 844 virtual void Output(CYOutput &out, CYFlags flags) const;
cac61857
JF
845};
846
847struct CYLet :
848 CYStatement
849{
850 CYDeclarations *declarations_;
851 CYStatement *statements_;
852
853 CYLet(CYDeclarations *declarations, CYStatement *statements) :
854 declarations_(declarations),
855 statements_(statements)
cf7d4c69
JF
856 {
857 }
5999c315 858
fb98ac0c 859 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
860};
861
b09da87b
JF
862struct CYField :
863 CYNext<CYField>
864{
652ec1ba 865 virtual void Output(CYOutput &out) const;
b09da87b
JF
866};
867
868struct CYMessageParameter :
869 CYNext<CYMessageParameter>
870{
871 CYWord *tag_;
872 CYExpression *type_;
873 CYIdentifier *name_;
874
875 CYMessageParameter(CYWord *tag, CYExpression *type, CYIdentifier *name) :
876 tag_(tag),
877 type_(type),
878 name_(name)
879 {
880 }
881};
882
883struct CYMessage :
e5bc40db 884 CYNext<CYMessage>
b09da87b
JF
885{
886 bool instance_;
887 CYExpression *type_;
888 CYMessageParameter *parameter_;
b10bd496 889 CYStatement *body_;
b09da87b 890
b10bd496 891 CYMessage(bool instance, CYExpression *type, CYMessageParameter *parameter, CYStatement *body) :
b09da87b
JF
892 instance_(instance),
893 type_(type),
894 parameter_(parameter),
895 body_(body)
896 {
897 }
898
652ec1ba 899 virtual void Output(CYOutput &out, bool replace) const;
b09da87b
JF
900};
901
fb98ac0c 902struct CYClass {
367eebb1 903 CYClassName *name_;
b09da87b
JF
904 CYExpression *super_;
905 CYField *fields_;
906 CYMessage *messages_;
907
367eebb1 908 CYClass(CYClassName *name, CYExpression *super, CYField *fields, CYMessage *messages) :
b09da87b
JF
909 name_(name),
910 super_(super),
911 fields_(fields),
912 messages_(messages)
913 {
914 }
915
fb98ac0c
JF
916 virtual void Output(CYOutput &out, CYFlags flags) const;
917};
918
919struct CYClassExpression :
920 CYClass,
921 CYExpression
922{
923 CYClassExpression(CYClassName *name, CYExpression *super, CYField *fields, CYMessage *messages) :
924 CYClass(name, super, fields, messages)
925 {
926 }
927
367eebb1
JF
928 CYPrecedence(0)
929
fb98ac0c
JF
930 virtual void Output(CYOutput &out, CYFlags flags) const;
931};
932
933struct CYClassStatement :
934 CYClass,
935 CYStatement
936{
937 CYClassStatement(CYClassName *name, CYExpression *super, CYField *fields, CYMessage *messages) :
938 CYClass(name, super, fields, messages)
939 {
940 }
941
652ec1ba 942 virtual void Output(CYOutput &out, CYFlags flags) const;
b09da87b
JF
943};
944
e5bc40db 945struct CYCategory :
367eebb1 946 CYStatement
e5bc40db
JF
947{
948 CYClassName *name_;
949 CYMessage *messages_;
950
951 CYCategory(CYClassName *name, CYMessage *messages) :
952 name_(name),
953 messages_(messages)
954 {
955 }
956
fb98ac0c 957 virtual void Output(CYOutput &out, CYFlags flags) const;
e5bc40db
JF
958};
959
b09da87b
JF
960struct CYFunctionParameter :
961 CYNext<CYFunctionParameter>,
5999c315
JF
962 CYThing
963{
cf7d4c69 964 CYIdentifier *name_;
cf7d4c69 965
b09da87b
JF
966 CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next) :
967 CYNext<CYFunctionParameter>(next),
62014ea9 968 name_(name)
cf7d4c69
JF
969 {
970 }
5999c315 971
652ec1ba 972 virtual void Output(CYOutput &out) const;
cf7d4c69
JF
973};
974
975struct CYFor :
976 CYStatement
977{
978 CYForInitialiser *initialiser_;
979 CYExpression *test_;
980 CYExpression *increment_;
981 CYStatement *code_;
982
983 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
984 initialiser_(initialiser),
985 test_(test),
986 increment_(increment),
987 code_(code)
988 {
989 }
5999c315 990
fb98ac0c 991 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
992};
993
994struct CYForIn :
995 CYStatement
996{
997 CYForInInitialiser *initialiser_;
998 CYExpression *set_;
999 CYStatement *code_;
1000
1001 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1002 initialiser_(initialiser),
1003 set_(set),
1004 code_(code)
1005 {
1006 }
5999c315 1007
fb98ac0c 1008 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1009};
1010
75b0a457
JF
1011struct CYForEachIn :
1012 CYStatement
1013{
1014 CYForInInitialiser *initialiser_;
1015 CYExpression *set_;
1016 CYStatement *code_;
1017
1018 CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
1019 initialiser_(initialiser),
1020 set_(set),
1021 code_(code)
1022 {
1023 }
1024
fb98ac0c 1025 virtual void Output(CYOutput &out, CYFlags flags) const;
75b0a457
JF
1026};
1027
62014ea9 1028struct CYProperty :
96a7e5c2
JF
1029 CYNext<CYProperty>,
1030 CYThing
62014ea9 1031{
e5bc40db 1032 CYPropertyName *name_;
cf7d4c69 1033 CYExpression *value_;
cf7d4c69 1034
e5bc40db 1035 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next) :
62014ea9 1036 CYNext<CYProperty>(next),
cf7d4c69 1037 name_(name),
62014ea9 1038 value_(value)
cf7d4c69
JF
1039 {
1040 }
5999c315 1041
652ec1ba 1042 virtual void Output(CYOutput &out) const;
cf7d4c69
JF
1043};
1044
693d501b
JF
1045struct CYObject :
1046 CYLiteral
1047{
1048 CYProperty *property_;
1049
1050 CYObject(CYProperty *property) :
1051 property_(property)
1052 {
1053 }
1054
652ec1ba 1055 void Output(CYOutput &out, CYFlags flags) const;
693d501b
JF
1056};
1057
5999c315
JF
1058struct CYCatch :
1059 CYThing
1060{
cf7d4c69
JF
1061 CYIdentifier *name_;
1062 CYStatement *code_;
1063
1064 CYCatch(CYIdentifier *name, CYStatement *code) :
1065 name_(name),
1066 code_(code)
1067 {
1068 }
5999c315 1069
652ec1ba 1070 virtual void Output(CYOutput &out) const;
cf7d4c69
JF
1071};
1072
b09da87b 1073struct CYSend :
63b4c5a8
JF
1074 CYExpression
1075{
cf7d4c69
JF
1076 CYExpression *self_;
1077 CYArgument *arguments_;
63b4c5a8 1078
b09da87b 1079 CYSend(CYExpression *self, CYArgument *arguments) :
cf7d4c69
JF
1080 self_(self),
1081 arguments_(arguments)
63b4c5a8
JF
1082 {
1083 }
5999c315 1084
d35a3b07
JF
1085 CYPrecedence(0)
1086
652ec1ba 1087 virtual void Output(CYOutput &out, CYFlags flags) const;
63b4c5a8
JF
1088};
1089
cf7d4c69
JF
1090struct CYMember :
1091 CYExpression
1092{
1093 CYExpression *object_;
1094 CYExpression *property_;
1095
1096 CYMember(CYExpression *object, CYExpression *property) :
1097 object_(object),
1098 property_(property)
1099 {
1100 }
5999c315 1101
9b5527f0
JF
1102 void SetLeft(CYExpression *object) {
1103 object_ = object;
1104 }
1105};
1106
1107struct CYDirectMember :
1108 CYMember
1109{
1110 CYDirectMember(CYExpression *object, CYExpression *property) :
1111 CYMember(object, property)
1112 {
1113 }
1114
1115 CYPrecedence(1)
fb98ac0c 1116 CYRightHand(false)
9b5527f0 1117
652ec1ba 1118 virtual void Output(CYOutput &out, CYFlags flags) const;
9b5527f0
JF
1119};
1120
1121struct CYIndirectMember :
1122 CYMember
1123{
1124 CYIndirectMember(CYExpression *object, CYExpression *property) :
1125 CYMember(object, property)
1126 {
1127 }
1128
d35a3b07 1129 CYPrecedence(1)
fb98ac0c 1130 CYRightHand(false)
d35a3b07 1131
652ec1ba 1132 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1133};
1134
1135struct CYNew :
1136 CYExpression
1137{
1138 CYExpression *constructor_;
1139 CYArgument *arguments_;
1140
1141 CYNew(CYExpression *constructor, CYArgument *arguments) :
1142 constructor_(constructor),
1143 arguments_(arguments)
1144 {
1145 }
5999c315 1146
fb98ac0c
JF
1147 virtual unsigned Precedence() const {
1148 return arguments_ == NULL ? 2 : 1;
1149 }
1150
1151 CYRightHand(false)
d35a3b07 1152
652ec1ba 1153 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1154};
1155
1156struct CYCall :
1157 CYExpression
1158{
1159 CYExpression *function_;
1160 CYArgument *arguments_;
1161
1162 CYCall(CYExpression *function, CYArgument *arguments) :
1163 function_(function),
1164 arguments_(arguments)
1165 {
1166 }
5999c315 1167
fb98ac0c
JF
1168 CYPrecedence(1)
1169 CYRightHand(false)
d35a3b07 1170
652ec1ba 1171 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1172};
1173
1174struct CYIf :
1175 CYStatement
1176{
1177 CYExpression *test_;
1178 CYStatement *true_;
1179 CYStatement *false_;
1180
1181 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false) :
1182 test_(test),
1183 true_(_true),
1184 false_(_false)
1185 {
1186 }
5999c315 1187
fb98ac0c 1188 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1189};
1190
1191struct CYDoWhile :
1192 CYStatement
1193{
1194 CYExpression *test_;
1195 CYStatement *code_;
1196
1197 CYDoWhile(CYExpression *test, CYStatement *code) :
1198 test_(test),
1199 code_(code)
1200 {
1201 }
5999c315 1202
fb98ac0c 1203 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1204};
1205
1206struct CYWhile :
1207 CYStatement
1208{
1209 CYExpression *test_;
1210 CYStatement *code_;
1211
1212 CYWhile(CYExpression *test, CYStatement *code) :
1213 test_(test),
1214 code_(code)
1215 {
1216 }
5999c315 1217
fb98ac0c 1218 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1219};
1220
fb98ac0c 1221struct CYFunction {
cf7d4c69 1222 CYIdentifier *name_;
b09da87b 1223 CYFunctionParameter *parameters_;
b10bd496 1224 CYStatement *body_;
cf7d4c69 1225
fb98ac0c 1226 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *body) :
cf7d4c69
JF
1227 name_(name),
1228 parameters_(parameters),
1229 body_(body)
1230 {
1231 }
5999c315 1232
fb98ac0c
JF
1233 virtual void Output(CYOutput &out, CYFlags flags) const;
1234};
1235
1236struct CYFunctionExpression :
1237 CYFunction,
1238 CYExpression
1239{
1240 CYFunctionExpression(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *body) :
1241 CYFunction(name, parameters, body)
1242 {
1243 }
1244
d35a3b07 1245 CYPrecedence(0)
fb98ac0c 1246 CYRightHand(false)
d35a3b07 1247
652ec1ba 1248 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1249};
1250
fb98ac0c
JF
1251struct CYFunctionStatement :
1252 CYFunction,
b10bd496 1253 CYStatement
cf7d4c69 1254{
fb98ac0c
JF
1255 CYFunctionStatement(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *body) :
1256 CYFunction(name, parameters, body)
cf7d4c69
JF
1257 {
1258 }
5999c315 1259
fb98ac0c 1260 virtual void Output(CYOutput &out, CYFlags flags) const;
5999c315
JF
1261};
1262
1263struct CYExpress :
1264 CYStatement
1265{
1266 CYExpression *expression_;
1267
1268 CYExpress(CYExpression *expression) :
1269 expression_(expression)
1270 {
1271 }
1272
fb98ac0c 1273 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1274};
1275
1276struct CYContinue :
1277 CYStatement
1278{
1279 CYIdentifier *label_;
1280
1281 CYContinue(CYIdentifier *label) :
1282 label_(label)
1283 {
1284 }
5999c315 1285
fb98ac0c 1286 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1287};
1288
1289struct CYBreak :
1290 CYStatement
1291{
1292 CYIdentifier *label_;
1293
1294 CYBreak(CYIdentifier *label) :
1295 label_(label)
1296 {
1297 }
5999c315 1298
fb98ac0c 1299 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1300};
1301
1302struct CYReturn :
1303 CYStatement
1304{
1305 CYExpression *value_;
1306
1307 CYReturn(CYExpression *value) :
1308 value_(value)
1309 {
1310 }
5999c315 1311
fb98ac0c 1312 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1313};
1314
1315struct CYEmpty :
1316 CYStatement
1317{
fb98ac0c 1318 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1319};
1320
96a7e5c2
JF
1321struct CYFinally :
1322 CYThing
1323{
b10bd496
JF
1324 CYStatement *code_;
1325
1326 CYFinally(CYStatement *code) :
1327 code_(code)
1328 {
1329 }
1330
1331 virtual void Output(CYOutput &out) const;
1332};
1333
cf7d4c69
JF
1334struct CYTry :
1335 CYStatement
1336{
b10bd496 1337 CYStatement *code_;
cf7d4c69 1338 CYCatch *catch_;
b10bd496 1339 CYFinally *finally_;
cf7d4c69 1340
b10bd496
JF
1341 CYTry(CYStatement *code, CYCatch *_catch, CYFinally *finally) :
1342 code_(code),
cf7d4c69
JF
1343 catch_(_catch),
1344 finally_(finally)
1345 {
1346 }
5999c315 1347
fb98ac0c 1348 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1349};
1350
1351struct CYThrow :
1352 CYStatement
1353{
1354 CYExpression *value_;
1355
1356 CYThrow(CYExpression *value) :
1357 value_(value)
1358 {
1359 }
5999c315 1360
fb98ac0c 1361 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1362};
1363
1364struct CYWith :
1365 CYStatement
1366{
1367 CYExpression *scope_;
1368 CYStatement *code_;
1369
1370 CYWith(CYExpression *scope, CYStatement *code) :
1371 scope_(scope),
1372 code_(code)
1373 {
1374 }
5999c315 1375
fb98ac0c 1376 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1377};
1378
1379struct CYSwitch :
1380 CYStatement
1381{
1382 CYExpression *value_;
1383 CYClause *clauses_;
1384
1385 CYSwitch(CYExpression *value, CYClause *clauses) :
1386 value_(value),
1387 clauses_(clauses)
1388 {
1389 }
5999c315 1390
fb98ac0c 1391 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1392};
1393
1394struct CYCondition :
1395 CYExpression
1396{
1397 CYExpression *test_;
1398 CYExpression *true_;
1399 CYExpression *false_;
1400
1401 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
91a416e4 1402 test_(test),
cf7d4c69
JF
1403 true_(_true),
1404 false_(_false)
1405 {
1406 }
5999c315 1407
d35a3b07
JF
1408 CYPrecedence(15)
1409
652ec1ba 1410 virtual void Output(CYOutput &out, CYFlags flags) const;
5999c315
JF
1411};
1412
1413struct CYAddressOf :
1414 CYPrefix
1415{
1416 CYAddressOf(CYExpression *rhs) :
1417 CYPrefix(rhs)
1418 {
1419 }
1420
1421 virtual const char *Operator() const {
1422 return "&";
1423 }
1424
b09da87b 1425 CYAlphabetic(false)
d35a3b07
JF
1426 CYPrecedence(2)
1427
652ec1ba 1428 virtual void Output(CYOutput &out, CYFlags flags) const;
5999c315
JF
1429};
1430
1431struct CYIndirect :
1432 CYPrefix
1433{
1434 CYIndirect(CYExpression *rhs) :
1435 CYPrefix(rhs)
1436 {
1437 }
1438
1439 virtual const char *Operator() const {
1440 return "*";
1441 }
1442
b09da87b 1443 CYAlphabetic(false)
d35a3b07
JF
1444 CYPrecedence(1)
1445
652ec1ba 1446 virtual void Output(CYOutput &out, CYFlags flags) const;
cf7d4c69
JF
1447};
1448
1449#define CYPostfix_(op, name) \
1450 struct CY ## name : \
1451 CYPostfix \
1452 { \
1453 CY ## name(CYExpression *lhs) : \
1454 CYPostfix(lhs) \
1455 { \
1456 } \
d35a3b07
JF
1457 \
1458 CYPrecedence(3) \
5999c315
JF
1459 \
1460 virtual const char *Operator() const { \
1461 return op; \
1462 } \
cf7d4c69
JF
1463 };
1464
b09da87b 1465#define CYPrefix_(alphabetic, op, name) \
cf7d4c69
JF
1466 struct CY ## name : \
1467 CYPrefix \
1468 { \
1469 CY ## name(CYExpression *rhs) : \
1470 CYPrefix(rhs) \
1471 { \
1472 } \
d35a3b07 1473 \
b09da87b 1474 CYAlphabetic(alphabetic) \
d35a3b07 1475 CYPrecedence(4) \
5999c315
JF
1476 \
1477 virtual const char *Operator() const { \
1478 return op; \
1479 } \
cf7d4c69
JF
1480 };
1481
b09da87b 1482#define CYInfix_(alphabetic, precedence, op, name) \
cf7d4c69
JF
1483 struct CY ## name : \
1484 CYInfix \
1485 { \
1486 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
1487 CYInfix(lhs, rhs) \
1488 { \
1489 } \
d35a3b07 1490 \
b09da87b 1491 CYAlphabetic(alphabetic) \
d35a3b07 1492 CYPrecedence(precedence) \
5999c315
JF
1493 \
1494 virtual const char *Operator() const { \
1495 return op; \
1496 } \
cf7d4c69
JF
1497 };
1498
1499#define CYAssignment_(op, name) \
1500 struct CY ## name ## Assign : \
1501 CYAssignment \
1502 { \
1503 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
1504 CYAssignment(lhs, rhs) \
1505 { \
1506 } \
d35a3b07
JF
1507 \
1508 CYPrecedence(16) \
5999c315
JF
1509 \
1510 virtual const char *Operator() const { \
1511 return op; \
1512 } \
cf7d4c69
JF
1513 };
1514
1515CYPostfix_("++", PostIncrement)
1516CYPostfix_("--", PostDecrement)
1517
b09da87b
JF
1518CYPrefix_(true, "delete", Delete)
1519CYPrefix_(true, "void", Void)
1520CYPrefix_(true, "typeof", TypeOf)
1521CYPrefix_(false, "++", PreIncrement)
1522CYPrefix_(false, "--", PreDecrement)
1523CYPrefix_(false, "-", Negate)
1524CYPrefix_(false, "~", BitwiseNot)
1525CYPrefix_(false, "!", LogicalNot)
1526
1527CYInfix_(false, 5, "*", Multiply)
1528CYInfix_(false, 5, "/", Divide)
1529CYInfix_(false, 5, "%", Modulus)
1530CYInfix_(false, 6, "+", Add)
1531CYInfix_(false, 6, "-", Subtract)
1532CYInfix_(false, 7, "<<", ShiftLeft)
1533CYInfix_(false, 7, ">>", ShiftRightSigned)
1534CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
1535CYInfix_(false, 8, "<", Less)
1536CYInfix_(false, 8, ">", Greater)
1537CYInfix_(false, 8, "<=", LessOrEqual)
1538CYInfix_(false, 8, ">=", GreaterOrEqual)
1539CYInfix_(true, 8, "instanceof", InstanceOf)
1540CYInfix_(true, 8, "in", In)
1541CYInfix_(false, 9, "==", Equal)
1542CYInfix_(false, 9, "!=", NotEqual)
1543CYInfix_(false, 9, "===", Identical)
1544CYInfix_(false, 9, "!==", NotIdentical)
1545CYInfix_(false, 10, "&", BitwiseAnd)
1546CYInfix_(false, 11, "^", BitwiseXOr)
1547CYInfix_(false, 12, "|", BitwiseOr)
1548CYInfix_(false, 13, "&&", LogicalAnd)
1549CYInfix_(false, 14, "||", LogicalOr)
cf7d4c69
JF
1550
1551CYAssignment_("=", )
1552CYAssignment_("*=", Multiply)
1553CYAssignment_("/=", Divide)
1554CYAssignment_("%=", Modulus)
1555CYAssignment_("+=", Add)
1556CYAssignment_("-=", Subtract)
1557CYAssignment_("<<=", ShiftLeft)
1558CYAssignment_(">>=", ShiftRightSigned)
1559CYAssignment_(">>>=", ShiftRightUnsigned)
1560CYAssignment_("&=", BitwiseAnd)
1561CYAssignment_("^=", BitwiseXOr)
1562CYAssignment_("|=", BitwiseOr)
1563
63b4c5a8 1564#endif/*CYPARSER_HPP*/