Автор Тема: [CP][Oberon-07/11]Procedure Type call in expression.  (Прочитано 16264 раз)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: [CP][Oberon-07/11]Procedure Type call in expression.
« Ответ #30 : Январь 14, 2013, 05:57:58 am »
А полноценных процессора сейчас только три: i386, AMD64 и ARM. Остальные(SPARC, Power PC и т. д.) либо померли, либо имеют специфическое применение.
MIPS и SPARC ни разу не померли. MIPS очень активно используется в КИтае -- самом большом в мире рынке электроники. Откройте свой wifi-роутер и обнаружите там именно MIPS.
SPARC-чипы российского производства активно используется военными в России.
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: [CP][Oberon-07/11]Procedure Type call in expression.
« Ответ #31 : Январь 14, 2013, 10:37:22 am »
То есть чистым парсером Оберон-07 не парсится (и это не единственное такое место). Впрочем, это к данной теме уже отношения не имеет.
Парсится. Просто, на следующем этапе после синтаксического анализа придётся ползать по дереву и собирать информацию, которая у нас есть уже сейчас.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: [CP][Oberon-07/11]Procedure Type call in expression.
« Ответ #32 : Январь 14, 2013, 10:41:53 am »
Я считаю, что вызовам процедур действительно не место в Designator, как это и сделано в 07-версии языка. Вызовы нужно помещать в выражения (в случае функций) и в операторы (в случае собственно процедур).
Подозреваю, что тогда не получится LL(1).

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: [CP][Oberon-07/11]Procedure Type call in expression.
« Ответ #33 : Январь 14, 2013, 12:38:12 pm »
POINTER TO PROCEDURE
Поинтеров на процедуру не бывает.

Компилятор akorn1 ругается на рекурсивное определение типа (и я не уверен что это корректно).
Тем хуже для компилятора akorn1. Процедурный тип возвращающий переменную этого же типа

P = PROCEDURE(): P;

ничем не хуже типа

X = POINTER TO RECORD x: X END.

Тип P может использоваться для программирования цепочек вычислений а-ля конечный автомат.

В C# объявить такой тип тоже можно:

delegate P P ();

akron1

  • Jr. Member
  • **
  • Сообщений: 76
    • Просмотр профиля
Re: [CP][Oberon-07/11]Procedure Type call in expression.
« Ответ #34 : Январь 14, 2013, 01:27:44 pm »
Тем хуже для компилятора akorn1. Процедурный тип возвращающий переменную этого же типа

P = PROCEDURE(): P;

ничем не хуже типа

X = POINTER TO RECORD x: X END.

Тип P может использоваться для программирования цепочек вычислений а-ля конечный автомат.

В C# объявить такой тип тоже можно:

delegate P P ();


Согласен, здесь я ошибся.
Сейчас посмотрел, как это обрабатывается в Astrobe (ver 4.0.2):

TYPE
P = PROCEDURE(): P;
X = POINTER TO RECORD x: X END.

компилируется без ошибок

TYPE
R = RECORD x: R END;
A = ARRAY 10 OF A;
VAR v:v;

Сообщение компилятора:
"Error: not a type or undefined"

CONST c = c;

А вот здесь Astrobe упал.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: [CP][Oberon-07/11]Procedure Type call in expression.
« Ответ #35 : Январь 14, 2013, 11:18:21 pm »
Поинтеров на процедуру не бывает.

А. Точно :)

DddIzer

  • Гость
Re: [CP][Oberon-07/11]Procedure Type call in expression.
« Ответ #36 : Январь 15, 2013, 08:49:38 am »
Поинтеров на процедуру не бывает.

А. Точно :)
ну  да - она сама (точнее , переменная проц. типа) есть разновидность указателя... согласно общей схеме высокоуровневой интерпретации  базовых понятий ЯВУ

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: [CP][Oberon-07/11]Procedure Type call in expression.
« Ответ #37 : Июль 14, 2013, 06:31:47 am »
Я тут обнаружил еще более несовместимый с практикой косяк (из той же оперы): нельзя разыменовать указатель, который вернула процедура. Т.е. вот такой банальный код не работает:
make().do();
f(make()^);

Только через временный указатель. Ужос.
« Последнее редактирование: Июль 14, 2013, 06:33:21 am от vlad »