Дошли руки посмотреть
Mar. 11th, 2025 10:19 amМного лет я знал об ошибке
Казалось бы, почему выражение "F + 5" нормально понимается в WRITELN, но не в вызове процедуры?
Отгадка такова: конкретно при обработке параметров процедур, если первый токен аргумента - имя подпрограммы, а следующий - не открывающая скобка, то это похоже на передачу ссылки на подпрограмму, и нужно проверить, как это соотносится с типом формального параметра.
Ошибка была в том, что в случае передачи ссылки следующий токен может быть только запятой или закрывающей скобкой, в противном случае это просто выражение. А проверки на запятую или закрывающую скобку не было, отчего любое упоминание функции без параметров в качестве первого токена казалось передачей ссылки, и разбор параметра прекращался.
Исправлено на гитхабе в besm6/pascal-re/pascompl.cc.
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.