Автор Тема: [Oberon-07M] Странные ошибки компиляции.  (Прочитано 15260 раз)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
[Oberon-07M] Странные ошибки компиляции.
« : Апрель 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

У меня такое ощущение, что в данном случае таки не я неправ, а компилятор.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[Oberon-07M] Странные ошибки компиляции.
« Ответ #1 : Апрель 10, 2011, 12:02:55 am »
Ну и до кучи:
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
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[Oberon-07M] Странные ошибки компиляции.
« Ответ #2 : Апрель 10, 2011, 12:18:24 am »
Покурил доки, понял что 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 и так далее, зарезервированными словами не являются, потому как начисто в описании грамматики отсутствуют.
« Последнее редактирование: Апрель 10, 2011, 12:20:38 am от valexey »
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[Oberon-07M] Странные ошибки компиляции.
« Ответ #3 : Апрель 10, 2011, 12:48:04 am »
А ещё у меня компилятор крашнулся :-)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[Oberon-07M] Странные ошибки компиляции.
« Ответ #4 : Апрель 10, 2011, 01:37:24 am »
Да, кроме того, сообщения компилятора (ошибки) очень уж не информативные.

Кроме всего прочего, он похоже выдает номера ЗНАЧИМЫХ строк, а не строк в исходном файле, то есть он оперирует номерами строк после вырезания всех пустых строк и всех комментариев.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля
Re:[Oberon-07M] Странные ошибки компиляции.
« Ответ #5 : Апрель 10, 2011, 08:40:49 am »
Если компилятор упал, пришлите мне, пожалуйста, на почту, которая указана на сайте компилятора, файл error.log.

Насчет ошибок компилятории, невозможность такой конструкции следует из грамматики языка:
FPSection = ["CONST" | "VAR"] ident {"," ident} ":" FormalType.
FormalType = ["ARRAY" "OF"] qualident.
qualident = [ident "."] ident.

Насчет номеров позиций ошибки, в ближайшее время исправлю.


Илья Ермаков

  • Full Member
  • ***
  • Сообщений: 177
    • Просмотр профиля
    • OberonCore
Re:[Oberon-07M] Странные ошибки компиляции.
« Ответ #6 : Апрель 10, 2011, 08:46:04 am »
PS. А еще меня только что шокировал тот факт, что, если верить грамматике, такие словечки как INTEGER, BOOLEAN, REAL и так далее, зарезервированными словами не являются, потому как начисто в описании грамматики отсутствуют.

Так принято ещё с Паскаля. Они вносятся в таблицу символов при компиляции как предопределённые идентификаторы, которые могут быть, в принципе, перекрыты. Я это помню ещё по Turbo Pascal :)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[Oberon-07M] Странные ошибки компиляции.
« Ответ #7 : Апрель 10, 2011, 08:50:00 am »
В турбопаскале было полное описание грамматики языка? Ну, кроме того такие вещи обязаны присутствовать в грамматике языка. Это её не усложняет, зато делает описание языка полнее.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[Oberon-07M] Странные ошибки компиляции.
« Ответ #8 : Апрель 10, 2011, 09:15:36 am »
Да, я разобрался почему оно не работает, это видно по моим сообщениям :-) Тут не ошибка компилятора а ошибка в дизайне языка.

Как до компа доберусь, вышлю крашлог компилятора.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re:[Oberon-07M] Странные ошибки компиляции.
« Ответ #9 : Апрель 10, 2011, 09:52:23 am »


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);

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[Oberon-07M] Странные ошибки компиляции.
« Ответ #10 : Апрель 10, 2011, 10:50:22 am »
С VAR точно да. первый вариант не помню
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля
Re:[Oberon-07M] Странные ошибки компиляции.
« Ответ #11 : Апрель 10, 2011, 01:40:51 pm »
В Oberon-07 структурные типы могут передаваться в процедуры только по ссылке (через указатель), а не по значению. Соответственно при передаче массива в процедуру, можно указать VAR, если массив может быть изменен, или же CONST, если это входной параметр. Передача массива без VAR или CONST запрещена.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[Oberon-07M] Странные ошибки компиляции.
« Ответ #12 : Апрель 10, 2011, 01:43:23 pm »
В 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.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Rifat

  • Jr. Member
  • **
  • Сообщений: 62
    • Просмотр профиля
Re:[Oberon-07M] Странные ошибки компиляции.
« Ответ #13 : Апрель 10, 2011, 01:48:11 pm »
Да, может я не точно выразился, по значению нельзя передавать массивы и записи, а указатели можно. Указатель тоже относится к структурным типам.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re:[Oberon-07M] Странные ошибки компиляции.
« Ответ #14 : Апрель 10, 2011, 01:49:58 pm »
Да, может я не точно выразился, по значению нельзя передавать массивы и записи, а указатели можно. Указатель тоже относится к структурным типам.

Да, но вот так вот нельзя:
MODULE Test;
    PROCEDURE Tst* (CONST a : INTEGER; buf : POINTER TO ARRAY OF CHAR);
    BEGIN
    END Tst;
END Test.

Кривокосо.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"