spamsink: (Default)
[personal profile] spamsink posting in [community profile] besm6
Много лет я знал об ошибке
 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.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

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 07:52 pm
Powered by Dreamwidth Studios