bison
[m6w6/ext-psi] / src / calc / oper.h
1 /*******************************************************************************
2 Copyright (c) 2016, Michael Wallner <mike@php.net>.
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
7
8 * Redistributions of source code must retain the above copyright notice,
9 this list of conditions and the following disclaimer.
10 * Redistributions in binary form must reproduce the above copyright
11 notice, this list of conditions and the following disclaimer in the
12 documentation and/or other materials provided with the distribution.
13
14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
18 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
21 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 *******************************************************************************/
25
26 #include "php_psi_stdinc.h"
27 #include <assert.h>
28
29 #include "token.h"
30
31 static inline int psi_calc_oper(token_t op1, token_t op2)
32 {
33 if (PSI_T_LPAREN == op2) {
34 return -1;
35 } else if (PSI_T_LPAREN == op1) {
36 return 1;
37 } else if (op1 == op2) {
38 return 0;
39 } else if (!op1 || op1 == PSI_T_NUMBER) {
40 return 1;
41 } else if (!op2 || op2 == PSI_T_NUMBER) {
42 return -1;
43 }
44
45 switch (op1) {
46 case PSI_T_NOT:
47 switch (op2) {
48 case PSI_T_NOT:
49 return 0;
50 case PSI_T_TILDE:
51 return 0;
52 case PSI_T_CAST:
53 return 0;
54 case PSI_T_ASTERISK:
55 return -1;
56 case PSI_T_SLASH:
57 return -1;
58 case PSI_T_MODULO:
59 return -1;
60 case PSI_T_PLUS:
61 return -1;
62 case PSI_T_MINUS:
63 return -1;
64 case PSI_T_LSHIFT:
65 return -1;
66 case PSI_T_RSHIFT:
67 return -1;
68 case PSI_T_LCHEVR:
69 return -1;
70 case PSI_T_CMP_LE:
71 return -1;
72 case PSI_T_RCHEVR:
73 return -1;
74 case PSI_T_CMP_GE:
75 return -1;
76 case PSI_T_AMPERSAND:
77 return -1;
78 case PSI_T_CMP_EQ:
79 return -1;
80 case PSI_T_CMP_NE:
81 return -1;
82 case PSI_T_CARET:
83 return -1;
84 case PSI_T_PIPE:
85 return -1;
86 case PSI_T_AND:
87 return -1;
88 case PSI_T_OR:
89 return -1;
90 default:
91 assert(0);
92 break;
93 }
94 break;
95
96 case PSI_T_TILDE:
97 switch (op2) {
98 case PSI_T_NOT:
99 return 0;
100 case PSI_T_TILDE:
101 return 0;
102 case PSI_T_CAST:
103 return 0;
104 case PSI_T_ASTERISK:
105 return -1;
106 case PSI_T_SLASH:
107 return -1;
108 case PSI_T_MODULO:
109 return -1;
110 case PSI_T_PLUS:
111 return -1;
112 case PSI_T_MINUS:
113 return -1;
114 case PSI_T_LSHIFT:
115 return -1;
116 case PSI_T_RSHIFT:
117 return -1;
118 case PSI_T_LCHEVR:
119 return -1;
120 case PSI_T_CMP_LE:
121 return -1;
122 case PSI_T_RCHEVR:
123 return -1;
124 case PSI_T_CMP_GE:
125 return -1;
126 case PSI_T_AMPERSAND:
127 return -1;
128 case PSI_T_CMP_EQ:
129 return -1;
130 case PSI_T_CMP_NE:
131 return -1;
132 case PSI_T_CARET:
133 return -1;
134 case PSI_T_PIPE:
135 return -1;
136 case PSI_T_AND:
137 return -1;
138 case PSI_T_OR:
139 return -1;
140 default:
141 assert(0);
142 break;
143 }
144 break;
145
146 case PSI_T_CAST:
147 switch (op2) {
148 case PSI_T_NOT:
149 return 0;
150 case PSI_T_TILDE:
151 return 0;
152 case PSI_T_CAST:
153 return 0;
154 case PSI_T_ASTERISK:
155 return -1;
156 case PSI_T_SLASH:
157 return -1;
158 case PSI_T_MODULO:
159 return -1;
160 case PSI_T_PLUS:
161 return -1;
162 case PSI_T_MINUS:
163 return -1;
164 case PSI_T_LSHIFT:
165 return -1;
166 case PSI_T_RSHIFT:
167 return -1;
168 case PSI_T_LCHEVR:
169 return -1;
170 case PSI_T_CMP_LE:
171 return -1;
172 case PSI_T_RCHEVR:
173 return -1;
174 case PSI_T_CMP_GE:
175 return -1;
176 case PSI_T_AMPERSAND:
177 return -1;
178 case PSI_T_CMP_EQ:
179 return -1;
180 case PSI_T_CMP_NE:
181 return -1;
182 case PSI_T_CARET:
183 return -1;
184 case PSI_T_PIPE:
185 return -1;
186 case PSI_T_AND:
187 return -1;
188 case PSI_T_OR:
189 return -1;
190 default:
191 assert(0);
192 break;
193 }
194 break;
195
196 case PSI_T_ASTERISK:
197 switch (op2) {
198 case PSI_T_NOT:
199 return 1;
200 case PSI_T_TILDE:
201 return 1;
202 case PSI_T_CAST:
203 return 1;
204 case PSI_T_ASTERISK:
205 return 0;
206 case PSI_T_SLASH:
207 return 0;
208 case PSI_T_MODULO:
209 return 0;
210 case PSI_T_PLUS:
211 return -1;
212 case PSI_T_MINUS:
213 return -1;
214 case PSI_T_LSHIFT:
215 return -1;
216 case PSI_T_RSHIFT:
217 return -1;
218 case PSI_T_LCHEVR:
219 return -1;
220 case PSI_T_CMP_LE:
221 return -1;
222 case PSI_T_RCHEVR:
223 return -1;
224 case PSI_T_CMP_GE:
225 return -1;
226 case PSI_T_AMPERSAND:
227 return -1;
228 case PSI_T_CMP_EQ:
229 return -1;
230 case PSI_T_CMP_NE:
231 return -1;
232 case PSI_T_CARET:
233 return -1;
234 case PSI_T_PIPE:
235 return -1;
236 case PSI_T_AND:
237 return -1;
238 case PSI_T_OR:
239 return -1;
240 default:
241 assert(0);
242 break;
243 }
244 break;
245
246 case PSI_T_SLASH:
247 switch (op2) {
248 case PSI_T_NOT:
249 return 1;
250 case PSI_T_TILDE:
251 return 1;
252 case PSI_T_CAST:
253 return 1;
254 case PSI_T_ASTERISK:
255 return 0;
256 case PSI_T_SLASH:
257 return 0;
258 case PSI_T_MODULO:
259 return 0;
260 case PSI_T_PLUS:
261 return -1;
262 case PSI_T_MINUS:
263 return -1;
264 case PSI_T_LSHIFT:
265 return -1;
266 case PSI_T_RSHIFT:
267 return -1;
268 case PSI_T_LCHEVR:
269 return -1;
270 case PSI_T_CMP_LE:
271 return -1;
272 case PSI_T_RCHEVR:
273 return -1;
274 case PSI_T_CMP_GE:
275 return -1;
276 case PSI_T_AMPERSAND:
277 return -1;
278 case PSI_T_CMP_EQ:
279 return -1;
280 case PSI_T_CMP_NE:
281 return -1;
282 case PSI_T_CARET:
283 return -1;
284 case PSI_T_PIPE:
285 return -1;
286 case PSI_T_AND:
287 return -1;
288 case PSI_T_OR:
289 return -1;
290 default:
291 assert(0);
292 break;
293 }
294 break;
295
296 case PSI_T_MODULO:
297 switch (op2) {
298 case PSI_T_NOT:
299 return 1;
300 case PSI_T_TILDE:
301 return 1;
302 case PSI_T_CAST:
303 return 1;
304 case PSI_T_ASTERISK:
305 return 0;
306 case PSI_T_SLASH:
307 return 0;
308 case PSI_T_MODULO:
309 return 0;
310 case PSI_T_PLUS:
311 return -1;
312 case PSI_T_MINUS:
313 return -1;
314 case PSI_T_LSHIFT:
315 return -1;
316 case PSI_T_RSHIFT:
317 return -1;
318 case PSI_T_LCHEVR:
319 return -1;
320 case PSI_T_CMP_LE:
321 return -1;
322 case PSI_T_RCHEVR:
323 return -1;
324 case PSI_T_CMP_GE:
325 return -1;
326 case PSI_T_AMPERSAND:
327 return -1;
328 case PSI_T_CMP_EQ:
329 return -1;
330 case PSI_T_CMP_NE:
331 return -1;
332 case PSI_T_CARET:
333 return -1;
334 case PSI_T_PIPE:
335 return -1;
336 case PSI_T_AND:
337 return -1;
338 case PSI_T_OR:
339 return -1;
340 default:
341 assert(0);
342 break;
343 }
344 break;
345
346 case PSI_T_PLUS:
347 switch (op2) {
348 case PSI_T_NOT:
349 return 1;
350 case PSI_T_TILDE:
351 return 1;
352 case PSI_T_CAST:
353 return 1;
354 case PSI_T_ASTERISK:
355 return 1;
356 case PSI_T_SLASH:
357 return 1;
358 case PSI_T_MODULO:
359 return 1;
360 case PSI_T_PLUS:
361 return 0;
362 case PSI_T_MINUS:
363 return 0;
364 case PSI_T_LSHIFT:
365 return -1;
366 case PSI_T_RSHIFT:
367 return -1;
368 case PSI_T_LCHEVR:
369 return -1;
370 case PSI_T_CMP_LE:
371 return -1;
372 case PSI_T_RCHEVR:
373 return -1;
374 case PSI_T_CMP_GE:
375 return -1;
376 case PSI_T_AMPERSAND:
377 return -1;
378 case PSI_T_CMP_EQ:
379 return -1;
380 case PSI_T_CMP_NE:
381 return -1;
382 case PSI_T_CARET:
383 return -1;
384 case PSI_T_PIPE:
385 return -1;
386 case PSI_T_AND:
387 return -1;
388 case PSI_T_OR:
389 return -1;
390 default:
391 assert(0);
392 break;
393 }
394 break;
395
396 case PSI_T_MINUS:
397 switch (op2) {
398 case PSI_T_NOT:
399 return 1;
400 case PSI_T_TILDE:
401 return 1;
402 case PSI_T_CAST:
403 return 1;
404 case PSI_T_ASTERISK:
405 return 1;
406 case PSI_T_SLASH:
407 return 1;
408 case PSI_T_MODULO:
409 return 1;
410 case PSI_T_PLUS:
411 return 0;
412 case PSI_T_MINUS:
413 return 0;
414 case PSI_T_LSHIFT:
415 return -1;
416 case PSI_T_RSHIFT:
417 return -1;
418 case PSI_T_LCHEVR:
419 return -1;
420 case PSI_T_CMP_LE:
421 return -1;
422 case PSI_T_RCHEVR:
423 return -1;
424 case PSI_T_CMP_GE:
425 return -1;
426 case PSI_T_AMPERSAND:
427 return -1;
428 case PSI_T_CMP_EQ:
429 return -1;
430 case PSI_T_CMP_NE:
431 return -1;
432 case PSI_T_CARET:
433 return -1;
434 case PSI_T_PIPE:
435 return -1;
436 case PSI_T_AND:
437 return -1;
438 case PSI_T_OR:
439 return -1;
440 default:
441 assert(0);
442 break;
443 }
444 break;
445
446 case PSI_T_LSHIFT:
447 switch (op2) {
448 case PSI_T_NOT:
449 return 1;
450 case PSI_T_TILDE:
451 return 1;
452 case PSI_T_CAST:
453 return 1;
454 case PSI_T_ASTERISK:
455 return 1;
456 case PSI_T_SLASH:
457 return 1;
458 case PSI_T_MODULO:
459 return 1;
460 case PSI_T_PLUS:
461 return 1;
462 case PSI_T_MINUS:
463 return 1;
464 case PSI_T_LSHIFT:
465 return 0;
466 case PSI_T_RSHIFT:
467 return 0;
468 case PSI_T_LCHEVR:
469 return -1;
470 case PSI_T_CMP_LE:
471 return -1;
472 case PSI_T_RCHEVR:
473 return -1;
474 case PSI_T_CMP_GE:
475 return -1;
476 case PSI_T_AMPERSAND:
477 return -1;
478 case PSI_T_CMP_EQ:
479 return -1;
480 case PSI_T_CMP_NE:
481 return -1;
482 case PSI_T_CARET:
483 return -1;
484 case PSI_T_PIPE:
485 return -1;
486 case PSI_T_AND:
487 return -1;
488 case PSI_T_OR:
489 return -1;
490 default:
491 assert(0);
492 break;
493 }
494 break;
495
496 case PSI_T_RSHIFT:
497 switch (op2) {
498 case PSI_T_NOT:
499 return 1;
500 case PSI_T_TILDE:
501 return 1;
502 case PSI_T_CAST:
503 return 1;
504 case PSI_T_ASTERISK:
505 return 1;
506 case PSI_T_SLASH:
507 return 1;
508 case PSI_T_MODULO:
509 return 1;
510 case PSI_T_PLUS:
511 return 1;
512 case PSI_T_MINUS:
513 return 1;
514 case PSI_T_LSHIFT:
515 return 0;
516 case PSI_T_RSHIFT:
517 return 0;
518 case PSI_T_LCHEVR:
519 return -1;
520 case PSI_T_CMP_LE:
521 return -1;
522 case PSI_T_RCHEVR:
523 return -1;
524 case PSI_T_CMP_GE:
525 return -1;
526 case PSI_T_AMPERSAND:
527 return -1;
528 case PSI_T_CMP_EQ:
529 return -1;
530 case PSI_T_CMP_NE:
531 return -1;
532 case PSI_T_CARET:
533 return -1;
534 case PSI_T_PIPE:
535 return -1;
536 case PSI_T_AND:
537 return -1;
538 case PSI_T_OR:
539 return -1;
540 default:
541 assert(0);
542 break;
543 }
544 break;
545
546 case PSI_T_LCHEVR:
547 switch (op2) {
548 case PSI_T_NOT:
549 return 1;
550 case PSI_T_TILDE:
551 return 1;
552 case PSI_T_CAST:
553 return 1;
554 case PSI_T_ASTERISK:
555 return 1;
556 case PSI_T_SLASH:
557 return 1;
558 case PSI_T_MODULO:
559 return 1;
560 case PSI_T_PLUS:
561 return 1;
562 case PSI_T_MINUS:
563 return 1;
564 case PSI_T_LSHIFT:
565 return 1;
566 case PSI_T_RSHIFT:
567 return 1;
568 case PSI_T_LCHEVR:
569 return 0;
570 case PSI_T_CMP_LE:
571 return 0;
572 case PSI_T_RCHEVR:
573 return 0;
574 case PSI_T_CMP_GE:
575 return 0;
576 case PSI_T_AMPERSAND:
577 return -1;
578 case PSI_T_CMP_EQ:
579 return -1;
580 case PSI_T_CMP_NE:
581 return -1;
582 case PSI_T_CARET:
583 return -1;
584 case PSI_T_PIPE:
585 return -1;
586 case PSI_T_AND:
587 return -1;
588 case PSI_T_OR:
589 return -1;
590 default:
591 assert(0);
592 break;
593 }
594 break;
595
596 case PSI_T_CMP_LE:
597 switch (op2) {
598 case PSI_T_NOT:
599 return 1;
600 case PSI_T_TILDE:
601 return 1;
602 case PSI_T_CAST:
603 return 1;
604 case PSI_T_ASTERISK:
605 return 1;
606 case PSI_T_SLASH:
607 return 1;
608 case PSI_T_MODULO:
609 return 1;
610 case PSI_T_PLUS:
611 return 1;
612 case PSI_T_MINUS:
613 return 1;
614 case PSI_T_LSHIFT:
615 return 1;
616 case PSI_T_RSHIFT:
617 return 1;
618 case PSI_T_LCHEVR:
619 return 0;
620 case PSI_T_CMP_LE:
621 return 0;
622 case PSI_T_RCHEVR:
623 return 0;
624 case PSI_T_CMP_GE:
625 return 0;
626 case PSI_T_AMPERSAND:
627 return -1;
628 case PSI_T_CMP_EQ:
629 return -1;
630 case PSI_T_CMP_NE:
631 return -1;
632 case PSI_T_CARET:
633 return -1;
634 case PSI_T_PIPE:
635 return -1;
636 case PSI_T_AND:
637 return -1;
638 case PSI_T_OR:
639 return -1;
640 default:
641 assert(0);
642 break;
643 }
644 break;
645
646 case PSI_T_RCHEVR:
647 switch (op2) {
648 case PSI_T_NOT:
649 return 1;
650 case PSI_T_TILDE:
651 return 1;
652 case PSI_T_CAST:
653 return 1;
654 case PSI_T_ASTERISK:
655 return 1;
656 case PSI_T_SLASH:
657 return 1;
658 case PSI_T_MODULO:
659 return 1;
660 case PSI_T_PLUS:
661 return 1;
662 case PSI_T_MINUS:
663 return 1;
664 case PSI_T_LSHIFT:
665 return 1;
666 case PSI_T_RSHIFT:
667 return 1;
668 case PSI_T_LCHEVR:
669 return 0;
670 case PSI_T_CMP_LE:
671 return 0;
672 case PSI_T_RCHEVR:
673 return 0;
674 case PSI_T_CMP_GE:
675 return 0;
676 case PSI_T_AMPERSAND:
677 return -1;
678 case PSI_T_CMP_EQ:
679 return -1;
680 case PSI_T_CMP_NE:
681 return -1;
682 case PSI_T_CARET:
683 return -1;
684 case PSI_T_PIPE:
685 return -1;
686 case PSI_T_AND:
687 return -1;
688 case PSI_T_OR:
689 return -1;
690 default:
691 assert(0);
692 break;
693 }
694 break;
695
696 case PSI_T_CMP_GE:
697 switch (op2) {
698 case PSI_T_NOT:
699 return 1;
700 case PSI_T_TILDE:
701 return 1;
702 case PSI_T_CAST:
703 return 1;
704 case PSI_T_ASTERISK:
705 return 1;
706 case PSI_T_SLASH:
707 return 1;
708 case PSI_T_MODULO:
709 return 1;
710 case PSI_T_PLUS:
711 return 1;
712 case PSI_T_MINUS:
713 return 1;
714 case PSI_T_LSHIFT:
715 return 1;
716 case PSI_T_RSHIFT:
717 return 1;
718 case PSI_T_LCHEVR:
719 return 0;
720 case PSI_T_CMP_LE:
721 return 0;
722 case PSI_T_RCHEVR:
723 return 0;
724 case PSI_T_CMP_GE:
725 return 0;
726 case PSI_T_AMPERSAND:
727 return -1;
728 case PSI_T_CMP_EQ:
729 return -1;
730 case PSI_T_CMP_NE:
731 return -1;
732 case PSI_T_CARET:
733 return -1;
734 case PSI_T_PIPE:
735 return -1;
736 case PSI_T_AND:
737 return -1;
738 case PSI_T_OR:
739 return -1;
740 default:
741 assert(0);
742 break;
743 }
744 break;
745
746 case PSI_T_AMPERSAND:
747 switch (op2) {
748 case PSI_T_NOT:
749 return 1;
750 case PSI_T_TILDE:
751 return 1;
752 case PSI_T_CAST:
753 return 1;
754 case PSI_T_ASTERISK:
755 return 1;
756 case PSI_T_SLASH:
757 return 1;
758 case PSI_T_MODULO:
759 return 1;
760 case PSI_T_PLUS:
761 return 1;
762 case PSI_T_MINUS:
763 return 1;
764 case PSI_T_LSHIFT:
765 return 1;
766 case PSI_T_RSHIFT:
767 return 1;
768 case PSI_T_LCHEVR:
769 return 1;
770 case PSI_T_CMP_LE:
771 return 1;
772 case PSI_T_RCHEVR:
773 return 1;
774 case PSI_T_CMP_GE:
775 return 1;
776 case PSI_T_AMPERSAND:
777 return 0;
778 case PSI_T_CMP_EQ:
779 return -1;
780 case PSI_T_CMP_NE:
781 return -1;
782 case PSI_T_CARET:
783 return -1;
784 case PSI_T_PIPE:
785 return -1;
786 case PSI_T_AND:
787 return -1;
788 case PSI_T_OR:
789 return -1;
790 default:
791 assert(0);
792 break;
793 }
794 break;
795
796 case PSI_T_CMP_EQ:
797 switch (op2) {
798 case PSI_T_NOT:
799 return 1;
800 case PSI_T_TILDE:
801 return 1;
802 case PSI_T_CAST:
803 return 1;
804 case PSI_T_ASTERISK:
805 return 1;
806 case PSI_T_SLASH:
807 return 1;
808 case PSI_T_MODULO:
809 return 1;
810 case PSI_T_PLUS:
811 return 1;
812 case PSI_T_MINUS:
813 return 1;
814 case PSI_T_LSHIFT:
815 return 1;
816 case PSI_T_RSHIFT:
817 return 1;
818 case PSI_T_LCHEVR:
819 return 1;
820 case PSI_T_CMP_LE:
821 return 1;
822 case PSI_T_RCHEVR:
823 return 1;
824 case PSI_T_CMP_GE:
825 return 1;
826 case PSI_T_AMPERSAND:
827 return 1;
828 case PSI_T_CMP_EQ:
829 return 0;
830 case PSI_T_CMP_NE:
831 return 0;
832 case PSI_T_CARET:
833 return -1;
834 case PSI_T_PIPE:
835 return -1;
836 case PSI_T_AND:
837 return -1;
838 case PSI_T_OR:
839 return -1;
840 default:
841 assert(0);
842 break;
843 }
844 break;
845
846 case PSI_T_CMP_NE:
847 switch (op2) {
848 case PSI_T_NOT:
849 return 1;
850 case PSI_T_TILDE:
851 return 1;
852 case PSI_T_CAST:
853 return 1;
854 case PSI_T_ASTERISK:
855 return 1;
856 case PSI_T_SLASH:
857 return 1;
858 case PSI_T_MODULO:
859 return 1;
860 case PSI_T_PLUS:
861 return 1;
862 case PSI_T_MINUS:
863 return 1;
864 case PSI_T_LSHIFT:
865 return 1;
866 case PSI_T_RSHIFT:
867 return 1;
868 case PSI_T_LCHEVR:
869 return 1;
870 case PSI_T_CMP_LE:
871 return 1;
872 case PSI_T_RCHEVR:
873 return 1;
874 case PSI_T_CMP_GE:
875 return 1;
876 case PSI_T_AMPERSAND:
877 return 1;
878 case PSI_T_CMP_EQ:
879 return 0;
880 case PSI_T_CMP_NE:
881 return 0;
882 case PSI_T_CARET:
883 return -1;
884 case PSI_T_PIPE:
885 return -1;
886 case PSI_T_AND:
887 return -1;
888 case PSI_T_OR:
889 return -1;
890 default:
891 assert(0);
892 break;
893 }
894 break;
895
896 case PSI_T_CARET:
897 switch (op2) {
898 case PSI_T_NOT:
899 return 1;
900 case PSI_T_TILDE:
901 return 1;
902 case PSI_T_CAST:
903 return 1;
904 case PSI_T_ASTERISK:
905 return 1;
906 case PSI_T_SLASH:
907 return 1;
908 case PSI_T_MODULO:
909 return 1;
910 case PSI_T_PLUS:
911 return 1;
912 case PSI_T_MINUS:
913 return 1;
914 case PSI_T_LSHIFT:
915 return 1;
916 case PSI_T_RSHIFT:
917 return 1;
918 case PSI_T_LCHEVR:
919 return 1;
920 case PSI_T_CMP_LE:
921 return 1;
922 case PSI_T_RCHEVR:
923 return 1;
924 case PSI_T_CMP_GE:
925 return 1;
926 case PSI_T_AMPERSAND:
927 return 1;
928 case PSI_T_CMP_EQ:
929 return 1;
930 case PSI_T_CMP_NE:
931 return 1;
932 case PSI_T_CARET:
933 return 0;
934 case PSI_T_PIPE:
935 return -1;
936 case PSI_T_AND:
937 return -1;
938 case PSI_T_OR:
939 return -1;
940 default:
941 assert(0);
942 break;
943 }
944 break;
945
946 case PSI_T_PIPE:
947 switch (op2) {
948 case PSI_T_NOT:
949 return 1;
950 case PSI_T_TILDE:
951 return 1;
952 case PSI_T_CAST:
953 return 1;
954 case PSI_T_ASTERISK:
955 return 1;
956 case PSI_T_SLASH:
957 return 1;
958 case PSI_T_MODULO:
959 return 1;
960 case PSI_T_PLUS:
961 return 1;
962 case PSI_T_MINUS:
963 return 1;
964 case PSI_T_LSHIFT:
965 return 1;
966 case PSI_T_RSHIFT:
967 return 1;
968 case PSI_T_LCHEVR:
969 return 1;
970 case PSI_T_CMP_LE:
971 return 1;
972 case PSI_T_RCHEVR:
973 return 1;
974 case PSI_T_CMP_GE:
975 return 1;
976 case PSI_T_AMPERSAND:
977 return 1;
978 case PSI_T_CMP_EQ:
979 return 1;
980 case PSI_T_CMP_NE:
981 return 1;
982 case PSI_T_CARET:
983 return 1;
984 case PSI_T_PIPE:
985 return 0;
986 case PSI_T_AND:
987 return -1;
988 case PSI_T_OR:
989 return -1;
990 default:
991 assert(0);
992 break;
993 }
994 break;
995
996 case PSI_T_AND:
997 switch (op2) {
998 case PSI_T_NOT:
999 return 1;
1000 case PSI_T_TILDE:
1001 return 1;
1002 case PSI_T_CAST:
1003 return 1;
1004 case PSI_T_ASTERISK:
1005 return 1;
1006 case PSI_T_SLASH:
1007 return 1;
1008 case PSI_T_MODULO:
1009 return 1;
1010 case PSI_T_PLUS:
1011 return 1;
1012 case PSI_T_MINUS:
1013 return 1;
1014 case PSI_T_LSHIFT:
1015 return 1;
1016 case PSI_T_RSHIFT:
1017 return 1;
1018 case PSI_T_LCHEVR:
1019 return 1;
1020 case PSI_T_CMP_LE:
1021 return 1;
1022 case PSI_T_RCHEVR:
1023 return 1;
1024 case PSI_T_CMP_GE:
1025 return 1;
1026 case PSI_T_AMPERSAND:
1027 return 1;
1028 case PSI_T_CMP_EQ:
1029 return 1;
1030 case PSI_T_CMP_NE:
1031 return 1;
1032 case PSI_T_CARET:
1033 return 1;
1034 case PSI_T_PIPE:
1035 return 1;
1036 case PSI_T_AND:
1037 return 0;
1038 case PSI_T_OR:
1039 return -1;
1040 default:
1041 assert(0);
1042 break;
1043 }
1044 break;
1045
1046 case PSI_T_OR:
1047 switch (op2) {
1048 case PSI_T_NOT:
1049 return 1;
1050 case PSI_T_TILDE:
1051 return 1;
1052 case PSI_T_CAST:
1053 return 1;
1054 case PSI_T_ASTERISK:
1055 return 1;
1056 case PSI_T_SLASH:
1057 return 1;
1058 case PSI_T_MODULO:
1059 return 1;
1060 case PSI_T_PLUS:
1061 return 1;
1062 case PSI_T_MINUS:
1063 return 1;
1064 case PSI_T_LSHIFT:
1065 return 1;
1066 case PSI_T_RSHIFT:
1067 return 1;
1068 case PSI_T_LCHEVR:
1069 return 1;
1070 case PSI_T_CMP_LE:
1071 return 1;
1072 case PSI_T_RCHEVR:
1073 return 1;
1074 case PSI_T_CMP_GE:
1075 return 1;
1076 case PSI_T_AMPERSAND:
1077 return 1;
1078 case PSI_T_CMP_EQ:
1079 return 1;
1080 case PSI_T_CMP_NE:
1081 return 1;
1082 case PSI_T_CARET:
1083 return 1;
1084 case PSI_T_PIPE:
1085 return 1;
1086 case PSI_T_AND:
1087 return 1;
1088 case PSI_T_OR:
1089 return 0;
1090 default:
1091 assert(0);
1092 break;
1093 }
1094 break;
1095
1096 default:
1097 assert(0);
1098 break;
1099 }
1100 return 0;
1101 }