Глава 5. базовые элементы языка
ПРОГРАММИРОВАНИЯ ( Object Pascal, Turbo Delphi )
§ Синтаксис и семантика языка программирования
§ Методы описания синтаксиса
§ Идентификаторы
§ Константы
§ Адресация в оперативной памяти
§ Переменные
§ Типы
§ Выражения и операции
§ Скалярные типы данных (логический, целые, символьный, перечисляемый, тип-диапазон, вещественные)
§ Арифметические и логические операции, операции отношения
§ Приоритет операций
§ Структура программы
Билет 17. Синтаксис и семантика языка программирования . Алфавит . Методы формального описания синтаксиса.
СИНТАКСИС И СЕМАНТИКА
Синтаксисязыка программирования – это форма, а семантика– смысл его выражений, операторов и программных единиц.
Формальное описание синтаксиса языка строится с использованием терминалов и нетерминалов. Конструкции языка, для которых требуются определения, называются нетерминальными символами или просто нетерминалами(например, <оператор>, <число>, <условный оператор> и т. д.). Число нетерминалов равно числу правил языка. Собственные символы (символы алфавита) и конструкции языка, для которых не требуется специальное описание, называются терминальными символами или терминалами.
Алфавит языка Delphi Рascal включает:
- прописные и строчные латинские буквы от aдо zи от Адо Z, а также знак подчеркивания
- арабские цифры от 0до 9
- специальные символы + - * / = , ‘ . : ; < > [ ] ( ) { } ^ @ $ # &и пробел - составные символы := <> .. <= >= (* *) (. .) //
Терминалами также являются зарезервированные слова (begin end array const if then elseи т.д.), в состав которых входят стандартные директивы (absolute assembler external far forward near private virtualи др.).
МЕТОДЫ ФОРМАЛЬНОГО ОПИСАНИЯ СИНТАКСИСА ЯЗЫКА
Форма Бэкуса-Наура (БНФ):
<цифра> 0 1 2 3 4 5 6 7 8 9
<условный оператор> if <логическое выражение> then
<оператор>
if <логическое выражение> then
<оператор> else <оператор>
Билет 18. Идентификаторы . Константы . Типизированные константы .
Синтаксическая диаграмма |
( |
условный оператор): |
if |
логическое |
выражение |
then |
оператор |
else |
оператор |
ИДЕНТИФИКАТОРЫ
Текст программы состоит из лексем. Лексемы языка Delphi Pascal представлены такими категориями как специальные символы, идентификаторы, зарезервированные слова, метки, числовые константы и строковые константы. Две соседние лексемы должны отделяться друг от друга разделителями.
Идентификатор (имя)– это строка символов, используемая для идентификации некоторой сущности в программе (переменной, метки, подпрограммы, параметра и т.д.). Идентификаторы могут быть стандартные и пользовательские. Стандартные идентификаторы служат для обозначения заранее определенных разработчиками языка типов данных, констант, процедур и др.
Правила построения идентификаторов:
- идентификаторы могут иметь произвольную длину, но значащими будут только первые 255 символов;
- всегда начинается буквой, за которой могут следовать буквы и цифры (символ подчеркивания считается буквой, пробелы и специальные символы недопустимы);
-
буква |
цифра |
буква |
Синтаксическая диаграмма конструкции <идентификатор>
КОНСТАНТЫ
Языки программирования интерпретируют данные как константы или переменные.
Константа– элемент данных, значение которого не изменяется в процессе выполнения программы.
Литералпредставляет собой значение константы, записанное непосредственно в программе (например, в выражении 2 + 5.1*х использованы два литерала "2" и
"5.1").
Поименованная константаобъявляется в инструкции секции описания констант Const.
Const
Ln10 = 2.3026;
Ln10R = 1 / Ln10;
X = MaxInt div SizeOf( Real);
КОНСТАНТЫ
Значениями констант в языке Delphi Рascal могут быть:
• Целые числа (от -9 223 372 036 854 775 808 (-263) до 9 223 372 036 854 775 807
(263-1)).
• Вещественные числа. Может использоваться формат с фиксированной точкой или формат с плавающей точкой (а = 61.2; b = 3.14е5; c = -72Е-3).
• Шестнадцатеричные числа (в диапазоне от $0000 0000 0000 0000 до $FFFF FFFF FFFF FFFF).
• Логические константы (True, False).
• Символы. Записываются в апострофах, кроме того допускается использование записи символа путем указания его внутреннего кода, которому предшествует символ # (Znak1 = 'd'; Znak2 = 'ф'; Znak3 = #90).
• Строки символов. Любая последовательность символов, заключенная в апострофы. Можно составить из кодов нужных символов с предшествующими каждому коду знаком #.
• Конструкторы множеств. Список элементов множества, обрамленный квадратными скобками (a = [1,2,4..7,12]; b = [red,blue,green]; c = [True]).
• Признак неопределенного указателя - NIL.
АДРЕСАЦИЯ
Оперативная память представляет собой последовательность ячеек емкостью 1 байт (8 бит). Доступ к любой ячейке осуществляется путем указания ее адреса.
MS-DOS. Память разбита на сегменты– непрерывные области памяти размером 64 К (65536 байт). Начало любого сегмента отстоит от начала предыдущего на 16 байт. Смещение– номер ячейки памяти, отсчитанный относительно той ячейки, с которой начинается сегмент.
Логический адрес конкретной ячейки: сегмент : смещение
физический адрес = сегмент*10h + смещениеНапример, ячейка с физическим адресом 00012hможет иметь логическийадрес 0001h : 0002hлибо 0000h : 0012h.
Windows. Приложения Windows имеют доступ ко всей памяти компьютера. Используется "страничная" модель памяти. Под адресом будем понимать целое число размером 32 бита (4 байта). Например, 1111FFFFh
Билет 19. Переменные . Адресация . Типы.
ПЕРЕМЕННЫЕ
Переменнойназывается поименованная область в памяти компьютера, выделяемая для хранения конкретных данных, значение которой может изменяться в ходе выполнения программы. Переменные интерпретируются однозначным способом – с помощью явного указания ее типа в специальном разделе описаний. Тип соответствует количеству байт, которые должны быть выделены под эту переменную в соответствии с теми значениями, которые сможет принимать переменная.
Возможна инициализация переменных в их объявлениях:
Var
S : string = 'Start';
Типизированная константа– переменная с заранее определенным значением.
Const
A : Real = 5.6;
ТИПЫ
Типы с уникальными именами описываются в специальной секции раздела описаний.
Type
LightType = (red, yellow, green);
Var
A, B, StreetLight : LightType;
Если значение не структурное, то есть не распадается на компоненты, то оно называется скаляром, а сам тип, описывающий такие значения – скалярный тип.
Параметры-атрибутыпеременной: имя, адрес, значение, тип, время жизни, область видимости.
Билет 20. Выражения и операции (логические , арифметические , отношения) Приоритет операций.
ВЫРАЖЕНИЯ, ОПЕРАЦИИ
Выражениезадает порядок выполнения действий над элементами данных и состоит из операндов (константы, переменные, обращения к функциям), знаков операций и круглых скобок. Операцииопределяют действия, которые надо выполнить над операндами. Операция – атрибут типа.
(X + sin(Y) - 10)*4
X,sin(Y),10,4– операнды, "+","-","*"– операции.
Унарные операцииотносятся к одному операнду и всегда записываются перед ним (not, @, +, -).
Бинарные операциивыражают отношение между двумя операндами и записываются между ними (X + Y).
ЛОГИЧЕСКИЙ ТИП
Значениями переменных логических (булевских) типов могут быть логические константы True, False.
Var
X : Boolean;
Логические типы: Boolean (1 байт), ByteBool (1 байт), WordBool (2 байта), LongBool (4 байта).
Логические переменные могут выступать операндами в логических операциях.
Операнд 1 | Операнд 2 | and (конъюнкция) | or (дизъюнкция) | xor (исключающее ИЛИ) | not (отрицание) |
False | False | False | False | False | - |
True | False | False | True | True | - |
False | True | False | True | True | - |
True | True | True | True | False | - |
True | - | - | - | - | False |
False | - | - | - | - | True |
Результат операций сложения "+", вычитания "-", умножения "*", целочисленного деления div, возвращения остатка от целочисленного деления modдвух переменных X и Y относится к целому типу Integer(либо к Int64, если X или Y имеет тип Int64). Результат операции деления "/" относится к наиболее мощному вещественному типу Extended.
ЦЕЛОЧИСЛЕННЫЕ ТИПЫ |
К операндам |
целых |
типов могут быть применены |
арифметические операции |
. |
Название |
Длина, байт |
Диапазон значений |
Byte |
.. |
ShortInt |
- |
128 .. +127 |
Word |
0 .. 65535 |
SmallInt |
- |
32768 .. +32767 |
Cardinal |
( |
LongWord |
) |
.. |
Integer |
( |
LongInt |
) |
- |
147 483 |
.. |
+ |
2 147 483 |
Int64 |
- |
.. +2 |
– |
Var X : Byte; Y : ShortInt;
... Z := X + Y; {Z Integer}
Билет 21 . Скалярные типы данных ( логические , символьные , перечисляемый , тип-диапазон ) Порядковые типы.
ЦЕЛОЧИСЛЕННЫЕ ТИПЫ
Арифметические операции сдвигаK shl N и K shr N оперируют с двоичным (битовым) представлением целых чисел. Они восстанавливают в качестве результата значение, полученное путем сдвига на N позиций влево или вправо числа К, представленного в двоичном виде. Тип результата – Integer.
2 shl 7 = 256; (2)10 = (10)2; (100000000)2 = (256)10.
161 shr 2 = 40; (161)10 = (10100001)2; (101000)2 = (40)10.
При использовании логических операций применительно к целым числам осуществляется побитное (поразрядное) сравнение операндов. Тип результата – наименьший целый, включающий типы операндов. Двоичные цифры результата образуются по следующим правилам:
Операнд 1 |
Операнд 2 |
and |
or |
xor |
not |
- |
- |
- |
- |
- |
- |
- |
- |
X : ShortInt = 5; (X)2 = 0 0000101; X := not X = (1 1111010)2 = (-6)10.
СИМВОЛЬНЫЕ ТИПЫ
Значениями переменных символьного типа является множество всех символов компьютера. Каждому символу приписывается целое число (код). В основе кодировки лежит 7-битный код ASCII(American Standard Code of Information Interchange). Символы с кодами 128..255 отводятся под национальный алфавит – 1-байтовые кодировки CP866 (DOS), KOI8-R, ANSI CP1251 (Win)). Unicode – 2 байта.
Var
X : Char;
...
X := 'ф';
X := #244; { CP 1251}
Символьные типы – Char, ANSIChar (1 байт); WideChar (2 байта).
Применимы встроенные функции:
CHR(X)– преобразует выражение Х : Byte в символ и возвращает этот символ;
UPCASE(X)– возвращает прописную букву, если Х – строчная латинская буква, в противном случае (например, если Х – русская буква) возвращает сам символ Х.
ПЕРЕЧИСЛЯЕМЫЙ ТИП
Перечисляемый тип задается перечислением тех значений, которые он может получать. Значения перечисляемого типа должны иметь синтаксис идентификаторов. Во внутреннем представлении значения перечисляемого типа кодируются целыми числами, начиная от нуля.
Type
Colors = (red, white, blue);
Var