]> git.saurik.com Git - cycript.git/blame - Parser.hpp
Updated documentation for new constructor.messages build.
[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
JF
69struct CYThing {
70 virtual void Output(std::ostream &out) const = 0;
71};
72
73_finline std::ostream &operator <<(std::ostream &out, const CYThing &rhs) {
74 rhs.Output(out);
75 return out;
76}
77
5999c315 78struct CYSource :
b1ff2d78 79 CYNext<CYSource>
5999c315 80{
9e562cfc
JF
81 virtual bool IsBlock() const {
82 return next_ != NULL;
83 }
84
b1ff2d78 85 virtual void Show(std::ostream &out) const;
5999c315
JF
86 virtual void Output(std::ostream &out) const = 0;
87 virtual void Output(std::ostream &out, bool block) const;
9e562cfc 88 virtual void Output_(std::ostream &out) const;
5999c315
JF
89};
90
e5bc40db
JF
91struct CYPropertyName {
92 virtual void PropertyName(std::ostream &out) const = 0;
93};
94
95struct CYClassName {
367eebb1 96 virtual void ClassName(std::ostream &out, bool object) const = 0;
63b4c5a8
JF
97};
98
cf7d4c69 99struct CYWord :
e5bc40db
JF
100 CYThing,
101 CYPropertyName,
102 CYClassName
63b4c5a8 103{
cf7d4c69
JF
104 const char *word_;
105
106 CYWord(const char *word) :
107 word_(word)
108 {
109 }
110
5999c315 111 const char *Value() const {
cf7d4c69
JF
112 return word_;
113 }
114
5999c315 115 virtual void Output(std::ostream &out) const;
e5bc40db 116
367eebb1 117 virtual void ClassName(std::ostream &out, bool object) const;
e5bc40db 118 virtual void PropertyName(std::ostream &out) const;
63b4c5a8
JF
119};
120
cf7d4c69
JF
121struct CYIdentifier :
122 CYWord
63b4c5a8 123{
5999c315
JF
124 CYIdentifier(const char *word) :
125 CYWord(word)
126 {
cf7d4c69 127 }
63b4c5a8
JF
128};
129
62014ea9
JF
130struct CYLabel :
131 CYNext<CYLabel>
132{
9e562cfc 133 CYIdentifier *name_;
cf7d4c69 134
9e562cfc 135 CYLabel(CYIdentifier *name, CYLabel *next) :
62014ea9 136 CYNext<CYLabel>(next),
9e562cfc 137 name_(name)
cf7d4c69
JF
138 {
139 }
140};
141
142struct CYStatement :
143 CYSource
63b4c5a8 144{
9e562cfc
JF
145 CYLabel *labels_;
146
147 CYStatement() :
148 labels_(NULL)
149 {
150 }
cf7d4c69
JF
151
152 void AddLabel(CYIdentifier *identifier) {
9e562cfc
JF
153 labels_ = new CYLabel(identifier, labels_);
154 }
155
156 virtual void Output_(std::ostream &out) const;
157};
158
159struct CYBlock :
160 CYStatement
161{
162 CYStatement *statements_;
163
164 CYBlock(CYStatement *statements) :
165 statements_(statements)
166 {
cf7d4c69 167 }
9e562cfc
JF
168
169 virtual bool IsBlock() const {
170 return true;
171 }
172
173 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
174};
175
db5e2840
JF
176enum CYState {
177 CYClear,
178 CYRestricted,
179 CYNewLine
180};
181
5999c315
JF
182class CYDriver {
183 public:
184 CYPool pool_;
e7ed5354 185
db5e2840 186 CYState state_;
e7ed5354
JF
187 void *scanner_;
188
189 const char *data_;
190 size_t size_;
48e3be8a 191 FILE *file_;
e7ed5354 192
5999c315 193 std::string filename_;
e7ed5354 194
5befe15e
JF
195 struct Error {
196 cy::location location_;
197 std::string message_;
198 };
199
200 typedef std::vector<Error> Errors;
201
202 CYSource *source_;
203 Errors errors_;
5999c315
JF
204
205 private:
206 void ScannerInit();
207 void ScannerDestroy();
208
209 public:
210 CYDriver(const std::string &filename);
211 ~CYDriver();
212};
213
dea834b0
JF
214struct CYPart {
215 virtual void Part(std::ostream &out) const = 0;
216};
217
5999c315
JF
218struct CYForInitialiser :
219 CYPart
220{
cf7d4c69
JF
221};
222
5999c315
JF
223struct CYForInInitialiser :
224 CYPart
225{
63b4c5a8
JF
226};
227
b09da87b 228enum CYFlags {
478d4ed0
JF
229 CYNoFlags = 0,
230 CYNoBrace = (1 << 0),
231 CYNoFunction = (1 << 1),
232 CYNoLeader = (1 << 2),
233 CYNoTrailer = (1 << 3),
234 CYNoIn = (1 << 4),
1ef7d061 235 CYNoHyphen = (1 << 5),
365abb0a 236 CYNoBF = (CYNoBrace | CYNoFunction),
b09da87b
JF
237};
238
cf7d4c69 239struct CYExpression :
5999c315 240 CYNext<CYExpression>,
cf7d4c69 241 CYForInitialiser,
e5bc40db
JF
242 CYForInInitialiser,
243 CYClassName
63b4c5a8 244{
d35a3b07 245 virtual unsigned Precedence() const = 0;
5999c315 246 virtual void Part(std::ostream &out) const;
b09da87b
JF
247 virtual void Output(std::ostream &out, CYFlags flags) const = 0;
248 void Output(std::ostream &out, unsigned precedence, CYFlags flags) const;
dea834b0 249
367eebb1 250 virtual void ClassName(std::ostream &out, bool object) const;
e5bc40db 251
dea834b0
JF
252 virtual const char *Word() const {
253 return NULL;
254 }
63b4c5a8
JF
255};
256
b09da87b
JF
257#define CYAlphabetic(value) \
258 virtual bool Alphabetic() const { \
259 return value; \
260 }
261
d35a3b07
JF
262#define CYPrecedence(value) \
263 virtual unsigned Precedence() const { \
264 return value; \
265 }
266
267struct CYCompound :
268 CYExpression
269{
270 CYExpression *expressions_;
271
272 CYCompound(CYExpression *expressions) :
273 expressions_(expressions)
274 {
275 }
276
277 void AddPrev(CYExpression *expression) {
278 CYExpression *last(expression);
279 while (last->next_ != NULL)
280 last = last->next_;
281 last->SetNext(expressions_);
282 expressions_ = expression;
283 }
284
285 CYPrecedence(17)
286
b09da87b 287 void Output(std::ostream &out, CYFlags flags) const;
d35a3b07 288};
5999c315 289
cf7d4c69
JF
290struct CYLiteral :
291 CYExpression
63b4c5a8 292{
d35a3b07 293 CYPrecedence(0)
cf7d4c69 294};
63b4c5a8 295
478d4ed0
JF
296struct CYMagic :
297 CYExpression
298{
299 CYPrecedence(0)
300};
301
62014ea9
JF
302struct CYSelectorPart :
303 CYNext<CYSelectorPart>
e7ed5354
JF
304{
305 CYWord *name_;
306 bool value_;
e7ed5354 307
62014ea9
JF
308 CYSelectorPart(CYWord *name, bool value, CYSelectorPart *next) :
309 CYNext<CYSelectorPart>(next),
e7ed5354 310 name_(name),
62014ea9
JF
311 value_(value)
312 {
313 }
314
315 virtual void Output(std::ostream &out) const;
316};
317
318struct CYSelector :
319 CYLiteral
320{
321 CYSelectorPart *name_;
322
323 CYSelector(CYSelectorPart *name) :
324 name_(name)
e7ed5354
JF
325 {
326 }
327
dea834b0
JF
328 CYPrecedence(1)
329
b09da87b 330 virtual void Output(std::ostream &out, CYFlags flags) const;
e7ed5354
JF
331};
332
dea834b0
JF
333struct CYRange {
334 uint64_t lo_;
335 uint64_t hi_;
336
337 CYRange(uint64_t lo, uint64_t hi) :
338 lo_(lo), hi_(hi)
339 {
340 }
341
342 bool operator [](uint8_t value) const {
343 return !(value >> 7) && (value >> 6 ? hi_ : lo_) >> (value & 0x3f) & 0x1;
344 }
345
346 void operator()(uint8_t value) {
347 if (value >> 7)
348 return;
349 (value >> 6 ? hi_ : lo_) |= uint64_t(0x1) << (value & 0x3f);
350 }
351};
352
283e7e33 353extern CYRange DigitRange_;
dea834b0
JF
354extern CYRange WordStartRange_;
355extern CYRange WordEndRange_;
356
cf7d4c69
JF
357struct CYString :
358 CYLiteral,
e5bc40db 359 CYPropertyName
cf7d4c69
JF
360{
361 const char *value_;
5999c315 362 size_t size_;
cf7d4c69 363
5999c315
JF
364 CYString(const char *value, size_t size) :
365 value_(value),
366 size_(size)
cf7d4c69
JF
367 {
368 }
369
370 CYString(const CYIdentifier *identifier) :
5999c315
JF
371 value_(identifier->Value()),
372 size_(strlen(value_))
cf7d4c69
JF
373 {
374 }
375
5999c315 376 const char *Value() const {
cf7d4c69
JF
377 return value_;
378 }
379
dea834b0
JF
380 virtual const char *Word() const {
381 if (size_ == 0 || !WordStartRange_[value_[0]])
382 return NULL;
383 for (size_t i(1); i != size_; ++i)
384 if (!WordEndRange_[value_[i]])
385 return NULL;
386 return Value();
387 }
388
b09da87b
JF
389 virtual void Output(std::ostream &out) const {
390 return Output(out, CYNoFlags);
391 }
392
393 virtual void Output(std::ostream &out, CYFlags flags) const;
e5bc40db 394 virtual void PropertyName(std::ostream &out) const;
63b4c5a8
JF
395};
396
cf7d4c69 397struct CYNumber :
cf7d4c69 398 CYLiteral,
e5bc40db 399 CYPropertyName
cf7d4c69 400{
5999c315
JF
401 double value_;
402
403 CYNumber(double value) :
404 value_(value)
405 {
406 }
407
408 double Value() const {
409 return value_;
cf7d4c69
JF
410 }
411
b09da87b
JF
412 virtual void Output(std::ostream &out) const {
413 return Output(out, CYNoFlags);
414 }
415
416 virtual void Output(std::ostream &out, CYFlags flags) const;
e5bc40db 417 virtual void PropertyName(std::ostream &out) const;
cf7d4c69
JF
418};
419
420struct CYNull :
421 CYWord,
422 CYLiteral
423{
424 CYNull() :
425 CYWord("null")
426 {
427 }
5999c315 428
b09da87b 429 virtual void Output(std::ostream &out, CYFlags flags) const;
cf7d4c69
JF
430};
431
432struct CYThis :
433 CYWord,
478d4ed0 434 CYMagic
cf7d4c69
JF
435{
436 CYThis() :
437 CYWord("this")
438 {
439 }
5999c315 440
b09da87b 441 virtual void Output(std::ostream &out, CYFlags flags) const;
cf7d4c69
JF
442};
443
444struct CYBoolean :
445 CYLiteral
446{
5999c315 447 virtual bool Value() const = 0;
b09da87b 448 virtual void Output(std::ostream &out, CYFlags flags) const;
cf7d4c69
JF
449};
450
451struct CYFalse :
452 CYWord,
453 CYBoolean
454{
455 CYFalse() :
456 CYWord("false")
457 {
458 }
5999c315 459
b09da87b 460 virtual bool Value() const;
cf7d4c69
JF
461};
462
463struct CYTrue :
464 CYWord,
465 CYBoolean
466{
467 CYTrue() :
468 CYWord("true")
469 {
470 }
5999c315 471
b09da87b 472 virtual bool Value() const;
cf7d4c69
JF
473};
474
475struct CYVariable :
476 CYExpression
477{
478 CYIdentifier *name_;
479
480 CYVariable(CYIdentifier *name) :
481 name_(name)
482 {
483 }
5999c315 484
d35a3b07
JF
485 CYPrecedence(0)
486
b09da87b 487 virtual void Output(std::ostream &out, CYFlags flags) const;
cf7d4c69
JF
488};
489
490struct CYPrefix :
63b4c5a8
JF
491 CYExpression
492{
493 CYExpression *rhs_;
494
cf7d4c69 495 CYPrefix(CYExpression *rhs) :
63b4c5a8
JF
496 rhs_(rhs)
497 {
498 }
5999c315 499
b09da87b 500 virtual bool Alphabetic() const = 0;
5999c315
JF
501 virtual const char *Operator() const = 0;
502
b09da87b 503 virtual void Output(std::ostream &out, CYFlags flags) const;
63b4c5a8
JF
504};
505
cf7d4c69 506struct CYInfix :
63b4c5a8
JF
507 CYExpression
508{
509 CYExpression *lhs_;
510 CYExpression *rhs_;
511
cf7d4c69 512 CYInfix(CYExpression *lhs, CYExpression *rhs) :
63b4c5a8
JF
513 lhs_(lhs),
514 rhs_(rhs)
515 {
516 }
5999c315 517
0ff9f149
JF
518 void SetLeft(CYExpression *lhs) {
519 lhs_ = lhs;
520 }
521
b09da87b 522 virtual bool Alphabetic() const = 0;
5999c315
JF
523 virtual const char *Operator() const = 0;
524
b09da87b 525 virtual void Output(std::ostream &out, CYFlags flags) const;
63b4c5a8
JF
526};
527
cf7d4c69 528struct CYPostfix :
63b4c5a8
JF
529 CYExpression
530{
531 CYExpression *lhs_;
532
cf7d4c69 533 CYPostfix(CYExpression *lhs) :
63b4c5a8
JF
534 lhs_(lhs)
535 {
536 }
5999c315
JF
537
538 virtual const char *Operator() const = 0;
539
b09da87b 540 virtual void Output(std::ostream &out, CYFlags flags) const;
63b4c5a8
JF
541};
542
cf7d4c69 543struct CYAssignment :
d35a3b07 544 CYExpression
cf7d4c69 545{
d35a3b07
JF
546 CYExpression *lhs_;
547 CYExpression *rhs_;
548
cf7d4c69 549 CYAssignment(CYExpression *lhs, CYExpression *rhs) :
d35a3b07
JF
550 lhs_(lhs),
551 rhs_(rhs)
cf7d4c69
JF
552 {
553 }
5999c315 554
0ff9f149
JF
555 void SetLeft(CYExpression *lhs) {
556 lhs_ = lhs;
557 }
558
5999c315 559 virtual const char *Operator() const = 0;
d35a3b07 560
b09da87b 561 virtual void Output(std::ostream &out, CYFlags flags) const;
cf7d4c69
JF
562};
563
62014ea9
JF
564struct CYArgument :
565 CYNext<CYArgument>
566{
cf7d4c69
JF
567 CYWord *name_;
568 CYExpression *value_;
cf7d4c69
JF
569
570 CYArgument(CYWord *name, CYExpression *value, CYArgument *next = NULL) :
62014ea9 571 CYNext<CYArgument>(next),
cf7d4c69 572 name_(name),
62014ea9 573 value_(value)
cf7d4c69
JF
574 {
575 }
5999c315 576
d35a3b07 577 void Output(std::ostream &out) const;
cf7d4c69
JF
578};
579
580struct CYBlank :
581 public CYWord
582{
583 CYBlank() :
584 CYWord("")
585 {
586 }
587};
588
5999c315
JF
589struct CYClause :
590 CYThing,
591 CYNext<CYClause>
592{
cf7d4c69
JF
593 CYExpression *case_;
594 CYStatement *code_;
cf7d4c69
JF
595
596 CYClause(CYExpression *_case, CYStatement *code) :
597 case_(_case),
598 code_(code)
599 {
600 }
601
5999c315 602 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
603};
604
62014ea9
JF
605struct CYElement :
606 CYNext<CYElement>
607{
cf7d4c69 608 CYExpression *value_;
cf7d4c69
JF
609
610 CYElement(CYExpression *value, CYElement *next) :
62014ea9
JF
611 CYNext<CYElement>(next),
612 value_(value)
cf7d4c69
JF
613 {
614 }
5999c315 615
5befe15e
JF
616 void Output(std::ostream &out) const;
617};
618
619struct CYArray :
620 CYLiteral
621{
622 CYElement *elements_;
623
624 CYArray(CYElement *elements) :
625 elements_(elements)
626 {
627 }
628
b09da87b 629 virtual void Output(std::ostream &out, CYFlags flags) const;
cf7d4c69
JF
630};
631
632struct CYDeclaration :
5999c315 633 CYThing,
cf7d4c69
JF
634 CYForInInitialiser
635{
636 CYIdentifier *identifier_;
637 CYExpression *initialiser_;
638
639 CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser) :
640 identifier_(identifier),
641 initialiser_(initialiser)
642 {
643 }
5999c315
JF
644
645 virtual void Part(std::ostream &out) const;
646 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
647};
648
649struct CYDeclarations :
650 CYStatement,
651 CYForInitialiser
652{
653 CYDeclaration *declaration_;
654 CYDeclarations *next_;
655
656 CYDeclarations(CYDeclaration *declaration, CYDeclarations *next) :
657 declaration_(declaration),
658 next_(next)
659 {
660 }
5999c315
JF
661
662 virtual void Part(std::ostream &out) const;
663 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
664};
665
b09da87b
JF
666struct CYField :
667 CYNext<CYField>
668{
669 virtual void Output(std::ostream &out) const;
670};
671
672struct CYMessageParameter :
673 CYNext<CYMessageParameter>
674{
675 CYWord *tag_;
676 CYExpression *type_;
677 CYIdentifier *name_;
678
679 CYMessageParameter(CYWord *tag, CYExpression *type, CYIdentifier *name) :
680 tag_(tag),
681 type_(type),
682 name_(name)
683 {
684 }
685};
686
687struct CYMessage :
e5bc40db 688 CYNext<CYMessage>
b09da87b
JF
689{
690 bool instance_;
691 CYExpression *type_;
692 CYMessageParameter *parameter_;
693 CYSource *body_;
694
695 CYMessage(bool instance, CYExpression *type, CYMessageParameter *parameter, CYSource *body) :
696 instance_(instance),
697 type_(type),
698 parameter_(parameter),
699 body_(body)
700 {
701 }
702
e5bc40db 703 virtual void Output(std::ostream &out, bool replace) const;
b09da87b
JF
704};
705
706struct CYClass :
365abb0a
JF
707 CYExpression,
708 CYStatement
b09da87b 709{
367eebb1 710 CYClassName *name_;
b09da87b
JF
711 CYExpression *super_;
712 CYField *fields_;
713 CYMessage *messages_;
714
367eebb1 715 CYClass(CYClassName *name, CYExpression *super, CYField *fields, CYMessage *messages) :
b09da87b
JF
716 name_(name),
717 super_(super),
718 fields_(fields),
719 messages_(messages)
720 {
721 }
722
367eebb1
JF
723 CYPrecedence(0)
724
365abb0a 725 virtual void Output(std::ostream &out) const;
367eebb1 726 virtual void Output(std::ostream &out, CYFlags flags) const;
b09da87b
JF
727};
728
e5bc40db 729struct CYCategory :
367eebb1 730 CYStatement
e5bc40db
JF
731{
732 CYClassName *name_;
733 CYMessage *messages_;
734
735 CYCategory(CYClassName *name, CYMessage *messages) :
736 name_(name),
737 messages_(messages)
738 {
739 }
740
741 virtual void Output(std::ostream &out) const;
742};
743
b09da87b
JF
744struct CYFunctionParameter :
745 CYNext<CYFunctionParameter>,
5999c315
JF
746 CYThing
747{
cf7d4c69 748 CYIdentifier *name_;
cf7d4c69 749
b09da87b
JF
750 CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next) :
751 CYNext<CYFunctionParameter>(next),
62014ea9 752 name_(name)
cf7d4c69
JF
753 {
754 }
5999c315
JF
755
756 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
757};
758
759struct CYFor :
760 CYStatement
761{
762 CYForInitialiser *initialiser_;
763 CYExpression *test_;
764 CYExpression *increment_;
765 CYStatement *code_;
766
767 CYFor(CYForInitialiser *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
768 initialiser_(initialiser),
769 test_(test),
770 increment_(increment),
771 code_(code)
772 {
773 }
5999c315
JF
774
775 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
776};
777
778struct CYForIn :
779 CYStatement
780{
781 CYForInInitialiser *initialiser_;
782 CYExpression *set_;
783 CYStatement *code_;
784
785 CYForIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
786 initialiser_(initialiser),
787 set_(set),
788 code_(code)
789 {
790 }
5999c315
JF
791
792 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
793};
794
62014ea9
JF
795struct CYProperty :
796 CYNext<CYProperty>
797{
e5bc40db 798 CYPropertyName *name_;
cf7d4c69 799 CYExpression *value_;
cf7d4c69 800
e5bc40db 801 CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next) :
62014ea9 802 CYNext<CYProperty>(next),
cf7d4c69 803 name_(name),
62014ea9 804 value_(value)
cf7d4c69
JF
805 {
806 }
5999c315 807
5999c315 808 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
809};
810
693d501b
JF
811struct CYObject :
812 CYLiteral
813{
814 CYProperty *property_;
815
816 CYObject(CYProperty *property) :
817 property_(property)
818 {
819 }
820
b09da87b 821 void Output(std::ostream &out, CYFlags flags) const;
693d501b
JF
822};
823
5999c315
JF
824struct CYCatch :
825 CYThing
826{
cf7d4c69
JF
827 CYIdentifier *name_;
828 CYStatement *code_;
829
830 CYCatch(CYIdentifier *name, CYStatement *code) :
831 name_(name),
832 code_(code)
833 {
834 }
5999c315
JF
835
836 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
837};
838
b09da87b 839struct CYSend :
63b4c5a8
JF
840 CYExpression
841{
cf7d4c69
JF
842 CYExpression *self_;
843 CYArgument *arguments_;
63b4c5a8 844
b09da87b 845 CYSend(CYExpression *self, CYArgument *arguments) :
cf7d4c69
JF
846 self_(self),
847 arguments_(arguments)
63b4c5a8
JF
848 {
849 }
5999c315 850
d35a3b07
JF
851 CYPrecedence(0)
852
b09da87b 853 virtual void Output(std::ostream &out, CYFlags flags) const;
63b4c5a8
JF
854};
855
cf7d4c69
JF
856struct CYMember :
857 CYExpression
858{
859 CYExpression *object_;
860 CYExpression *property_;
861
862 CYMember(CYExpression *object, CYExpression *property) :
863 object_(object),
864 property_(property)
865 {
866 }
5999c315 867
9b5527f0
JF
868 void SetLeft(CYExpression *object) {
869 object_ = object;
870 }
871};
872
873struct CYDirectMember :
874 CYMember
875{
876 CYDirectMember(CYExpression *object, CYExpression *property) :
877 CYMember(object, property)
878 {
879 }
880
881 CYPrecedence(1)
882
883 virtual void Output(std::ostream &out, CYFlags flags) const;
884};
885
886struct CYIndirectMember :
887 CYMember
888{
889 CYIndirectMember(CYExpression *object, CYExpression *property) :
890 CYMember(object, property)
891 {
892 }
893
d35a3b07
JF
894 CYPrecedence(1)
895
b09da87b 896 virtual void Output(std::ostream &out, CYFlags flags) const;
cf7d4c69
JF
897};
898
899struct CYNew :
900 CYExpression
901{
902 CYExpression *constructor_;
903 CYArgument *arguments_;
904
905 CYNew(CYExpression *constructor, CYArgument *arguments) :
906 constructor_(constructor),
907 arguments_(arguments)
908 {
909 }
5999c315 910
d35a3b07
JF
911 CYPrecedence(1)
912
b09da87b 913 virtual void Output(std::ostream &out, CYFlags flags) const;
cf7d4c69
JF
914};
915
916struct CYCall :
917 CYExpression
918{
919 CYExpression *function_;
920 CYArgument *arguments_;
921
922 CYCall(CYExpression *function, CYArgument *arguments) :
923 function_(function),
924 arguments_(arguments)
925 {
926 }
5999c315 927
d35a3b07
JF
928 CYPrecedence(2)
929
b09da87b 930 virtual void Output(std::ostream &out, CYFlags flags) const;
cf7d4c69
JF
931};
932
933struct CYIf :
934 CYStatement
935{
936 CYExpression *test_;
937 CYStatement *true_;
938 CYStatement *false_;
939
940 CYIf(CYExpression *test, CYStatement *_true, CYStatement *_false) :
941 test_(test),
942 true_(_true),
943 false_(_false)
944 {
945 }
5999c315
JF
946
947 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
948};
949
950struct CYDoWhile :
951 CYStatement
952{
953 CYExpression *test_;
954 CYStatement *code_;
955
956 CYDoWhile(CYExpression *test, CYStatement *code) :
957 test_(test),
958 code_(code)
959 {
960 }
5999c315
JF
961
962 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
963};
964
965struct CYWhile :
966 CYStatement
967{
968 CYExpression *test_;
969 CYStatement *code_;
970
971 CYWhile(CYExpression *test, CYStatement *code) :
972 test_(test),
973 code_(code)
974 {
975 }
5999c315
JF
976
977 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
978};
979
980struct CYLambda :
981 CYExpression
982{
983 CYIdentifier *name_;
b09da87b 984 CYFunctionParameter *parameters_;
cf7d4c69
JF
985 CYSource *body_;
986
b09da87b 987 CYLambda(CYIdentifier *name, CYFunctionParameter *parameters, CYSource *body) :
cf7d4c69
JF
988 name_(name),
989 parameters_(parameters),
990 body_(body)
991 {
992 }
5999c315 993
d35a3b07
JF
994 CYPrecedence(0)
995
b09da87b 996 virtual void Output(std::ostream &out, CYFlags flags) const;
cf7d4c69
JF
997};
998
999struct CYFunction :
5999c315
JF
1000 CYLambda,
1001 CYSource
cf7d4c69 1002{
b09da87b 1003 CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYSource *body) :
cf7d4c69
JF
1004 CYLambda(name, parameters, body)
1005 {
1006 }
5999c315
JF
1007
1008 virtual void Output(std::ostream &out) const;
1009};
1010
1011struct CYExpress :
1012 CYStatement
1013{
1014 CYExpression *expression_;
1015
1016 CYExpress(CYExpression *expression) :
1017 expression_(expression)
1018 {
1019 }
1020
1021 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
1022};
1023
1024struct CYContinue :
1025 CYStatement
1026{
1027 CYIdentifier *label_;
1028
1029 CYContinue(CYIdentifier *label) :
1030 label_(label)
1031 {
1032 }
5999c315
JF
1033
1034 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
1035};
1036
1037struct CYBreak :
1038 CYStatement
1039{
1040 CYIdentifier *label_;
1041
1042 CYBreak(CYIdentifier *label) :
1043 label_(label)
1044 {
1045 }
5999c315
JF
1046
1047 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
1048};
1049
1050struct CYReturn :
1051 CYStatement
1052{
1053 CYExpression *value_;
1054
1055 CYReturn(CYExpression *value) :
1056 value_(value)
1057 {
1058 }
5999c315
JF
1059
1060 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
1061};
1062
1063struct CYEmpty :
1064 CYStatement
1065{
5999c315
JF
1066 virtual void Output(std::ostream &out) const;
1067 virtual void Output(std::ostream &out, bool block) const;
cf7d4c69
JF
1068};
1069
1070struct CYTry :
1071 CYStatement
1072{
1073 CYStatement *try_;
1074 CYCatch *catch_;
1075 CYStatement *finally_;
1076
1077 CYTry(CYStatement *_try, CYCatch *_catch, CYStatement *finally) :
1078 try_(_try),
1079 catch_(_catch),
1080 finally_(finally)
1081 {
1082 }
5999c315
JF
1083
1084 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
1085};
1086
1087struct CYThrow :
1088 CYStatement
1089{
1090 CYExpression *value_;
1091
1092 CYThrow(CYExpression *value) :
1093 value_(value)
1094 {
1095 }
5999c315
JF
1096
1097 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
1098};
1099
1100struct CYWith :
1101 CYStatement
1102{
1103 CYExpression *scope_;
1104 CYStatement *code_;
1105
1106 CYWith(CYExpression *scope, CYStatement *code) :
1107 scope_(scope),
1108 code_(code)
1109 {
1110 }
5999c315
JF
1111
1112 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
1113};
1114
1115struct CYSwitch :
1116 CYStatement
1117{
1118 CYExpression *value_;
1119 CYClause *clauses_;
1120
1121 CYSwitch(CYExpression *value, CYClause *clauses) :
1122 value_(value),
1123 clauses_(clauses)
1124 {
1125 }
5999c315
JF
1126
1127 virtual void Output(std::ostream &out) const;
cf7d4c69
JF
1128};
1129
1130struct CYCondition :
1131 CYExpression
1132{
1133 CYExpression *test_;
1134 CYExpression *true_;
1135 CYExpression *false_;
1136
1137 CYCondition(CYExpression *test, CYExpression *_true, CYExpression *_false) :
91a416e4 1138 test_(test),
cf7d4c69
JF
1139 true_(_true),
1140 false_(_false)
1141 {
1142 }
5999c315 1143
d35a3b07
JF
1144 CYPrecedence(15)
1145
b09da87b 1146 virtual void Output(std::ostream &out, CYFlags flags) const;
5999c315
JF
1147};
1148
1149struct CYAddressOf :
1150 CYPrefix
1151{
1152 CYAddressOf(CYExpression *rhs) :
1153 CYPrefix(rhs)
1154 {
1155 }
1156
1157 virtual const char *Operator() const {
1158 return "&";
1159 }
1160
b09da87b 1161 CYAlphabetic(false)
d35a3b07
JF
1162 CYPrecedence(2)
1163
b09da87b 1164 virtual void Output(std::ostream &out, CYFlags flags) const;
5999c315
JF
1165};
1166
1167struct CYIndirect :
1168 CYPrefix
1169{
1170 CYIndirect(CYExpression *rhs) :
1171 CYPrefix(rhs)
1172 {
1173 }
1174
1175 virtual const char *Operator() const {
1176 return "*";
1177 }
1178
b09da87b 1179 CYAlphabetic(false)
d35a3b07
JF
1180 CYPrecedence(1)
1181
b09da87b 1182 virtual void Output(std::ostream &out, CYFlags flags) const;
cf7d4c69
JF
1183};
1184
1185#define CYPostfix_(op, name) \
1186 struct CY ## name : \
1187 CYPostfix \
1188 { \
1189 CY ## name(CYExpression *lhs) : \
1190 CYPostfix(lhs) \
1191 { \
1192 } \
d35a3b07
JF
1193 \
1194 CYPrecedence(3) \
5999c315
JF
1195 \
1196 virtual const char *Operator() const { \
1197 return op; \
1198 } \
cf7d4c69
JF
1199 };
1200
b09da87b 1201#define CYPrefix_(alphabetic, op, name) \
cf7d4c69
JF
1202 struct CY ## name : \
1203 CYPrefix \
1204 { \
1205 CY ## name(CYExpression *rhs) : \
1206 CYPrefix(rhs) \
1207 { \
1208 } \
d35a3b07 1209 \
b09da87b 1210 CYAlphabetic(alphabetic) \
d35a3b07 1211 CYPrecedence(4) \
5999c315
JF
1212 \
1213 virtual const char *Operator() const { \
1214 return op; \
1215 } \
cf7d4c69
JF
1216 };
1217
b09da87b 1218#define CYInfix_(alphabetic, precedence, op, name) \
cf7d4c69
JF
1219 struct CY ## name : \
1220 CYInfix \
1221 { \
1222 CY ## name(CYExpression *lhs, CYExpression *rhs) : \
1223 CYInfix(lhs, rhs) \
1224 { \
1225 } \
d35a3b07 1226 \
b09da87b 1227 CYAlphabetic(alphabetic) \
d35a3b07 1228 CYPrecedence(precedence) \
5999c315
JF
1229 \
1230 virtual const char *Operator() const { \
1231 return op; \
1232 } \
cf7d4c69
JF
1233 };
1234
1235#define CYAssignment_(op, name) \
1236 struct CY ## name ## Assign : \
1237 CYAssignment \
1238 { \
1239 CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \
1240 CYAssignment(lhs, rhs) \
1241 { \
1242 } \
d35a3b07
JF
1243 \
1244 CYPrecedence(16) \
5999c315
JF
1245 \
1246 virtual const char *Operator() const { \
1247 return op; \
1248 } \
cf7d4c69
JF
1249 };
1250
1251CYPostfix_("++", PostIncrement)
1252CYPostfix_("--", PostDecrement)
1253
b09da87b
JF
1254CYPrefix_(true, "delete", Delete)
1255CYPrefix_(true, "void", Void)
1256CYPrefix_(true, "typeof", TypeOf)
1257CYPrefix_(false, "++", PreIncrement)
1258CYPrefix_(false, "--", PreDecrement)
1259CYPrefix_(false, "-", Negate)
1260CYPrefix_(false, "~", BitwiseNot)
1261CYPrefix_(false, "!", LogicalNot)
1262
1263CYInfix_(false, 5, "*", Multiply)
1264CYInfix_(false, 5, "/", Divide)
1265CYInfix_(false, 5, "%", Modulus)
1266CYInfix_(false, 6, "+", Add)
1267CYInfix_(false, 6, "-", Subtract)
1268CYInfix_(false, 7, "<<", ShiftLeft)
1269CYInfix_(false, 7, ">>", ShiftRightSigned)
1270CYInfix_(false, 7, ">>>", ShiftRightUnsigned)
1271CYInfix_(false, 8, "<", Less)
1272CYInfix_(false, 8, ">", Greater)
1273CYInfix_(false, 8, "<=", LessOrEqual)
1274CYInfix_(false, 8, ">=", GreaterOrEqual)
1275CYInfix_(true, 8, "instanceof", InstanceOf)
1276CYInfix_(true, 8, "in", In)
1277CYInfix_(false, 9, "==", Equal)
1278CYInfix_(false, 9, "!=", NotEqual)
1279CYInfix_(false, 9, "===", Identical)
1280CYInfix_(false, 9, "!==", NotIdentical)
1281CYInfix_(false, 10, "&", BitwiseAnd)
1282CYInfix_(false, 11, "^", BitwiseXOr)
1283CYInfix_(false, 12, "|", BitwiseOr)
1284CYInfix_(false, 13, "&&", LogicalAnd)
1285CYInfix_(false, 14, "||", LogicalOr)
cf7d4c69
JF
1286
1287CYAssignment_("=", )
1288CYAssignment_("*=", Multiply)
1289CYAssignment_("/=", Divide)
1290CYAssignment_("%=", Modulus)
1291CYAssignment_("+=", Add)
1292CYAssignment_("-=", Subtract)
1293CYAssignment_("<<=", ShiftLeft)
1294CYAssignment_(">>=", ShiftRightSigned)
1295CYAssignment_(">>>=", ShiftRightUnsigned)
1296CYAssignment_("&=", BitwiseAnd)
1297CYAssignment_("^=", BitwiseXOr)
1298CYAssignment_("|=", BitwiseOr)
1299
63b4c5a8 1300#endif/*CYPARSER_HPP*/