1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdarg.h>
4 #include <ctype.h>
5 #include <string.h>
12 IDENT,
13 MODULE,
14 SEMICOLON,
15 END,
16 DOT,
17 VAR,
18 COLON,
19 BEGIN,
20 ASSIGN,
21 INTEGER,
22 TRUE,
23 FALSE,
24 LPAREN,
25 RPAREN,
26 EQUAL,
27 NEQ,
28 LESS,
29 LEQ,
30 GREAT,
31 GEQ,
32 PLUS,
33 MINUS,
34 OR,
35 STAR,
36 SLASH,
37 DIV,
38 MOD,
39 AND,
40 NOT,
41 PROCEDURE
42 };
44 // =======================================================================
45 // UTILS
46 // =======================================================================
48 void
50 {
61 }
63 // =======================================================================
64 // TABLE
65 // =======================================================================
69 {
72 {
74 }
77 }
81 {
84 {
86 }
89 }
91 static void
93 {
96 {
98 }
101 {
103 }
112 }
114 // =======================================================================
115 // SCANER
116 // =======================================================================
118 static void
120 {
123 }
125 static void
127 {
131 }
133 static void
135 {
141 {
145 }
157 {
159 }
161 {
163 }
165 {
167 }
169 {
171 }
173 {
175 }
177 {
179 }
181 {
183 }
185 {
187 }
189 {
191 }
193 {
195 }
196 }
198 static void
200 {
206 {
210 }
221 }
223 static void
225 {
227 {
229 }
230 }
232 static void
234 {
237 {
249 {
252 }
278 {
281 }
287 {
290 }
319 }
320 }
322 static void
324 {
329 {
331 }
333 {
335 }
336 else
337 {
339 }
340 }
342 // =======================================================================
343 // EXPRESSION
344 // =======================================================================
352 oberon_new_operator(int op, oberon_type_t * result, oberon_expr_t * left, oberon_expr_t * right)
353 {
365 }
369 {
379 }
383 {
390 {
392 {
394 }
397 }
399 {
401 {
403 }
406 }
407 else
408 {
410 }
413 }
417 {
423 {
428 {
430 }
461 }
464 }
466 /*
467 * oberon_autocast_binary_op автоматически переобразовывеат тип по след. правилам:
468 * 1. Классы обоих типов должны быть одинаковы
469 * 2. В качестве результата должен быть выбран больший тип.
470 * 3. Если размер результат не должен быть меньше чем базовый int
471 */
473 static void
474 oberon_autocast_binary_op(oberon_context_t * ctx, oberon_type_t * a, oberon_type_t * b, oberon_type_t ** result)
475 {
477 {
479 }
482 {
484 }
485 else
486 {
488 }
491 {
493 {
495 }
496 }
498 /* TODO: cast types */
499 }
501 #define ITMAKESBOOLEAN(x) \
502 (((x) >= EQUAL && (x) <= GEQ) || ((x) == OR) || ((x) == AND))
504 #define ITUSEONLYINTEGER(x) \
505 ((x) >= LESS && (x) <= GEQ)
507 #define ITUSEONLYBOOLEAN(x) \
508 (((x) == OR) || ((x) == AND))
512 {
519 {
521 {
524 {
526 }
527 }
529 {
532 {
534 }
535 }
538 {
540 }
542 {
544 }
546 {
548 }
550 {
552 }
554 {
556 }
558 {
560 }
562 {
564 }
566 {
568 }
569 else
570 {
572 }
573 }
574 else
575 {
577 {
579 }
581 {
583 }
585 {
587 }
589 {
591 }
593 {
595 }
597 {
599 }
600 else
601 {
603 }
604 }
607 }
609 #define ISMULOP(x) \
610 ((x) >= STAR && (x) <= AND)
614 {
619 {
625 }
628 }
630 #define ISADDOP(x) \
631 ((x) >= PLUS && (x) <= OR)
635 {
640 {
643 }
645 {
648 }
652 {
658 }
661 {
663 }
666 }
668 #define ISRELATION(x) \
669 ((x) >= EQUAL && (x) <= GEQ)
673 {
678 {
684 }
687 }
689 // =======================================================================
690 // PARSER
691 // =======================================================================
695 static void
697 {
699 {
701 }
702 }
704 static void
706 {
709 }
713 {
718 }
722 {
727 {
729 }
732 }
734 static void
736 {
741 }
743 static void
745 {
747 }
749 static void
751 {
753 }
755 static void
757 {
767 {
770 }
777 {
779 }
780 }
782 static void
784 {
786 {
789 {
792 }
793 }
796 {
799 }
800 }
802 static void
804 {
806 {
808 }
811 {
813 {
815 }
816 }
819 }
821 static void
823 {
828 {
833 }
834 }
836 static void
838 {
841 {
844 }
845 }
847 static void
849 {
861 {
866 }
873 {
875 }
876 }
878 // =======================================================================
879 // LIBRARY
880 // =======================================================================
884 {
887 {
889 }
892 {
894 }
896 // TODO: copy type name (not a pointer)
904 }
906 static void
908 {
914 }
916 void
918 {
920 }
922 oberon_context_t *
924 {
937 }
939 void
941 {
944 }
946 oberon_module_t *
948 {
961 }