Автор Тема: Сообщение о языке  (Прочитано 10216 раз)

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Сообщение о языке
« : Июнь 06, 2012, 08:07:41 pm »
Подскажите пожалуйста, где в сообщении о языке "Компонентный Паскаль" регламентируется порядок секций (CONST, TYPE, VAR, PROCEDURE) и их количество. Потому как после первой объявленной процедуры любая другая секция вызывает ошибку.
« Последнее редактирование: Июнь 08, 2012, 10:48:21 am от valexey »

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Сообщение о языка
« Ответ #1 : Июнь 06, 2012, 08:12:31 pm »
Подскажите пожалуйста, где в сообщении о языке "Компонентный Паскаль" регламентируется порядок секций (CONST, TYPE, VAR, PROCEDURE) и их количество. Потому как после первой объявленной процедуры любая другая секция вызывает ошибку.

Module   =   MODULE ident ";" [ImportList] DeclSeq [BEGIN StatementSeq] [CLOSE StatementSequence] END ident ".".
ImportList   =   IMPORT [ident ":="] ident {"," [ident ":="] ident} ";".
DeclSeq   =   { CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"}}{ProcDecl ";" | ForwardDecl ";"}.

Если что, собщение о языке в человеческом формате можно посмотреть тут: http://plas.fit.qut.edu.au/gpcp/LanguageReport.aspx
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Сообщение о языка
« Ответ #2 : Июнь 06, 2012, 08:34:39 pm »
Спасибо! Ожидал в описании главы про модули найти.

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: Сообщение о языка
« Ответ #3 : Июнь 07, 2012, 12:12:11 pm »
Разве в EBNF знак "|" определяет точную последовательность? Он ведь как оператор ИЛИ.

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Сообщение о языка
« Ответ #4 : Июнь 07, 2012, 12:20:21 pm »
DeclSeq   =   {CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"}} {ProcDecl ";" | ForwardDecl ";"}.

можно разбить на три определения так:

DeclSeq = { ConstTypeVarDecl } { ProcForwardDecl }

ConstTypeVarDecl = CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"}

ProcForwardDecl = ProcDecl ";" | ForwardDecl ";"

Отсюда чётко видно, что сначала должны идти декларации констант, типов, переменных (их можно перемешивать), и только после них можно декларировать процедуры...
to iterate is human, to recurse, divine

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

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Сообщение о языка
« Ответ #5 : Июнь 07, 2012, 12:23:04 pm »
А вот то, что Вирт вот так вот зашифровал простые вещи -- за это ему жирный минус!
to iterate is human, to recurse, divine

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

DIzer

  • Гость
Re: Сообщение о языка
« Ответ #6 : Июнь 07, 2012, 12:24:42 pm »
А вот то, что Вирт вот так вот зашифровал простые вещи -- за это ему жирный минус!
Зато похоже на него(надо же уложиться в 16 страниц)..   :D

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Сообщение о языка
« Ответ #7 : Июнь 07, 2012, 12:39:24 pm »
Разве в EBNF знак "|" определяет точную последовательность? Он ведь как оператор ИЛИ.
Фигурные скобочки означают 0 или более повторений.
Таким образом выделенный кусок правила:
DeclSeq   =   { CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"}}{ProcDecl ";" | ForwardDecl ";"}.

означает что например валидна следующая последовательность:
TYPE CONST VAR CONST TYPE TYPE CONST
В общем, блоки CONST, TYPE, VAR чередуются в любой последовательности сколь угодно долго. И да, | - означает выбор альтернативы при каждом повторении выделенного куска правила между {}.

Затем, после того как мы откостились, отварились и оттайпились, вступает в игру вторая половина правила:
DeclSeq   =   { CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"}}{ProcDecl ";" | ForwardDecl ";"}.

То есть далее у нас сколь угодно долго и в любом порядке чередуются объявления процедур и forward declaration'ы.

PS. Откровенно говоря, в этом всем нет абсолютно ничего сложного, если конечно немного интересуешься грамматиками. А тот кто не интересуется грамматиками, формальное описание грамматики и не будет читать :-)
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: Сообщение о языка
« Ответ #8 : Июнь 07, 2012, 12:43:15 pm »
DeclSeq   =   {CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"}} {ProcDecl ";" | ForwardDecl ";"}.

можно разбить на три определения так:

DeclSeq = { ConstTypeVarDecl } { ProcForwardDecl }

ConstTypeVarDecl = CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"}

ProcForwardDecl = ProcDecl ";" | ForwardDecl ";"

Отсюда чётко видно, что сначала должны идти декларации констант, типов, переменных (их можно перемешивать), и только после них можно декларировать процедуры...
Только отсюда не совсем чётко видно, что разделяющая вертикальная черта определяет и порядок следования элементов CONST, TYPE, VAR.

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: Сообщение о языка
« Ответ #9 : Июнь 07, 2012, 12:45:12 pm »
Таким образом выделенный кусок правила:
DeclSeq   =   { CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"}}{ProcDecl ";" | ForwardDecl ";"}.

означает что например валидна следующая последовательность:
TYPE CONST VAR CONST TYPE TYPE CONST
В общем, блоки CONST, TYPE, VAR чередуются в любой последовательности сколь угодно долго.
Именно про это и имел в виду. Так что я не ошибся.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Сообщение о языка
« Ответ #10 : Июнь 07, 2012, 12:48:49 pm »
Таким образом выделенный кусок правила:
DeclSeq   =   { CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"}}{ProcDecl ";" | ForwardDecl ";"}.

означает что например валидна следующая последовательность:
TYPE CONST VAR CONST TYPE TYPE CONST
В общем, блоки CONST, TYPE, VAR чередуются в любой последовательности сколь угодно долго.
Именно про это и имел в виду. Так что я не ошибся.
Угу. Порядок следования там любой у CONST, VAR, TYPE. А вот у ConstVarType и ProcDeclFwdDecl - вполне конекретный порядок следования.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: Сообщение о языка
« Ответ #11 : Июнь 07, 2012, 12:57:08 pm »
В общем выходит, что если что-то неясно из словесного описания в сообщении о языке, то объяснение следует искать в его нотации. По крайней мере, в семействе виртовских языков.

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Сообщение о языка
« Ответ #12 : Июнь 07, 2012, 01:05:29 pm »
В общем выходит, что если что-то неясно из словесного описания в сообщении о языке, то объяснение следует искать в его нотации. По крайней мере, в семействе виртовских языков.
Да. Точнее я вначале обычно вообще смотрю грамматику, а уже потом словеску (словеской к формальному описанию добавляются дополнительные ограничения, например если четко следовать только грамматике, то вполне валиден вот такой модуль: MODULE Foo; END Bar.). Для C# например такой подход уже прокатит слабо - там в формальной грамматике есть несколько ошибок (в стандарте).
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

DIzer

  • Гость
Re: Сообщение о языка
« Ответ #13 : Июнь 07, 2012, 01:11:39 pm »
Нормально "краткость сестра таланта" - нет , господа, она порождает танцы вокруг идолища... а что? коровятам самое то!!!

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Сообщение о языка
« Ответ #14 : Июнь 07, 2012, 01:27:59 pm »
Кстати, харе батон крошить на Вирта! Это ж обсуждалась грамматика КП, а не Оберона. В обероне оно так:
module  =  MODULE ident ";" [ImportList] DeclarationSequence
 [BEGIN StatementSequence] END ident "." .
DeclarationSequence  =  [CONST {ConstDeclaration ";"}]
 [TYPE {TypeDeclaration ";"}]
 [VAR {VariableDeclaration ";"}]
 {ProcedureDeclaration ";"}.

Что как бы сильно проще и читабельней. Правда тут произвольно чередовать TYPE, VAR, CONST уже не выйдет.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"