Программирование >>  Формирование пользовательского контейнера 

1 ... 116 117 118 [ 119 ] 120 121 122 ... 156


нено довольно загадочными операторами. Не беспокойтесь, для понимания интерпретатора Mini С++ вам не придется иметь дело с таким уровнем формализации С++. Те части языка, которые интерпретирует Mini С++, легко понять. Как уже отмечалось, все же необходимо базовое представление о том, как определен язык С++. Для этой цели достаточно неформального обсуждения, приведенного далее. Тем не менее, помните, что в нем некоторые концепции намеренно упрощаются.

Профамма на языке С++ состоит из одной или нескольких функций и глобальных переменных (если таковые есть). Функция состоит из имени функции, списка ее парамефов и тела функции, представляющего собой блок кода. Блок начинается знаком {, далее следуют один или несколько операторов, и завершается он знаком }. Блок кода (также называемый составным оператором) создает область видимости. По существу оператор (statement) - это либо выражение или вложенный блок, либо консфукция, начинающаяся с ключевых слов if, for или int. Вложенный блок создает вложенную область видимости.

1 Примечание

Несмотря на то, что перечисленных категорий операторов (ключевое слово, блок и выражение) достаточно для понимания функционирования интерпретатора Mini С++, интересно отметить, что стандарт С++, разработанный ANSI/ISO, использует более детальное определение. В стандарте перечислены следующие виды операторов: помеченный, выражение, составной, выбора, повтора, перехода, объявления и блок try.

Программа на языке С++ начинает выполнение с вызова функции mainO. И завершается, когда обнаружена последняя закрывающая фигурная скобка ) или последний оператор return при условии, что нигде в программе не было вызовов функций exit о или abort о. Все остальные функции, содержащиеся в программе, должны прямо или косвенно вызываться функцией mainO. Таким образом, интерпретатор Mini С++ просто стартует в функции main о и завершается, когда она заканчивает свое выполнение.

Выражения С++

в основу языка С++ положено выражение, благодаря ему в программе совершается большая часть действий. Для того чтобы вы поняли, почему это так, напомню, что в языке С++ определены три категории операторов: ключевое слово, блок и выражение. Это означает, что любой оператор, который не начинается ключевым словом и не описывает блок, по определению является оператором-выражением. Следовательно, все приведенные далее операторы - это выражения.

count = 100; , строка 1

saitple = i / 32 * (с-10) ; строка 2



num = abs(count) * 2; строка 3

strcpy(strl, str2); строка 4

Давайте посмотрим пристальней на каждый из этих операторов-выражений. В языке С++ знак равенства (=) означает операцию присваивания. Это важно. Язык С++ не трактует присваивание как отдельный вид оператора, в отличие от некоторых других языков программирования. Напротив, в С++ знак равенства - это операция присваивания, и значение, полученное в результате этой операции, равно величине, полученной в правой части выражения. Следовательно, в языке С++ оператор присваивания - это на самом деле выражение присваивания (assignment expression). А поскольку это выражение, оно имеет значение. Вот почему корректна запись приведенных далее выражений.

а = b = с = 100;

If ( (а = 4+5) == О ) ...;

Причина работоспособности приведенных операторов в том, что операция присваивания порождает значение

В строке 2 приведено более сложное выражение присваивания. В этом случае вычисляется значение выражения справа от знака равенства и присваивается переменной sample.

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

Как показано в строке 4, даже сам по себе вызов функции - это уже выражение. В данном случае вызывается функция strcpy о для копирования содержимого одной строки в другую. И хотя значение, возвращаемое функцией strcpyo, игнорируется, вызов этой функции представляет собой выражение.

Определение выражения

Для вычисления выражения интерпретатор Mini С++ использует синтаксический анализатор выражений. Прежде чем вы сможете уяснить его принцип действия, следует понять, как строятся выражения. Практически во всех языках программирования выражения описываются с помощью набора порождающих правил (production rules), которые описывают взаимосвязь операндов и операций. Далее приведены порождающие правила для описания выражений интерпретатора Mini С++. выражение [присваивание][пзначение] присваивание лзначение = пзначение лзначение переменная пзначение часть/оп-отн часть]



часть терм[+терм]1-терм]

терм фактор[*фактор][/фактор][%фактор]

фактор - /+, - ++, или -/ атом f++ или -]

атом - переменная, константа, функция, или (выражение)

В приведенной формальной записи оп-отн обозначает любую операцию отношения языка С++. Термины лзначение и пзначение означают объекты, размешенные соответственно слева и справа от оператора присваивания. Стрелку можно заменить словом порождает . Вам следует знать, что старшинство операций (или порядок выполнения операций) встроено в порождающие правила. Чем выше старшинство, тем дальше от начала в списке правил указана операция. Как показывают порождающие правила, интерпретатор Mini С++ поддерживает следующие операции: + -*/%++ -

< <= > >= == != О

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

count = 10 - 5 * 3;

Сначала применим правило 1, разбивающее выражение на три части, count . = 10 - 5 * 3

лзначение, присваивание пзначение

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

10 - 5*3

терм минус терм

Очевидно, что второй терм состоит из факторов 5 и 3. Оба фактора - константы, а значит, представляют самый низкий уровень порождающих правил. Теперь начнем движение в обратном направлении для вычисления выражения. Сначала найдем произведение 5*3, равное 15. Далее вычтем это значение из 10 и получим -5. И, наконец, эта величина присваивается переменной count и, кроме того, именно она является значением всего выражения. Анализатор выражений интерпретатора Mini С++ вычисляет выражения точно так же. Он просто выполняет порождающие правила.

Поскольку синтаксический анализатор выражений очень важен для интерпретатора Mini С++, с него мы и начнем.

Синтаксический анализатор выражений

Фрагмент кода, в котором читаются и анализируются выражения, называется синтаксическим анализатором выражений (expression parser). Вне всякого сомнения, он является наиболее важной подсистемой, необходимой интер-



1 ... 116 117 118 [ 119 ] 120 121 122 ... 156

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика