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 {
82 }
84 static void
86 {
89 }
93 {
96 {
98 }
101 {
103 }
113 }
117 {
120 {
122 }
124 }
128 {
133 {
136 }
139 {
141 }
144 }
146 static void
148 {
153 }
157 {
160 {
162 }
165 }
167 static void
169 {
174 }
176 /*
177 static oberon_object_t *
178 oberon_find_var(oberon_scope_t * scope, char * name)
179 {
180 oberon_object_t * x = oberon_find_object(scope, name);
182 if(x -> class != OBERON_CLASS_VAR)
183 {
184 oberon_error(scope -> ctx, "%s not a var", name);
185 }
187 return x;
188 }
189 */
193 {
198 }
200 // =======================================================================
201 // SCANER
202 // =======================================================================
204 static void
206 {
209 }
211 static void
213 {
217 }
219 static void
221 {
227 {
231 }
243 {
245 }
247 {
249 }
251 {
253 }
255 {
257 }
259 {
261 }
263 {
265 }
267 {
269 }
271 {
273 }
275 {
277 }
279 {
281 }
282 }
284 static void
286 {
292 {
296 }
307 }
309 static void
311 {
313 {
315 }
316 }
318 static void
320 {
323 {
335 {
338 }
364 {
367 }
373 {
376 }
405 }
406 }
408 static void
410 {
415 {
417 }
419 {
421 }
422 else
423 {
425 }
426 }
428 // =======================================================================
429 // EXPRESSION
430 // =======================================================================
438 oberon_new_operator(int op, oberon_type_t * result, oberon_expr_t * left, oberon_expr_t * right)
439 {
451 }
455 {
465 }
469 {
476 {
478 {
480 }
483 }
485 {
487 {
489 }
492 }
493 else
494 {
496 }
499 }
503 {
509 {
514 {
516 }
518 {
520 }
521 else
522 {
524 }
554 }
557 }
559 /*
560 * oberon_autocast_binary_op автоматически переобразовывеат тип по след. правилам:
561 * 1. Классы обоих типов должны быть одинаковы
562 * 2. В качестве результата должен быть выбран больший тип.
563 * 3. Если размер результат не должен быть меньше чем базовый int
564 */
566 static void
567 oberon_autocast_binary_op(oberon_context_t * ctx, oberon_type_t * a, oberon_type_t * b, oberon_type_t ** result)
568 {
570 {
572 }
575 {
577 }
578 else
579 {
581 }
584 {
586 {
588 }
589 }
591 /* TODO: cast types */
592 }
594 #define ITMAKESBOOLEAN(x) \
595 (((x) >= EQUAL && (x) <= GEQ) || ((x) == OR) || ((x) == AND))
597 #define ITUSEONLYINTEGER(x) \
598 ((x) >= LESS && (x) <= GEQ)
600 #define ITUSEONLYBOOLEAN(x) \
601 (((x) == OR) || ((x) == AND))
605 {
612 {
614 {
617 {
619 }
620 }
622 {
625 {
627 }
628 }
631 {
633 }
635 {
637 }
639 {
641 }
643 {
645 }
647 {
649 }
651 {
653 }
655 {
657 }
659 {
661 }
662 else
663 {
665 }
666 }
667 else
668 {
670 {
672 }
674 {
676 }
678 {
680 }
682 {
684 }
686 {
688 }
690 {
692 }
693 else
694 {
696 }
697 }
700 }
702 #define ISMULOP(x) \
703 ((x) >= STAR && (x) <= AND)
707 {
712 {
718 }
721 }
723 #define ISADDOP(x) \
724 ((x) >= PLUS && (x) <= OR)
728 {
733 {
736 }
738 {
741 }
745 {
751 }
754 {
756 }
759 }
761 #define ISRELATION(x) \
762 ((x) >= EQUAL && (x) <= GEQ)
766 {
771 {
777 }
780 }
782 // =======================================================================
783 // PARSER
784 // =======================================================================
788 static void
790 {
792 {
794 }
795 }
797 static void
799 {
802 }
806 {
811 }
815 {
819 }
821 static void
823 {
828 }
830 static void
832 {
839 }
841 static void
843 {
847 }
849 static void
851 {
861 {
864 }
871 {
873 }
874 }
876 static void
878 {
880 {
883 {
886 }
887 }
890 {
893 }
894 }
896 static void
898 {
900 {
902 }
905 {
907 {
909 }
910 }
913 }
915 static void
917 {
919 {
921 }
924 {
926 }
929 {
931 }
933 // TODO check arguments
936 }
938 static void
940 {
945 {
948 {
952 }
953 else
954 {
956 }
957 }
958 }
960 static void
962 {
965 {
968 }
969 }
971 static void
973 {
985 {
990 }
997 {
999 }
1000 }
1002 // =======================================================================
1003 // LIBRARY
1004 // =======================================================================
1008 {
1013 }
1017 {
1022 }
1026 {
1031 }
1033 static void
1035 {
1041 }
1043 oberon_context_t *
1045 {
1058 }
1060 void
1062 {
1065 }
1067 oberon_module_t *
1069 {
1085 }