summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 9b4f782)
raw | patch | inline | side by side (parent: 9b4f782)
author | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Sun, 13 Aug 2017 11:17:02 +0000 (14:17 +0300) | ||
committer | DeaDDooMER <deaddoomer@deadsoftware.ru> | |
Sun, 13 Aug 2017 11:17:02 +0000 (14:17 +0300) |
Test.obn | patch | blob | history | |
notes | patch | blob | history | |
src/oberon-internals.h | patch | blob | history | |
src/oberon.c | patch | blob | history |
diff --git a/Test.obn b/Test.obn
index da1f5453089ca918510c6b19e914ac2dbbf33d42..82fbedbbc7c705e6e6a7a46f3cfb2a2e3c34c7d2 100644 (file)
--- a/Test.obn
+++ b/Test.obn
MODULE Test;
VAR
- i : INTEGER;
+ i : SHORTINT;
s : SET;
BEGIN
- INC(i);
- ASSERT(i = 1);
- DEC(i);
- ASSERT(i = 0);
-
- INCL(s, 3);
- ASSERT(3 IN s);
- EXCL(s, 3);
- ASSERT(~(3 IN s));
+ i := SHORT(12345);
END Test.
-
-Проверка встроенных процедур.
index 21447a4e87dcc7a6acd4be42e6fa11d109fe989d..45bb85f12ceb53c08b025ca903e452d8ca466fe5 100644 (file)
--- a/notes
+++ b/notes
- Сделать проверку повторов в CASE.
- Сделать нормальную проверку наличия RETURN.
-- Нет функций LONG SHORT
- Нет счёта строк / столбцов
- Нет процедур привязанных к типм
diff --git a/src/oberon-internals.h b/src/oberon-internals.h
index 31c8054c6f2cab8f088c5de904e443aa73f67105..703ba6c5e4b4b6eb88fa9bb3f98d94973fd9e56e 100644 (file)
--- a/src/oberon-internals.h
+++ b/src/oberon-internals.h
{
enum oberon_type_kind class;
int size;
+ oberon_type_t * shorter;
+ oberon_type_t * longer;
int num_decl;
oberon_type_t * base;
diff --git a/src/oberon.c b/src/oberon.c
index 1d00f22f5cf68f87e364a09fc60e984be5635d23..8b94271a6033d4675f4c8026d316980139a85d18 100644 (file)
--- a/src/oberon.c
+++ b/src/oberon.c
// LIBRARY
// =======================================================================
-static void
-register_default_types(oberon_context_t * ctx)
-{
- ctx -> notype_type = oberon_new_type_ptr(OBERON_TYPE_NOTYPE);
- oberon_generator_init_type(ctx, ctx -> notype_type);
-
- ctx -> nil_type = oberon_new_type_ptr(OBERON_TYPE_NIL);
- oberon_generator_init_type(ctx, ctx -> nil_type);
-
- ctx -> string_type = oberon_new_type_string(1);
- oberon_generator_init_type(ctx, ctx -> string_type);
-
- ctx -> bool_type = oberon_new_type_boolean();
- oberon_define_type(ctx -> world_scope, "BOOLEAN", ctx -> bool_type, 1);
-
- ctx -> char_type = oberon_new_type_char(1);
- oberon_define_type(ctx -> world_scope, "CHAR", ctx -> char_type, 1);
-
- ctx -> byte_type = oberon_new_type_integer(1);
- oberon_define_type(ctx -> world_scope, "SHORTINT", ctx -> byte_type, 1);
-
- ctx -> shortint_type = oberon_new_type_integer(2);
- oberon_define_type(ctx -> world_scope, "INTEGER", ctx -> shortint_type, 1);
-
- ctx -> int_type = oberon_new_type_integer(4);
- oberon_define_type(ctx -> world_scope, "LONGINT", ctx -> int_type, 1);
-
- ctx -> longint_type = oberon_new_type_integer(8);
- oberon_define_type(ctx -> world_scope, "HUGEINT", ctx -> longint_type, 1);
-
- ctx -> real_type = oberon_new_type_real(4);
- oberon_define_type(ctx -> world_scope, "REAL", ctx -> real_type, 1);
-
- ctx -> longreal_type = oberon_new_type_real(8);
- oberon_define_type(ctx -> world_scope, "LONGREAL", ctx -> longreal_type, 1);
-
- ctx -> set_type = oberon_new_type_set(4);
- oberon_define_type(ctx -> world_scope, "SET", ctx -> set_type, 1);
-}
-
-static void
-oberon_new_intrinsic(oberon_context_t * ctx, char * name, GenerateFuncCallback f, GenerateProcCallback p)
-{
- oberon_object_t * proc;
- proc = oberon_define_object(ctx -> decl, name, OBERON_CLASS_PROC, true, false, false);
- proc -> type = oberon_new_type_ptr(OBERON_TYPE_PROCEDURE);
- proc -> type -> sysproc = true;
- proc -> type -> genfunc = f;
- proc -> type -> genproc = p;
-}
-
static oberon_expr_t *
oberon_make_min_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_args)
{
@@ -4377,6 +4326,60 @@ oberon_make_odd_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_
return expr;
}
+static oberon_expr_t *
+oberon_make_short_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_args)
+{
+ if(num_args < 1)
+ {
+ oberon_error(ctx, "too few arguments");
+ }
+
+ if(num_args > 1)
+ {
+ oberon_error(ctx, "too mach arguments");
+ }
+
+ oberon_expr_t * arg;
+ arg = list_args;
+ oberon_check_src(ctx, arg);
+
+ if(arg -> result -> shorter == NULL)
+ {
+ oberon_error(ctx, "already shorter");
+ }
+
+ oberon_expr_t * expr;
+ expr = oberon_cast_expr(ctx, arg, arg -> result -> shorter);
+ return expr;
+}
+
+static oberon_expr_t *
+oberon_make_long_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_args)
+{
+ if(num_args < 1)
+ {
+ oberon_error(ctx, "too few arguments");
+ }
+
+ if(num_args > 1)
+ {
+ oberon_error(ctx, "too mach arguments");
+ }
+
+ oberon_expr_t * arg;
+ arg = list_args;
+ oberon_check_src(ctx, arg);
+
+ if(arg -> result -> longer == NULL)
+ {
+ oberon_error(ctx, "already longer");
+ }
+
+ oberon_expr_t * expr;
+ expr = oberon_cast_expr(ctx, arg, arg -> result -> longer);
+ return expr;
+}
+
static oberon_expr_t *
oberon_make_len_call(oberon_context_t * ctx, int num_args, oberon_expr_t * list_args)
{
constant -> value = (oberon_item_t *) expr;
}
+static void
+register_default_types(oberon_context_t * ctx)
+{
+ ctx -> notype_type = oberon_new_type_ptr(OBERON_TYPE_NOTYPE);
+ oberon_generator_init_type(ctx, ctx -> notype_type);
+
+ ctx -> nil_type = oberon_new_type_ptr(OBERON_TYPE_NIL);
+ oberon_generator_init_type(ctx, ctx -> nil_type);
+
+ ctx -> string_type = oberon_new_type_string(1);
+ oberon_generator_init_type(ctx, ctx -> string_type);
+
+ ctx -> bool_type = oberon_new_type_boolean();
+ oberon_define_type(ctx -> world_scope, "BOOLEAN", ctx -> bool_type, 1);
+
+ ctx -> char_type = oberon_new_type_char(1);
+ oberon_define_type(ctx -> world_scope, "CHAR", ctx -> char_type, 1);
+
+ ctx -> byte_type = oberon_new_type_integer(1);
+ oberon_define_type(ctx -> world_scope, "SHORTINT", ctx -> byte_type, 1);
+
+ ctx -> shortint_type = oberon_new_type_integer(2);
+ oberon_define_type(ctx -> world_scope, "INTEGER", ctx -> shortint_type, 1);
+
+ ctx -> int_type = oberon_new_type_integer(4);
+ oberon_define_type(ctx -> world_scope, "LONGINT", ctx -> int_type, 1);
+
+ ctx -> longint_type = oberon_new_type_integer(8);
+ oberon_define_type(ctx -> world_scope, "HUGEINT", ctx -> longint_type, 1);
+
+ ctx -> real_type = oberon_new_type_real(4);
+ oberon_define_type(ctx -> world_scope, "REAL", ctx -> real_type, 1);
+
+ ctx -> longreal_type = oberon_new_type_real(8);
+ oberon_define_type(ctx -> world_scope, "LONGREAL", ctx -> longreal_type, 1);
+
+ ctx -> set_type = oberon_new_type_set(4);
+ oberon_define_type(ctx -> world_scope, "SET", ctx -> set_type, 1);
+
+
+
+ ctx -> byte_type -> shorter = NULL;
+ ctx -> byte_type -> longer = ctx -> shortint_type;
+
+ ctx -> shortint_type -> shorter = ctx -> byte_type;
+ ctx -> shortint_type -> longer = ctx -> int_type;
+
+ ctx -> int_type -> shorter = ctx -> shortint_type;
+ ctx -> int_type -> longer = ctx -> longint_type;
+
+ ctx -> longint_type -> shorter = ctx -> int_type;
+ ctx -> longint_type -> longer = NULL;
+
+ ctx -> real_type -> shorter = NULL;
+ ctx -> real_type -> longer = ctx -> longreal_type;
+
+ ctx -> longreal_type -> shorter = ctx -> real_type;
+ ctx -> longreal_type -> longer = NULL;
+}
+
+static void
+oberon_new_intrinsic(oberon_context_t * ctx, char * name, GenerateFuncCallback f, GenerateProcCallback p)
+{
+ oberon_object_t * proc;
+ proc = oberon_define_object(ctx -> decl, name, OBERON_CLASS_PROC, true, false, false);
+ proc -> type = oberon_new_type_ptr(OBERON_TYPE_PROCEDURE);
+ proc -> type -> sysproc = true;
+ proc -> type -> genfunc = f;
+ proc -> type -> genproc = p;
+}
+
oberon_context_t *
oberon_create_context(ModuleImportCallback import_module)
{
oberon_new_intrinsic(ctx, "CHR", oberon_make_chr_call, NULL);
oberon_new_intrinsic(ctx, "ENTIER", oberon_make_entier_call, NULL);
oberon_new_intrinsic(ctx, "LEN", oberon_make_len_call, NULL);
- //oberon_new_intrinsic(ctx, "LONG", oberon_make_long_call, NULL);
+ oberon_new_intrinsic(ctx, "LONG", oberon_make_long_call, NULL);
oberon_new_intrinsic(ctx, "MAX", oberon_make_max_call, NULL);
oberon_new_intrinsic(ctx, "MIN", oberon_make_min_call, NULL);
oberon_new_intrinsic(ctx, "ODD", oberon_make_odd_call, NULL);
oberon_new_intrinsic(ctx, "ORD", oberon_make_ord_call, NULL);
- //oberon_new_intrinsic(ctx, "SHORT", oberon_make_short_call, NULL);
+ oberon_new_intrinsic(ctx, "SHORT", oberon_make_short_call, NULL);
oberon_new_intrinsic(ctx, "SIZE", oberon_make_size_call, NULL);
/* Procedures */