IMPORT Out;
+TYPE
+ P1 = POINTER TO R1;
+ P2 = POINTER TO R2;
+ P3 = POINTER TO R3;
+
+ R1 = RECORD END;
+ R2 = RECORD (R1) END;
+ R3 = RECORD (R2) END;
+
VAR
- i : INTEGER;
+ r : P1;
BEGIN
+ NEW(r);
Out.Open;
- i := 48;
- FOR i := 32 TO i DO
- Out.Int(i, 0); Out.Char(' ');
+ WITH r : P1 DO
+ Out.String("R1"); Out.Ln;
END;
- Out.Ln;
END Test.
-- Сделать проверку повторов в CASE и выполнять прирывание при отсутствии ELSE.
-- Сделать выполнение прерывания при отсутствии ELSE в операторе WITH.
+- Сделать проверку повторов в CASE.
- Сделать нормальную проверку наличия RETURN.
- Нужно проверить правила совместимости типов (Приложение A).
- JVM: Импортируемые модули не инициализируются
- JVM: Не реализовано сравнение строк.
-- JVM: Не достаточно средств для реализации рефлексии на уровне локальных процедур.
- Как минимум нужно каждой функции добавлять фрейм к параметрам (динамическая связь?)
- Уточнить как должна работать проверка импорта на чтение. (8.1)
- Уточнить результат оператора "/" (8.2.2)
- Нет проверок переполнения в компилтайме.
Возможно можно заюзать это:
https://gcc.gnu.org/onlinedocs/gcc/Integer-Overflow-Builtins.html
+
+- JVM: Не достаточно средств для реализации рефлексии на уровне локальных процедур.
+ Как минимум нужно каждой функции добавлять фрейм к параметрам (динамическая связь?)
{
assert x : n;
}
+
+ public static void TRAP(long n)
+ {
+ if(n == -1)
+ {
+ throw new RuntimeException("CASE TRAP");
+ }
+ else if(n == -2)
+ {
+ throw new RuntimeException("WITH TRAP");
+ }
+ else
+ {
+ throw new RuntimeException("TRAP CODE " + n);
+ }
+ }
}
jvm_generate(p, 1 + 2, 0, "invokestatic SYSTEM/ASSERT(ZJ)V");
}
+void
+oberon_generate_trap(oberon_context_t * ctx, int64_t n)
+{
+ gen_module_t * m;
+ gen_proc_t * p;
+
+ m = ctx -> mod -> gen_mod;
+ p = m -> class -> p;
+
+ jvm_generate_push_int_size(p, n, 8);
+ jvm_generate(p, 2, 0, "invokestatic SYSTEM/TRAP(J)V");
+}
+
void
oberon_generate_halt(oberon_context_t * ctx, int64_t n)
{
void oberon_generate_copy(oberon_context_t * ctx, oberon_expr_t * src, oberon_expr_t * dst);
void oberon_generate_assert_n(oberon_context_t * ctx, oberon_expr_t * cond, int64_t n);
void oberon_generate_assert(oberon_context_t * ctx, oberon_expr_t * cond);
+void oberon_generate_trap(oberon_context_t * ctx, int64_t n);
void oberon_generate_halt(oberon_context_t * ctx, int64_t n);
void oberon_generate_return(oberon_context_t * ctx, oberon_expr_t * expr);
oberon_assert_token(ctx, ELSE);
oberon_statement_seq(ctx);
}
+ else
+ {
+ oberon_generate_trap(ctx, -1);
+ }
oberon_generate_label(ctx, end);
oberon_assert_token(ctx, END);
oberon_assert_token(ctx, ELSE);
oberon_statement_seq(ctx);
}
+ else
+ {
+ oberon_generate_trap(ctx, -2);
+ }
oberon_generate_label(ctx, end);
oberon_assert_token(ctx, END);