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

Ошибка в разборе полей типа? #7

Closed prospero78 closed 5 years ago

prospero78 commented 5 years ago

Есть вот такой код: ` tSession = RECORD

        session:   ARRAY lenStrSession OF WCHAR;

        base_path: ARRAY lenBasePath OF CHAR;

        time_get:  ARRAY lenTimeBegin OF CHAR

    END;

` Если в конце последнего поля типа поставить ";" -- компиляция не проходит. Это разве правильно?

AntKrotov commented 5 years ago

Совершенно правильно. Это следует из синтаксических правил, записанных в РФБН в конце описания языка.

prospero78 commented 5 years ago

На сколько помню, такой синтаксис принимается, но не обязателен.

AntKrotov commented 5 years ago

Синтаксис Оберона-07:

ident = letter {letter | digit}. qualident = [ident "."] ident. identdef = ident ["*"]. ... RecordType = RECORD ["(" BaseType ")"] [FieldListSequence] END. BaseType = qualident. FieldListSequence = FieldList {";" FieldList}. FieldList = IdentList ":" type. IdentList = identdef {"," identdef}.

";" следует перед FieldList.

FieldList = IdentList... IdentList = identdef... identdef = ident... ident = letter... Таким образом, после ";" обязательно должен стоять следующий идентификатор. Это необычно, да. В других Оберонах FieldList может быть пустым, например, Oberon-2:

RecordType = RECORD ["("BaseType")"] FieldList{";" FieldList} END. BaseType = Qualident. FieldList = [IdentList ":" Type ].

Квадратные скобки означают необязательность, и после ";" сразу может следовать END (или еще одна ";").

А вот для операторов, ";" перед END необязательна, но допустима. Синтаксис Оберона-07:

statement = [assignment | ProcedureCall | IfStatement | CaseStatement | WhileStatement | RepeatStatement | ForStatement]. assignment = designator ":=" expression. ProcedureCall = designator [ActualParameters]. StatementSequence = statement {";" statement}.

";" следует перед statement, а statement может быть пустым (statement = [...]).

prospero78 commented 5 years ago

Хм. Посмотрел перевод -- да, там тоже есть такое.