98928fbe7c4e1629b2519b0f505e54fb921ef63b
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 }
528 {
532 }
561 }
564 }
566 /*
567 * oberon_autocast_binary_op автоматически переобразовывеат тип по след. правилам:
568 * 1. Классы обоих типов должны быть одинаковы
569 * 2. В качестве результата должен быть выбран больший тип.
570 * 3. Если размер результат не должен быть меньше чем базовый int
571 */
573 static void
574 oberon_autocast_binary_op(oberon_context_t * ctx, oberon_type_t * a, oberon_type_t * b, oberon_type_t ** result)
575 {
577 {
579 }
582 {
584 }
585 else
586 {
588 }
591 {
593 {
595 }
596 }
598 /* TODO: cast types */
599 }
601 #define ITMAKESBOOLEAN(x) \
602 (((x) >= EQUAL && (x) <= GEQ) || ((x) == OR) || ((x) == AND))
604 #define ITUSEONLYINTEGER(x) \
605 ((x) >= LESS && (x) <= GEQ)
607 #define ITUSEONLYBOOLEAN(x) \
608 (((x) == OR) || ((x) == AND))
612 {
619 {
621 {
624 {
626 }
627 }
629 {
632 {
634 }
635 }
638 {
640 }
642 {
644 }
646 {
648 }
650 {
652 }
654 {
656 }
658 {
660 }
662 {
664 }
666 {
668 }
669 else
670 {
672 }
673 }
674 else
675 {
677 {
679 }
681 {
683 }
685 {
687 }
689 {
691 }
693 {
695 }
697 {
699 }
700 else
701 {
703 }
704 }
707 }
709 #define ISMULOP(x) \
710 ((x) >= STAR && (x) <= AND)
714 {
719 {
725 }
728 }
730 #define ISADDOP(x) \
731 ((x) >= PLUS && (x) <= OR)
735 {
740 {
743 }
745 {
748 }
752 {
758 }
761 {
763 }
766 }
768 #define ISRELATION(x) \
769 ((x) >= EQUAL && (x) <= GEQ)
773 {
778 {
784 }
787 }
789 // =======================================================================
790 // PARSER
791 // =======================================================================
795 static void
797 {
799 {
801 }
802 }
804 static void
806 {
809 }
813 {
818 }
822 {
826 }
828 static void
830 {
835 }
837 static void
839 {
846 }
848 static void
850 {
854 }
856 static void
858 {
868 {
871 }
878 {
880 }
881 }
883 static void
885 {
887 {
890 {
893 }
894 }
897 {
900 }
901 }
903 static void
905 {
907 {
909 }
912 {
914 {
916 }
917 }
920 }
922 static void
924 {
926 {
928 }
931 {
933 }
936 {
938 }
940 // TODO check arguments
943 }
945 static void
947 {
952 {
955 {
959 }
960 else
961 {
963 }
964 }
965 }
967 static void
969 {
972 {
975 }
976 }
978 static void
980 {
992 {
997 }
1004 {
1006 }
1007 }
1009 // =======================================================================
1010 // LIBRARY
1011 // =======================================================================
1015 {
1020 }
1024 {
1029 }
1033 {
1038 }
1040 static void
1042 {
1048 }
1050 oberon_context_t *
1052 {
1065 }
1067 void
1069 {
1072 }
1074 oberon_module_t *
1076 {
1092 }