Oberon space
General Category => Общий раздел => Тема начата: valexey от Апрель 09, 2011, 11:51:15 pm
-
Вот такой вот простейший код:
MODULE Test;
PROCEDURE Tst* (CONST a : INTEGER; buf : ARRAY 20 OF CHAR);
BEGIN
END Tst;
END Test.
При компиляции имеем вот такую вот сонму ошибок:
>..\\bin\\compiler.exe Test.ob7
line = 2 pos = 53 OF expected
line = 2 pos = 56 Declaration?
line = 2 pos = 59 Declaration?
line = 2 pos = 63 Declaration?
line = 2 pos = 64 Declaration?
Compilation failed
У меня такое ощущение, что в данном случае таки не я неправ, а компилятор.
-
Ну и до кучи:
MODULE Test;
PROCEDURE Tst* (CONST a : INTEGER; buf : POINTER TO ARRAY OF CHAR);
BEGIN
END Tst;
END Test.
>..\\bin\\compiler.exe Test.ob7
line = 2 pos = 47 ident expected
line = 2 pos = 55 Declaration?
line = 2 pos = 58 Declaration?
line = 2 pos = 64 Declaration?
line = 2 pos = 67 Declaration?
line = 2 pos = 71 Declaration?
line = 2 pos = 72 Declaration?
Compilation failed
-
Покурил доки, понял что POINTER TO ARRAY сколько-то-там OF чего-то-там типом в Обероне-07 не является.
То есть вот такое работать не будет:
MODULE Test;
PROCEDURE Tst* (CONST a : INTEGER; buf : POINTER TO ARRAY OF CHAR);
BEGIN
END Tst;
END Test.
Да-а.. Зато будет работать вот такое:
MODULE Test;
TYPE ArrType = POINTER TO ARRAY OF CHAR;
PROCEDURE Tst* (CONST a : INTEGER; buf : ArrType);
BEGIN
END Tst;
END Test.
Так сказать, ВНЕЗАПНО! Потому, как "TYPE ArrType = POINTER TO что-то" вводит новый тип.
Кстати, со структурами ровно то же самое (только это уже в чистом Обероне-07, без всяких там 07м), POINTER TO SomeRecord не передать, а вот если вначале сделать вышеуказанный финт ушами, то вполне можно уже.
Да, в описании языка приходится побегать вверх-вниз несколько раз, пока это дело отроешь. Явно это не сказано.
В Oberon-2 сделано все же явнее и сразу в грамматике:
Type = Qualident
| ARRAY [ConstExpr {"," ConstExpr}] OF Type
| RECORD ["("Qualident")"] FieldList {";" FieldList} END
| POINTER TO Type
| PROCEDURE [FormalPars].
PS. А еще меня только что шокировал тот факт, что, если верить грамматике, такие словечки как INTEGER, BOOLEAN, REAL и так далее, зарезервированными словами не являются, потому как начисто в описании грамматики отсутствуют.
-
А ещё у меня компилятор крашнулся :-)
-
Да, кроме того, сообщения компилятора (ошибки) очень уж не информативные.
Кроме всего прочего, он похоже выдает номера ЗНАЧИМЫХ строк, а не строк в исходном файле, то есть он оперирует номерами строк после вырезания всех пустых строк и всех комментариев.
-
Если компилятор упал, пришлите мне, пожалуйста, на почту, которая указана на сайте компилятора, файл error.log.
Насчет ошибок компилятории, невозможность такой конструкции следует из грамматики языка:
FPSection = ["CONST" | "VAR"] ident {"," ident} ":" FormalType.
FormalType = ["ARRAY" "OF"] qualident.
qualident = [ident "."] ident.
Насчет номеров позиций ошибки, в ближайшее время исправлю.
-
PS. А еще меня только что шокировал тот факт, что, если верить грамматике, такие словечки как INTEGER, BOOLEAN, REAL и так далее, зарезервированными словами не являются, потому как начисто в описании грамматики отсутствуют.
Так принято ещё с Паскаля. Они вносятся в таблицу символов при компиляции как предопределённые идентификаторы, которые могут быть, в принципе, перекрыты. Я это помню ещё по Turbo Pascal :)
-
В турбопаскале было полное описание грамматики языка? Ну, кроме того такие вещи обязаны присутствовать в грамматике языка. Это её не усложняет, зато делает описание языка полнее.
-
Да, я разобрался почему оно не работает, это видно по моим сообщениям :-) Тут не ошибка компилятора а ошибка в дизайне языка.
Как до компа доберусь, вышлю крашлог компилятора.
-
MODULE Test;
PROCEDURE Tst* (CONST a : INTEGER; buf : ARRAY 20 OF CHAR);
BEGIN
END Tst;
END Test.
А такое проходит?
PROCEDURE Tst* (CONST a : INTEGER; buf : ARRAY OF CHAR);
или
PROCEDURE Tst* (CONST a : INTEGER; VAR buf : ARRAY OF CHAR);
-
С VAR точно да. первый вариант не помню
-
В Oberon-07 структурные типы могут передаваться в процедуры только по ссылке (через указатель), а не по значению. Соответственно при передаче массива в процедуру, можно указать VAR, если массив может быть изменен, или же CONST, если это входной параметр. Передача массива без VAR или CONST запрещена.
-
В Oberon-07 структурные типы могут передаваться в процедуры только по ссылке (через указатель), а не по значению. Соответственно при передаче массива в процедуру, можно указать VAR, если массив может быть изменен, или же CONST, если это входной параметр. Передача массива без VAR или CONST запрещена.
Ну почему же? Можно передать через POINTER TO, только не явно:
MODULE Test;
TYPE ArrType = POINTER TO ARRAY OF CHAR;
PROCEDURE Tst* (CONST a : INTEGER; buf : ArrType);
BEGIN
END Tst;
END Test.
-
Да, может я не точно выразился, по значению нельзя передавать массивы и записи, а указатели можно. Указатель тоже относится к структурным типам.
-
Да, может я не точно выразился, по значению нельзя передавать массивы и записи, а указатели можно. Указатель тоже относится к структурным типам.
Да, но вот так вот нельзя:
MODULE Test;
PROCEDURE Tst* (CONST a : INTEGER; buf : POINTER TO ARRAY OF CHAR);
BEGIN
END Tst;
END Test.
Кривокосо.
-
Так как FormalType = ["ARRAY" "OF"] qualident.
Считаю, это правильным, так как зачем описывать типы, при описании процедуры, когда для этого есть специальная секция TYPE, в которой все такие типы и должны описываться.
-
Кривокосо.
Да но только вв том случае если не проходит PROCEDURE Tst* (CONST a : INTEGER; VAR buf : POINTER TO ARRAY OF CHAR);
-
Кривокосо.
Да но только вв том случае если не проходит PROCEDURE Tst* (CONST a : INTEGER; VAR buf : POINTER TO ARRAY OF CHAR);
Такое не проходит. Проходит такое:
PROCEDURE Tst* (CONST a : INTEGER; VAR buf : ARRAY OF CHAR);
-
Кривокосо.
Да но только вв том случае если не проходит PROCEDURE Tst* (CONST a : INTEGER; VAR buf : POINTER TO ARRAY OF CHAR);
Такое не проходит. Проходит такое:
PROCEDURE Tst* (CONST a : INTEGER; VAR buf : ARRAY OF CHAR);
Последний пример понятен (возможна его трактовка как с использованием понятия "открытый массив", так и заданием модели структуры массива).. А насчет первого - хм похоже на недоработку ЯП... Айяяй ;)