DEADSOFTWARE

Подпрален FOR для соответствия стандарту
authorDeaDDooMER <deaddoomer@deadsoftware.ru>
Fri, 11 Aug 2017 11:50:26 +0000 (14:50 +0300)
committerDeaDDooMER <deaddoomer@deadsoftware.ru>
Fri, 11 Aug 2017 11:50:26 +0000 (14:50 +0300)
Test.obn
Test7.obn [new file with mode: 0644]
notes
obn-run-tests.sh
rtl/SYSTEM.java
src/oberon.c

index 8c3a8d1458efc80ddf4837c106b664b70a3abfae..f0552a93a06abbaed7841faf482aae3f99251f7f 100644 (file)
--- 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 (file)
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 ce31365148ecc7ab65d5dc428e6953540148651d..7d6b72b343800718f28760503f77260056198640 100644 (file)
--- a/notes
+++ b/notes
@@ -1,5 +1,4 @@
 - Сделать проверку повторов в CASE и выполнять прирывание при отсутствии ELSE.
-- В FOR сначала должна вычисляться переменная temp.
 - Сделать выполнение прерывания при отсутствии ELSE в операторе WITH.
 - Сделать нормальную проверку наличия RETURN.
 - Запретить массивы и записи как результат процедуры-функции.
index d809c75a049eba6821cf82b0fbe0a4ef2be4e278..404c84011aacac3002ce19ea23b0fe738c7d3e4e 100755 (executable)
@@ -33,3 +33,4 @@ maketest Test3
 maketest Test4
 maketest Test5
 maketest Test6
+maketest Test7
index f98236bd90926eeb0ca4d8dd58c46e190e43cd8e..38f488694a9b8996766edfa36d342f7a00b33a3c 100644 (file)
@@ -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);
index 1f33a03c9d82bc084e3ffb1b38777b6750bc9c2f..36736a4bf9384333eb1226c1b6835f202cdabab1 100644 (file)
@@ -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);