Синтаксис языка программирования – это форма, а семантика – смысл его выражений, операторов и программных единиц.
Формальное описание синтаксиса языка строится с использованием лексем – минимальных значимых единиц-элементов текста. Лексемы, которые являются названиями конструкций языка, называются нетерминальными символами или просто нетерминалами (например, <оператор>, <число>, <условный оператор> и т. д.). Число нетерминалов равно числу правил языка. Собственные символы (символы алфавита) и лексемы языка, для которых не требуется специальное описание, называются терминальными символами или терминалами.
Алфавит языка С включает:
- прописные и строчные латинские буквы от a до z и от А до Z , а также знак подчеркивания;
- пробельные символы: пробел, символы табуляции, символы перехода на новую строку.
Терминалами являются зарезервированные слова. В языке С это:
asm else new this
auto enum operator throw
bool explicit private true
break export protected try
case extern public typedef
catch false register typeid
char float reinterpret_cast typename
class for return union
const friend short unsigned
const_cast goto signed using
continue if sizeof virtual
default inline static void
delete int static_cast volatile
do long struct wchar_t
double mutable switch while
dynamic_cast namespace template
В качестве метода формального описания синтаксиса языков программирования зачастую используют Форма Бэкуса-Наура (БНФ):
<цифра> ® 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<условный оператор> ® if <логическое выражение> then <оператор>
| if <логическое выражение> then <оператор>
else <оператор>
Синтаксическая диаграмма
Рис.4.1.
Лексемы текста программы языка С представлены такими категориями как специальные символы, идентификаторы, зарезервированные слова, метки, числовые константы и строковые константы. Две соседние лексемы должны отделяться друг от друга разделителями(точка, скобки, запятая, пробельные символы).
Идентификатор (имя) – это строка символов, используемая для идентификации некоторой сущности в программе (переменной, метки, подпрограммы, параметра и т.д.). Идентификаторы могут быть стандартные и пользовательские.
Стандартные идентификаторы служат для обозначения заранее определенных разработчиками языка типов данных, констант, процедур и др. Правила построения идентификаторов:
- идентификаторы могут иметь произвольную длину, но некоторые компиляторы накладывают ограничения на длину (например в Borland C++3.1 значащими будут только первые 32 символа);
- всегда начинается буквой, за которой могут следовать буквы и цифры (символ подчеркивания считается буквой, пробелы и специальные символы недопустимы);
- прописные и строчные буквы различаются (sysop, SySoP, SYSOP – три различные имени);
- идентификаторы не должны совпадать с терминалами языка.
Синтаксическая диаграмма конструкции <идентификатор>
Рис.4.2.
Языки программирования интерпретируют данные как константы или переменные.
Константа - элемент данных, значение которого не изменяется в процессе выполнения программы.
Литерал представляет собой значение константы, записанное непосредственно в программе (например, в выражении 2 + 5.1*х использованы два литерала "2" и "5.1").
Поименованная константа объявляется в инструкции секции описания констант сonst.
Рис.4.3.
сonst char c='C'; // константа символьного типа
Значениями констант в языке С могут быть:
• Целые числа ( например 8, 0, 128675);
• Вещественные числа. Может использоваться формат с фиксированной точкой или формат с плавающей точкой (например а = 61.2; b = 3.14е5; c = -72Е-3);
• Строки символов. Любая последовательность символов, заключенная в кавычки (например Slovo="Здесь был Vasya").
Оперативная память разбита на сегменты – непрерывные области памяти размером 64 К (65536 байт). Начало любого сегмента отстоит от начала предыдущего на 16 байт.
Память - это совокупность 65536 перекрывающихся сегментов.Логический адрес конкретной ячейки: сегмент : смещение. Смещение – номер ячейки памяти, отсчитанный относительно той ячейки, с которой начинается сегмент. физический адрес = сегмент*10h + смещение.
Рис.4.4.
В сегменте данных (адрес хранится в регистре процессора DS) располагаются глобальные переменные и константы. Программа (последовательность команд) находится в кодовом сегменте (адрес - в регистре CS). Адрес сегмента стека - в регистре SS.
Переменной называется поименованная область в памяти компьютера, выделяемая для хранения конкретных данных, значение которой может изменяться в ходе выполнения программы. Переменные интерпретируются однозначным способом – с помощью явного указания ее типа в специальном разделе описаний. Тип соответствует количеству байт, которые должны быть выделены в сегменте данных под эту переменную в соответствии с теми значениями, которые сможет принимать переменная.