Mar. 11th, 2025

spamsink: (Default)
[personal profile] spamsink
Как мы выяснили в 2019 году, если оператор построения множеств с переменными границами использовался в операторе вывода не в первом аргументе, например,
program main(output);
var a, b:integer;
begin
  a := 1; b := 20;
  writeln(' expect true: ', 5 in [a..b]);
end.

значение этого аргумента и всех последующих не печаталось, но бывало и аварийное завершение.

Не прошло и 6 лет, как я разобрался. 12 регистр - указатель на текущий файл - нельзя использовать при вычислении выражений: на случай, если выражение записано в операторе write с несколькими аргументами, в котором случае между аргументами он ради экономии не переустанавливается.

В процедуре, конструирующей множества с переменными границами, видим:
 p/pi    :      , name,         . dtran  /01.06.84/
                , ntr , 3
            15  , a-x , -1
                , u1a , *0005b
                , sti , 14
                , ati , 12 . надо , ati, 10
             1  , xta , 24b
            14  , asn , 64-47
            12  , asn , 64 . надо 10, asn, 64
            13  , uj  ,

 *0005b  :  15  , utm , -1
                , xta ,
            13  , uj  ,
                , end ,


Если внести правки, указанные в комментариях, всё работает штатно.
spamsink: (Default)
[personal profile] spamsink
Много лет я знал об ошибке
 00001    1  0 PROGRAM MAIN(OUTPUT);
 00007    2  2 FUNCTION F:INTEGER; _( F := 5 _);
 00017    3  1 PROCEDURE WR(I, J, K: INTEGER);
 00017    4  2 _( WRITELN(I, J, K) _);
 00035    5  2 _(
 00036    6  2    WRITELN(F, F + 5, 5 + F);
 ******41 HET ЗAПЯT ИЛИ CKOБKИ ИЛИ MAЛO ПAPAMETPOB
 00053    7  2    WR(F, F + 5, 5 + F)
        *****             0
 00065    8  0 _).


Казалось бы, почему выражение "F + 5" нормально понимается в WRITELN, но не в вызове процедуры?
Отгадка такова: конкретно при обработке параметров процедур, если первый токен аргумента - имя подпрограммы, а следующий - не открывающая скобка, то это похоже на передачу ссылки на подпрограмму, и нужно проверить, как это соотносится с типом формального параметра.

Ошибка была в том, что в случае передачи ссылки следующий токен может быть только запятой или закрывающей скобкой, в противном случае это просто выражение. А проверки на запятую или закрывающую скобку не было, отчего любое упоминание функции без параметров в качестве первого токена казалось передачей ссылки, и разбор параметра прекращался.

Исправлено на гитхабе в besm6/pascal-re/pascompl.cc.

Profile

Сообщество любителей БЭСМ-6

December 2025

S M T W T F S
 123456
78910111213
14151617181920
21222324252627
282930 31   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 15th, 2026 10:44 am
Powered by Dreamwidth Studios