From: DeaDDooMER Date: Fri, 11 Aug 2017 11:50:26 +0000 (+0300) Subject: Подпрален FOR для соответствия стандарту X-Git-Url: https://deadsoftware.ru/gitweb?p=dsw-obn.git;a=commitdiff_plain;h=6d3cfbfd343c0d069896734e32a8c490f27cb7aa Подпрален FOR для соответствия стандарту --- 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);