Closed prospero78 closed 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 = [...]).
Хм. Посмотрел перевод -- да, там тоже есть такое.
Есть вот такой код: ` tSession = RECORD
` Если в конце последнего поля типа поставить ";" -- компиляция не проходит. Это разве правильно?