AntKrotov / oberon-07-compiler

Oberon-07 compiler for x64 (Windows, Linux), x86 (Windows, Linux, KolibriOS), MSP430x{1,2}xx, STM32 Cortex-M3
BSD 2-Clause "Simplified" License
61 stars 5 forks source link

Ошибка при обработке вложенных процедур #17

Closed prospero78 closed 3 years ago

prospero78 commented 3 years ago

Код ниже прекрасно работает. Без указания имени процедуры в завершении процедуры.

PROCEDURE New*(width, height, number :INTEGER):TWindow; (* Возвращает новое окно *)
   VAR
      win   :TWindow;
   PROCEDURE Test;
      BEGIN
         Out.String("test ==================\n")
      END;
   BEGIN
      Test;
      NEW(win);
      win.height := height;
      win.width  := width;
      win.number := number;
      Out.String("test -------------------\n")
      RETURN win
   END New;

Вывод:

. . .
compiling (11) xgraph (SYSTEM)
compiling (12) square (SYSTEM)
compiling (13) Main (SYSTEM)
--------------------------------------------
1716 lines, 0.01 sec, 18664 bytes
./bin/main
test ==================\ntest -------------------\n

Специально сейчас посмотрел у Вирта в сообщении -- там указана форма без имени процедуры после END. Но в словесном описании указано, что имя в конце надо. Технически это ошибка в формальном описании. Думаю что, я это дело подправляю в форме комментариев в своём переводе сообщения.

Трындец... В сообщении нашёл на стр. 10 неправильно оформленный код. И оформлен он существенно не правильно (;)

AntKrotov commented 3 years ago

Имя процедуры в конце можно не указывать (я это сделал по предложению одного пользователя). Также, по его же предложению я сделал ключевые слова в нижнем регистре (ключ -lower при компиляции) и спец. синтаксис для условной компиляции (но, конечно, всем этим можно не пользоваться).

prospero78 commented 3 years ago

Если с с нижним регистром я соглашусь, то отсутствие имени процедуры в окончании процедуры несколько ломает логику. Имхо, это дополнительное синтаксическое правило.


Специально сейчас посмотрел 20 файлов проекта "Оберон" у Вирта и вижу, что везде, где есть вложенные процедуры --везде в окончании имя процедуры дублируется.


Кроме того, заметил у него в процедурах -- двойное объявление VAR. А у тебя с такими штуками компилер не справляется)) Хотя, опять же, считаю, что в данном случае Вирт не прав. Двойной VAR противоречит его же описанию.

ProcedureBody = DeclarationSequence [BEGIN StatementSequence]
[RETURN expression] END.
DeclarationSequence = [CONST {ConstDeclaration ";"}]
 [TYPE {TypeDeclaration ";"}] [VAR {VariableDeclaration ";"}]
 {ProcedureDeclaration ";"}. 

Из сообщения о языке явно следует, что секция VAR может быть один раз.

Что касается условной компиляции, то внутреннего какого-то отторжения нет (понятно, что не хочешь -- не пользуйся). Но, как по мне -- я бы сделал префиксный выбор файлов, в зависимости от целевой платформы. Ну, или те же опции компилятора через комментарии.

AntKrotov commented 3 years ago

Да мне самому не нравится пропуск имени процедуры. Но вот посчитал тот пользователь, что так проще "ближе к паскалю", я и сделал имя процедуры в конце необязательным. Но сам отказываться от такого синтаксиса не собираюсь.

prospero78 commented 3 years ago

Не, работает и ладно. Если бы компиль не мог переварить наличие имени -- вот это было бы действительно плохо. Я всего лишь пытаюсь отделить мухи от котлет))