From 6d3cfbfd343c0d069896734e32a8c490f27cb7aa Mon Sep 17 00:00:00 2001 From: DeaDDooMER Date: Fri, 11 Aug 2017 14:50:26 +0300 Subject: [PATCH] =?utf8?q?=D0=9F=D0=BE=D0=B4=D0=BF=D1=80=D0=B0=D0=BB=D0=B5?= =?utf8?q?=D0=BD=20FOR=20=D0=B4=D0=BB=D1=8F=20=D1=81=D0=BE=D0=BE=D1=82?= =?utf8?q?=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D0=B8=D1=8F=20=D1=81=D1=82?= =?utf8?q?=D0=B0=D0=BD=D0=B4=D0=B0=D1=80=D1=82=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Test.obn | 15 ++++++--------- Test7.obn | 19 +++++++++++++++++++ notes | 1 - obn-run-tests.sh | 1 + rtl/SYSTEM.java | 1 - src/oberon.c | 4 ++-- 6 files changed, 28 insertions(+), 13 deletions(-) create mode 100644 Test7.obn diff --git a/Test.obn b/Test.obn index 8c3a8d1..f0552a9 100644 --- a/Test.obn +++ b/Test.obn @@ -3,16 +3,13 @@ MODULE Test; IMPORT Out; VAR - msg : ARRAY 20 OF CHAR; + i : INTEGER; BEGIN Out.Open; - COPY("Hello World!", msg); - Out.String(msg); Out.Ln; - COPY("Hell!", msg); - Out.String(msg); Out.Ln; - COPY("The quick brown fox jumps over the lazy dog", msg); - Out.String(msg); Out.Ln; - msg := "Hello World!"; - Out.String(msg); Out.Ln; + i := 48; + FOR i := 32 TO i DO + Out.Int(i, 0); Out.Char(' '); + END; + Out.Ln; END Test. diff --git a/Test7.obn b/Test7.obn new file mode 100644 index 0000000..739ec97 --- /dev/null +++ b/Test7.obn @@ -0,0 +1,19 @@ +MODULE Test7; + +IMPORT Out; + +VAR + i : INTEGER; + +BEGIN + Out.Open; + i := 48; + FOR i := 32 TO i DO + Out.Int(i, 0); Out.Char(' '); + END; + Out.Ln; +END Test7. + +Проверка корректности FOR. +Сначала должна вычисляться выражение TO и только потом присвоение индекса. +Результат должен быть: 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 diff --git a/notes b/notes index ce31365..7d6b72b 100644 --- a/notes +++ b/notes @@ -1,5 +1,4 @@ - Сделать проверку повторов в CASE и выполнять прирывание при отсутствии ELSE. -- В FOR сначала должна вычисляться переменная temp. - Сделать выполнение прерывания при отсутствии ELSE в операторе WITH. - Сделать нормальную проверку наличия RETURN. - Запретить массивы и записи как результат процедуры-функции. diff --git a/obn-run-tests.sh b/obn-run-tests.sh index d809c75..404c840 100755 --- a/obn-run-tests.sh +++ b/obn-run-tests.sh @@ -33,3 +33,4 @@ maketest Test3 maketest Test4 maketest Test5 maketest Test6 +maketest Test7 diff --git a/rtl/SYSTEM.java b/rtl/SYSTEM.java index f98236b..38f4886 100644 --- a/rtl/SYSTEM.java +++ b/rtl/SYSTEM.java @@ -17,7 +17,6 @@ public class SYSTEM return i; } - /* Встроенная процедура COPY(x, v) */ public static void COPY(byte[] x, byte[] v) { int len_x = LEN(x); diff --git a/src/oberon.c b/src/oberon.c index 1f33a03..36736a4 100644 --- a/src/oberon.c +++ b/src/oberon.c @@ -3644,11 +3644,11 @@ oberon_statement(oberon_context_t * ctx) index = oberon_ident_item(ctx, iname); oberon_assert_token(ctx, ASSIGN); from = oberon_expr(ctx); - oberon_assign(ctx, from, index); oberon_assert_token(ctx, TO); bound = oberon_make_temp_var_item(ctx, index -> result); to = oberon_expr(ctx); - oberon_assign(ctx, to, bound); + oberon_assign(ctx, to, bound); // сначала temp + oberon_assign(ctx, from, index); // потом i if(ctx -> token == BY) { oberon_assert_token(ctx, BY); -- 2.29.2