Правила синтаксиса и значение.

Составные типы данных в D Pascal

Эта глава обрисовывает три механизма создания составных значений в Паскале: множества, записи и файлы. Предлагается ограниченная версия множеств. Файлы расширяют текстовые фалы CF Pascal до фалов иных, чем CHAR типов. Записи предлагают механизм группировки для любого конечного комплекта типов.

Любой порядковый тип содержит значения, каковые являются атомарными – их значения не являются составными, исходя из этого неделимы. Составные типы данных, со своей стороны комбинируют ранее определенные типы, каковые смогут быть порядковыми либо составными типами, в новые типы, каковые содержат компоненты ранее определенных типов.

::= |

::=

::= SET OF

| FILE OF

| RECORD END

::=

::= |

::=

::=

Множества, записи и файлы хранят компонентные типы различными методами. Множества и файловые типы хранят компоненты однообразных типов, а записи – различных. Типы записей и множеств хранят компоненты не учитывая порядка, в то время как файловые типы образуют последовательности компонентов. Любой компонент записи возможно произвольно выбран, доступ к компонентам файла осуществляется последовательно. Для множеств операция выбора не выяснена.

Множества.

Тип данных множество разрешает программисту объявлять и применять переменные, каковые являются множествами, элементы которых сохраняются в маленьких, ограниченных комплектах данных. Полный комплект операций над множествами не поддерживается.

Тип данных множество определяется следующим образом:

TYPE

SetType = SET OF ComponentType;

где ComponentType есть порядковым типом. Множества Паскаля ограничены по количеству хранимых элементов, большой размер для того чтобы комплекта данных не есть частью спецификации Паскаля и зависит от реализации Паскаль-машины. В большинстве случаев это пара сотен. Так недопустимо следующее объявление.

TYPE

IntSet = SET OF INTEGER;

но возможно

CONST

Max = 20;

TYPE

IntSet = SET OF 0 .. Max;

В случае если Max выбрано небольшим, дабы быть в установленных пределах. Объявление не снабжают начальных значений переменной множества, так значение Sieve по окончании

VAR

направляться = SET OF 0 .. Max;

неопределено.

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

Вероятные значения множества являются участниками множества мощности (powerset), множества всех подмножеств комплекта значений использованного для определения типа. К примеру множество мощности для типа

TYPE

SmallIntSet = SET OF 1 .. 3;

будет

{{}, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}

т.е. каждые из этих множеств смогут являться значениями типа SmallIntSet.

Константа множества с тремя элементами возможно записана как [1, 2, 3] либо [ 1.. 3]

Любое из следующих присваиваний инициализирует Sieve значением {2, 3, …, 19, 20}:

Sieve := [2 .. 20];

Sieve := [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];

Sieve := [2 .. 9, 10, 11 .. 15, 16, 17, 18 .. 20];

Операциями над значениями типа множеств являются

+ (объединение множеств),

– (разность множеств),

* (пересечение множеств)

= (эквивалентность),

(неэквивалентность),

= (нестрогое надмножество),

IN (членство в множестве).

Операция Операнды — Итог
+ – * SET X SET — SET
= = SET X SET — BOOLEAN
IN ComponentType X SET — BOOLEAN
[ ] ComponentType X ComponentType — SET

Операции объединения, пересечения и разности множеств выяснены лишь для пар множеств, но не для компонентов множеств. Так, в случае если Sieve имеет целые значения, недопустимо писать:

Sieve + 2

Вместо этого элемент возможно оформлен как значение типа 1-множество:

Sieve + [2]

их значения и Примеры выражений

Выражение Значение
[3, 5] TRUE
[3 .. 5] TRUE
[3 .. 5] = [3 .. 5] TRUE
[3 .. 5] = [3 .. 6] FALSE

Двоичный инфиксный оператор IN контролирует членство в множестве:

Выражение Значение
4 IN [3 .. 5] TRUE
4 IN [] FALSE
4 IN [3, 5направляться FALSE

Квадратные скобки употребляются не только для обозначения констант множеств, но и для создания множеств из выражений, чьи значения являются элементами множеств. К примеру, в случае если X имеет тип INTEGER и значение 3:

Выражение Значение
[2, X] {2, 3}
[3 .. X[] {3}
[X .. X+2, SUCC(X+7)] {3, 4, 5, 11}
[X .. 1] {}

Свойства операторов для множеств

Оператор Ассоциативность Приоритет
[ ] Нет Верховный
* Левая
+ – Левая
сравнения Нет Низший

Ниже приведено вычисление примеров множеств в нотации констант множеств Паскаля:

[1] + [7 .. 9] * [7, 9] = [1] + [7, 9] = [1, 7, 9]

[4 .. 6] – [4, 6] + [1] = [5] + [1] = [5, 1]

Правила синтаксиса и Значение.

Синтаксические правила для выражений с операциями над множествами приведены ниже.

::=

|

::=

| |

::= |

::= |

| | ()

| NOT |

::= = | | | | = | IN

::= + | –

::= + | – | OR

::= * | DIV | MOD | AND

::= []

::= , |

::= | выражение .. выражение

Значение каждой операции между операндами-операндом элементом и-множествами возможно представлено в терминах простых математических операторов

E1 = E2 (s) = (E1 (s) = E2 (s))

E1 E2 (s) = (E1 (s) ¹ E2 (s))

E1

E1 = E2 (s) = (E1 (s) E E2 (s))

Me IN E2 (s) = (E1 (s) I E2 (s))

E1 + E2 (s) = (E1 (s) E E2 (s))

E1 – E2 (s) = (E1 (s) – E2 (s))

E1 * E2 (s) = (E1 (s) C E2 (s))

[Me] (s) = {Me (s)}

(E) (s) = E (s)

для любого состояния s. Для более сложных выражений порядок исполнения операций задается правилами синтаксиса, предшествования и ассоциативности.

Файлы.

Файлы являются упорядоченными последовательностями значений. Операторы WRITE додают значения к существующей последовательности (неизменно в финиш), операторы READ смогут приобретать значения в той же последовательности, в которой они были ранее считаны. Значения не ограничены типом CHAR как в текстовых файлах, но смогут быть представлены практически любым типом Паскаля. Буферные переменные и операторы PUT/GET предлагают дополнительные методы управления файлами.

Дополнительно к текстовым файлам, Паскаль разрешает нам определять новые файловые типы с компонентами любого ранее заявленного типа за исключением тех агрегатных типов, в каковые входят файлы. Обычное объявление файлового типа:

VAR

IntFile: FILE OF INTEGER;

Значение IntFile есть последовательностью значений типа INTEGER – лишь значения типа INTEGER смогут быть считаны из либо записаны в таковой файл. Файловые переменные – единственный тип переменных Паскаля, каковые не смогут принимать участие в операторах присваивания. Все файловые значения должны быть созданы с применением преопределенных операций.

Объявление файловой переменной неявно объявляет буферную переменную, записываемую как файловый идентификатор, за которым направляться стрелка вверх (к примеру, IntFile^) того же типа, что и компоненты файла. В то время, когда мы читаем файл, IntFIle^ содержит значение дешёвое для считывания. Новые элементы файла добавляются в файл заполнением буферной переменной и записью ее содержимого. Буферные переменные смогут оказаться везде, где появляются другие переменные. К примеру:

3 + IntFile^ * 7

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

::= |

| | ()

| NOT |

::= |

::= ^

::=

Не смотря на то, что синтаксические правила говорят о том, что идентификатор, за которым направляться некое количество знаков ^ есть файловой переменной, практически лишь один знак ^ может оказаться .

Значения текстовых файлов – 3-перечни. Первые два элемента которых строки будущего и прошлого файла. Для произвольных файлов значения прошлого и будущего – это перечни элементов типа которым заявлен тип. Третий элемент – индикатор режима, что показывает, открыт ли файл для чтения либо записи.

Потому, что объявление файловой переменной вводит буферную переменную семантика операторов объявления для файлов должна быть поменяна чтобы учесть буферную переменную.

VAR F: FILE OF TypeT (s) = s E {F }

Нетекстовые файлы.

Файлы – это последовательности элементов одного типа. Операции над файлами перечислены ниже.

Операция Тип операнда — Тип результата
REWRITE FILE — void
PUT FILE — void
RESET FILE — void
GET FILE — void
EOF FILE — BOOLEAN

Термин void (пустой) обозначает, что эти операции не возвращают значение, эти операции похожи на операторы процедур Паскаля и смогут оказаться везде, где может оказаться оператор. Воздействие этих операций на состояние файла представлено конечным автоматом ниже, что имеет два состояния R и W.

Начальные RESET либо REWRITE устанавливают файл в режим R либо W.

REWRITE и PUT употребляются для построения файловых значений. REWRITE очищает файл и готовит его для записи.

REWRITE(F) = {(u,v): F не INPUT либо OUTPUT и v = u за исключением того,

что v(F) = }

В случае если файл открыт для записи, PUT додаёт значение переменной в буфере к файлу и оставляет значение переменной буфера неизвестной.

PUT(F) = {(u,v): u(F).3 = W и v = u, за исключением того, что v(F).1 = u(F).1N(u(F^)) и v(F^) неопределено}

PUT неопределен, в то время, когда файл не открыт для чтения.

К примеру, для записи файла целых чисел, он должен быть заявлен и инициализирован.

VAR

IntList: FILE OF INTEGER;

BEGIN

REWRITE(IntList);

END

Значения присваиваются IntList^ так, дабы следующий оператор PUT добавит значение в IntList.

{Эквивалентно WRITE(IntList, 1)}

IntList^ := 1;

PUT(IntList); {Додаёт 1 в IntList, IntList^ неопрелен}

{Эквивалентно WRITE(IntList, 2)}

IntList^ := 2;

PUT(IntList); {Додаёт 2 в IntList, IntList^ неопрелен}

В данной точке IntList содержит значения 1 и 2 в перечне прошлого, файл открыт для записи и содержимое IntList^ неопределено.

IntList = и IntList^ неопределено

RESET и GET – операции, каковые просматривают значения из файлов. RESET возвращет указатель файла в начальную позицию чтобы возможно было начать чтение. Значению переменной файлового буфера присваивается значение первого компонента в перечне будущего файл, в случае если такой имеется.

RESET(F) = = {(u,v): F не INPUT либо OUTPUT и v = u за исключением того,

что v(F) = и v(F^) = ?(u(F).1 u(F).2)}

Потому, что ? не выяснена на безлюдных перечнях, значение переменной буфера кроме этого не выяснено, в то время, когда RESET используется к безлюдному файлу.

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

направляться(F) = {(u,v): u(F).3 = R и u(F).2 ¹ и v=u, за исключением того,

что v(F).1 = u(F).1 N(? (u(F.2))), v(F).2 = ? (u(F.2)), и v(F^) = ? (? (u(F.2)))}

В случае если файл не открыт для чтения, программа при вызове GET выдает неточность времени исполнения, кроме этого неточность случится, если не осталось данных для считывания (перечень будущего безлюден).

Записи.

В то время, когда в программе должен быть использован сложный объект данных, комфортно иметь неспециализированное имя для данных, каковые его обрисовывают и объявлять его без явного перечисления имен его частей. Записи Паскаля разрешают дать в один раз описание объекта и применять его потом по неспециализированному имени либо по именам частей.

Записи разрешают собирать некое количество связанных данных, вероятно различных типов, в один объект. Любой элемент данных, именуемых полем, складывается из имени, типа и двоеточия.

В следующем примере обрисовано два типа записей, Date и WorkerInfo, любой из которых содержит три поля. Кое-какие из полей WorkerInfo таже являются записями. Так, для описания сложных объектов, записи смогут быть положенными.

TYPE

Month = (NoMonth, Jan, Feb, Mar, Apr, May, Jun,

Jul, Aug, Sep, Oct, Nov, Dec);

DayNum = 1 .. 31;

ValidYear = 1850 .. 2050;

Date = RECORD

Mo: Month;

Day: DayNum;

Year: ValidYear;

END;

WorkerInfo = RECORD

SSNumber: INTEGER;

BirthDay: Date;

FirstHired: Date;

END;

В то время, когда переменная объявляется с типом записи, ее имя ссылается на всю запись. Как неспециализированное имя переменная нужна, к примеру при передаче параметров в процедуру. Но для манипулирования частями записи необходимы другие имена. Поля смогут именоваться добавлением их имен из определения типа с именем переменной через точку. К примеру, переменная

VAR

Worker: WorkerInfo;

обрисовывает Worker как запись с тремя полями SSNumber, BirthDay и FirstHired. Имена частей данной переменной будут

Worker.SSNumber

Worker.BirthDay

Worker.FirstHired

Первый элемент есть атомарным и ему возможно присвоено значение

Worker.SSNumber = 123456789;

Две другие части являются записями и мы должны обращаться к их частям.

Worker.BirthDay.Mo = Feb;

Worker.FirstHired.Day = 22;

Урок 1. Синтаксис как раздел науки о языке. Главные единицы синтаксиса


Также читать:

Понравилась статья? Поделиться с друзьями: