Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
StartModul_CPP_Charp_VB_New.docx
Скачиваний:
19
Добавлен:
27.05.2015
Размер:
942.2 Кб
Скачать

Лексический анализ

В информатике лексический анализ — процесс аналитического разбора входной последовательности символов (например, такой как исходный код на одном из языков программирования) с целью получения на выходе последовательности символов, называемых лексемами или «токенами» (подобно группировке букв в словах). Таким образом, в процессе лексического анализа производится распознавание и выделение лексем из входной последовательности символов.

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

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

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

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

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

Синтаксический (грамматический) анализ

В информатике грамматический анализ (грамматический разбор, парсинг) - это процесс сопоставления линейной последовательности лексем языка с его формальной грамматикой. Результатом обычно является дерево разбора. Обычно применяется совместно с лексическим анализом, в процессе синтаксического анализа.

Грамматический анализатор (парсер) - программа или алгоритм, осуществляющий грамматический разбор.

Процессы компиляции и интерпретации можно представить следующей схемой.

Ввод

Интерпретатор

Исходная программа

Интерпретация

Компилятор

Компиляция

Выход

Выполнение

Целевая программа

Рис. 2.4. Компиляция и интерпретация

Комбинированные компиляции и интерпретации

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

Исходная программа

Ввод

Компилятор

Виртуальная машина

Интерпретатор

Компиляция

Выход

Рис. 2.5. Компиляция плюс интерпретация

Виртуальные машины, байт-код и JIT (Just In Time)

Реализация таких языков, как Java, C# и других языков платформы .NET, основана на смешанном решении. Промежуточный код для Java называется байт-кодом. В этом термине отображается тот факт, что виртуальная машина использует компактные команды, подобные командам фактического процессора. Для повышения эффективности времени выполнения байт-кода применяют JIT (Just In Time) компиляторы, называемые джитерами, осуществляющие компиляцию по требованию. Основная идея состоит в том, что машинный код для некоторого модуля создаётся «на лету», в тот момент, когда он первый раз вызывается на выполнение. Последовательность обработки программы можно представить следующей схемой.

Исходная программа

Компилятор

Байт-код

Компиляция

Интерпретатор

Выход

Джитер

Ввод

Джитинг

Выполнение

Машинный код

Рис. 2.6. Компиляция плюс интерпретация и джитинг

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

2.1. Проверка достижения целей

2.2. Правильные ответы

3. Структура программ и правила их кодирования

Цели

Изучив данный учебный элемент, вы будете способны:

  • правильно трактовать виды и назначение единиц трансляции;

  • распознавать структуру программы;

  • правильно трактовать определение функции;

  • выделять структурные составляющие определения функции;

  • распознавать объявления внешних объектов.

3.1. Общие сведения

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

  • комментарии,

  • определения и объявления,

  • операторы.

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

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

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

Определение объекта – это указание транслятору о необходимости создать объект. Оно содержит информацию о его имени и типе. Тип объекта характеризует множество допустимых значений, множество допустимых операций над значением, правила выделения памяти и правила хранения значения (правила разметки памяти). Следовательно, при определении объекта обязательно явно или неявно указывают его имя и тип. При этом тип может быть представлен именем или описанием. Разработчики транслятора вкладывают в него имена некоторых часто используемых типов. В данный момент обратите лишь внимание на следующие предопределённые имена типов:

Тип для описания

Имя в C++

Имя в C#

Имя в Visual Basic

Целых чисел

int

int или Int32

Integer

Вещественных чисел

double

double или Double

Double

Символов

char

char или Char

Char

Строк символов

char* или string

string или String

String

Логических

bool

bool или Boolean

Boolean

Таким образом, тип Integer описывает значения, которые представлены целыми (т.е. без дробной части) числами, Double – множество значений, представленных числами с дробной частью, Char – символьные значения, Boolean – логические значения, а String – строки символов, т.е. некоторую последовательность символов.

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

В языках C++ и C# определения записываются предложениями, которые могут последовательно располагаться на одной строке или на отдельных строках. В Visual Basic они записываются только на отдельных строках теста программы. В любом из представленных языков разрешено в одном определении можно указывать имя одиночного объекта или список имён. Такие предложения формируются по следующим шаблонам:

Язык С++:

<тип> <Имя объекта>;

<тип> <Список имён объектов>;

Язык С#:

<тип> <Имя объекта>;

<тип> <Список имён объектов>;

var <Имя объекта>=<Инициализатор>;

Язык Visual Basic:

Dim <Имя объекта> As <Имя типа>

Dim <Список имён объектов> As <Имя типа>

Dim <Имя объекта>=<Инициализатор>

Например, конструкции

Язык Visual Basic: Язык С++: Язык С#:

Dim m As Integer int m; int m;

Dim n1, n2 As Integer int n1, n2; int n1, n2;

Dim x, w, z As Double; double x, w, z; double x, w, z;

Dim box=56 var box=56;

являются определением целочисленного объекта (переменной) m, двух целочисленных переменных n1, n2 и трёх вещественных переменных x, w, z, соответственно.

На заметку! В языках C++, C# определения записываются в любой позиции среди других предложений и завершаются точкой с запятой. В Visual Basic каждое определение точку с запятой не содержит и записывается на отдельной строке или в одной строке через двоеточие. В любом случае определения всегда должны предшествовать позициям, в которых указано использования объектов.

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

Операция инициализации – это копирование значения сразу же после выделения памяти. Она указывается непосредственно в определении объекта с помощью символа = (равно). Выглядит это следующим образом:

Язык Visual Basic: Язык С++: Язык С#:

Dim a As Integer=60; int a=60; или int a(60); int a=60;

Dim b=700 var b=700;

В данном случае переменная A инициализирована значением 60.

Операция присваивания указывается в любой момент и в нужной позиции текста программы после определения объекта. В простейшем случае присваивание также указывается символом равно (=). Например, для задания значения 35 целочисленной переменной mom задают операцию

Язык Visual Basic: Язык С++: Язык С#:

mom = 35 mom=35 mom=35

Операция ввода предполагает копирование значения от внешнего источника. Каждый язык может иметь собственный набор средств для кодирования ввода данных.

В Visual Basic ввод данных с клавиатуры можно кодировать с помощью блоков диалога или методов классов Console. Например, представленная ниже программа иллюстрирует возможности ввода данных с помощью блока диалога InputBox() и метода Console.ReadLine().

Листинг 3.1.1.

Module Module1

' Иллюстрация ввода и вывода разными средствами

' Программист Автор А. Ф..

Sub Main()

Dim userName As String = InputBox("Как вас зовут?")

MsgBox("Имя пользователя: " & userName)

Console.Write("Введите имя пользователя: ") : userName = Console.ReadLine()

Console.WriteLine("Имя пользователя: {0}", userName)

Console.ReadKey()

End Sub

End Module

Не забывайте, что методы класса – это просто функции, которые определены внутри соответствующего класса. Для обращения к методу класса указывают имя класса, точку и имя метода с круглыми скобками, которые могут быть пустыми или содержать список аргументов. Обычно при работе с консольным окном для кодирования ввода с клавиатуры вы будете вызывать методы Console.ReadLine() и Console.Read(). Первый из этих методов считывает строку символов, а второй – внутренний код одиночного символа. В вызовах методов внутри круглых скобок не указывают никаких аргументов, считанные данные поступают в точку вызова методов. При использовании разных средств ввода данных нужно помнить, что вызов блока ввода InputBox( ) приводит к отображению блока диалога с однострочным редакторов, в строку которого пользователь вводит нужные ему данные. Например, для данной программы отображается блок диалога, вид которого после ввода имени «Волобуев» представлен на рис. 3.1.1.

Рис. 3.1.1. Вид блока диалога ввода после ввода в строку редактора имени пользователя

Поскольку метод Console.ReadLine() возвращает строку символов, которая может представлять текст или образ числа, то для получения самого числа нужно явно указывать преобразование текстового образа в число. Для этой цели в VB используются методы класса Convert или собственные макросы вида CInt(), CDbl() и т.п.. Метод с именем ToInt32(s) или макрос CInt(s) вызывают для преобразования строки символов в целое число, а метод ToDouble(s) или макрос CDbl(s) – в вещественное число удвоенной точности. В конкретном случае ввод целого и вещественного числа и преобразование к числовому типу с помощью методов класса Convert выглядит следующим образом:

Dim mm As Integer= Convert.ToInt32(Console.ReadLine())

Dim m1 As Double = Convert.ToDouble(Console.ReadLine())

Dim box= Convert.ToDouble(Console.ReadLine())

Если использовать макросы, то эти дже операторы приобретают вид

Dim mm As Integer= CInt(Console.ReadLine())

Dim m1 As Double = CDbl(Console.ReadLine())

Dim box= CDbl(Console.ReadLine())

Пример.

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

Ответ (Листинг 3.1.2).

Листинг 3.1.2.

' Вычисление площади прямоугольника

' Программист Автор А.Ф.

Module Module1

Sub Main()

Console.Write("Введите длину строны A прямоугольника: ")

Dim a As Double = Convert.ToDouble(Console.ReadLine())

Console.Write("Введите длину строны B прямоугольника: ")

Dim b As Double = Convert.ToDouble(Console.ReadLine())

Console.WriteLine("Площадь прямоугольника: {0}", a * b)

Console.ReadKey()

End Sub

End Module

После активизации приложения отображается диалог, показанный на рис. 3.1.2.

Рис. 3.1.2. Возможная форма диалога, отображаемого в консольном окне

В C# ввод с клавиатуры кодируется методами Console.ReadLine() и Console.Read(). Они могут вызывается в той же форме, которая описана для VB, но для преобразования к числовому типу можно обычно использовать только средства класса Convert. Например, если записать

int a, b, mm = Convert.ToInt32(Console.ReadLine());

double m1 = Convert.ToDouble(Console.ReadLine());

a=Convert.ToInt32(Console.ReadLine());

b=Convert.ToInt32(Console.ReadLine());

то это будет означать ввод значений переменных mm, m1, a и b с клавиатуры.

Операция ввода может указываться не обязательно в сочетании с именем объекта. Например, если активизировать приложение, в форме листинга 3.1.3

Листинг 3.1.3.

// Пример использования операции ввода

// Программист Автор А. Ф.

using System;

namespace ConsAppSharp00 {

class Program {

static void Main(string[] args) {

Console.Title = "Ввод данных";

Console.WriteLine("Введите a, b."); // Заголовок консольного окна

var a=Convert.ToInt32(Console.ReadLine());

Console.WriteLine("a={0} b={1}",a, Convert.ToInt32(Console.ReadLine()));

Console.ReadKey();

}

}

}

то консольное окно будет иметь состояние, представленное на рис. 3.1.3.

Рис. 3.1.3. Итоговое состояние консольного окна

В C++ ISO/ANSI операция ввода с клавиатуры кодируется операцией извлечения из потока cin, записываемой символом ‘>>’. Например, если записать

int mm; cin>>mm;

double m1; cin>>m1;

int a, b; cin>>a>>b;

то это будет означать ввод значений переменных mm, m1, a и b с клавиатуры.

В C++/CLI операция ввода с клавиатуры кодируется методами класса Console точно так же, как в C# или с помощью потока cin и операции ‘>>’. Например, если записать

int mm = Convert::ToInt32(Console::ReadLine());

double m1 = Convert::ToDouble(Console::ReadLine());

int a, b;

a=Convert::ToInt32(Console::ReadLine());

b=Convert::ToInt32(Console::ReadLine());

или

int mm; cin>>mm;

double m1; cin>>m1;

int a, b; cin>>a>>b;

то это будет означать ввод значений переменных mm, m1, a и b с клавиатуры. Подобно C#, операция ввода с помощью вызовов методов класса Console может указываться не обязательно в сочетании с именем объекта. Например, если активизировать приложение, в форме листинга 3.1.4

Листинг 3.1.4.

// qq.cpp: главный файл проекта.

// Пример использования операции ввода

// Программист Автор А. Ф.

#include "stdafx.h"

using namespace System;

int main(array<System::String ^> ^args) {

Console::Title = L"Ввод данных";

Console::WriteLine(L"Введите a, b."); // Заголовок консольного окна

int a=Convert::ToInt32(Console::ReadLine());

Console::WriteLine(L"a={0} b={1}",a, Convert::ToInt32(Console::ReadLine()));

Console::ReadKey();

return 0;

}

Итог выполнения данного приложения будет иметь такую же форму, которая указана на рис. 3.1.3.

Операция вывода. Значения объектов можно не только задавать, но и отображать на экране. Каждый язык программирования может иметь собственный набор средств кодирования этой операции. Однако для языков, поддерживающих платформу .NET, вывод в консольное окно может кодироваться вызовами методов класса Console. К такому множеству языков относятся VB, C# и C++/CLI. В C++ ISO/ANSI вывод в консольное окно можно реализовать операцией вставки в поток cout, которая указывается символом ‘<<’.

В среде VB для вывода можно использовать как блоки диалога, так и средства класса Console. К множеству блоков вывода сообщений относится, например, блок с именем MsgBox(). Этот блок имеет несколько модификаций. В простейшем случае он может содержать внутри скобок одну строку символов, представляющую отображаемое сообщение. Например, для отображения текста «Это моя первая программа.» достаточно указать вызов этого блока в форме

MsgBox("Это моя первая программа. ")

Если же сообщение состоит из нескольких частей, то части можно сцеплять с помощью символа амперсанда (&) в единую строку символов. Например, в представленной выше программе введённое имя пользователя сцепляется со строкой "Имя пользователя: ".

После вызова такого блока диалога на экране отображается блок диалога, вид которого представлен на рис. 3.1.4.

Рис. 3.1.4. Вид блока диалога вывода сообщения об имени пользователя

Для вывода данных в консольное окно средствами .NET вызывают методы Console.WriteLine([s[, list_elem]]) и Console.Write(s[, list_elem]), которые отображают строку символов, представленную первым параметром s. Второй параметр – это список элементов, используемых для модификации первого параметра непосредственно перед его отображением. Квадратные скобки в данном случае – это условное обозначение того, что эти параметры могут опускаться. В простейших ситуациях в круглых скобках можно указывать текст в кавычках или конкретное одиночное значение или имя одной переменной или выражение.. Например, операторы

Console.WriteLine("Объём контейнера")

Console.Write("Стоимость работ: ")

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

Console.WriteLine(235)

Console.Write(67+33)

обеспечивают отображение числа 235 и 100, соответственно.

Аналогично, любой вызов методов Console.ReadLine(), Console.Read() предполагает, что ввод данных сопровождается их автоматическим отображением в консольном окне. Например, диалог ввода данных в программе, представленной листингом 3.1.1, отображается в консольном окне в форме, которая представлена на рис. 3.1.5.

Рис. 3.1.5. Состояние консольного окна после ввода имени пользователя

В C# и C++/CLI операция вывода в консольное окно указывается аналогично. Если операция записывается в форме отдельного оператора, то вызов метода завершается точкой с запятой. Например, в среде C# операторы

Console.WriteLine("Объём контейнера");

Console.Write("Стоимость работ: ");

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

Console.WriteLine(235);

Console.Write(67+33);

обеспечивают отображение числа 235 и 100, соответственно.

Аналогичные операторы для среды C++/CLI имеют вид:

Console::WriteLine(L"Объём контейнера");

Console::Write(L"Стоимость работ: ");

Console::WriteLine(235);

Console::Write(67+33);

Например, вот как может выглядеть приложение C# для ввода значений с клавиатуры и отображения значений в консольном окне.

Листинг 3.1.5.

// Иллюстрация кодирования ввода/вывода в консольное окно

// Программист А. Ф.

using System;

namespace AppSh100 {

class Program {

static void Main(string[] args) {

Console.WriteLine("Введите целое и вещественное число."); // Подсказка о вводе

int mm = Convert.ToInt32(Console.ReadLine()); // Ввод целого числа

double valueCap = Convert.ToDouble(Console.ReadLine()); // Ввод вещественного числа

Console.WriteLine("Сумма чисело=: {0}", mm + valueCap); // Вывод суммы чисел

Console.ReadKey(); // Пауза для просмотра итога

}

}

}

После активизации приложения и ввода чисел 50 и 25,5 состояние консольного окна может быть таким, как показано ра рис. 3.1.6.

Рис. 3.1.6. Итоговое состояние консольного окна

Простейшее приложение C++/CLI может иметь следующий вид:

Листинг 3.1.6.

/* Вычисление значения выражения */

// Программист А. Ф.

#include "stdafx.h" // Сохраните в своем проекте это подключение

using namespace System; // Объявление пространства имен

int main(array<System::String ^> ^args) {

// Ввод в режиме диалога значений А и В

Console::WriteLine(L"Введите А, В: ");

double a = Convert::ToDouble(Console::ReadLine());

double b = Convert::ToDouble(Console::ReadLine());

/* Вычисление значения и вывод на экран */

double y = Math::Sin(a+b); // Определение переменной y

// Вывод итога в консольное окно

Console::WriteLine( L"Y= {0}", y);

return 0;

}

После активизации такой программы диалог с пользователем может иметь показанный на рис. 3.1.7 вид:

Рис. 3.1.7. Форма диалога, генерируемого приложением

В C++ ISO/ANSI вывод в консольное окно кодируется операцией вставки в поток cout. Например, представленные выше операторы могут записываться в форме

cout<<"Объём контейнера"<<endl;

cout<<"Стоимость работ: ";

cout<<235;

cout<<(67+33);

Примером кодирования простейшего приложения является следующая программа:

Листинг 3.1.7.

/* Вычисление значения выражения */

#include "stdafx.h" // Всегда сохраняйте в своем проекте это подключение

#include <cmath> // Для доступа к функции Sin( x )

#include <iostream> // Подключение средств ввода/вывода

using namespace std; // Объявление пространства имён std

int _tmain(int argc, _TCHAR* argv[]){

double a, b; // Определение вещественных переменных a, b

setlocale(LC_CTYPE, "Russian"); // Настройуа вывода на кириллицу

cout<<"Введите A, B: "; cin >>a >> b; // Ввод с клавиатуры

cin.get( ); // Для считывания завершающего нажатия Enter

/* Вычисление значения и вывод на экран */

double y = sin(a+b); // Определение вещественной переменной y

cout << "\nY= " <<y<< endl; // Вывод в консольное окно

cin.get( ); // Пауза для просмотра итога

return 0;

}

При формировании текста этой программы многострочными комментариями указано назначение программы и выделен этап вычисления и вывода значения на экран. Все остальные комментарии однострочные. После активизации такой программы диалог с пользователем может иметь показанный на рис 3.1.8 вид.

Рис. 3.1.8. Итоговый вид консольного окна приложения

Единица трансляции. Языки программирования C++, C# и Visual Basic 2010 являются языками высокого уровня. Это означает, что любая записанная с их помощью программа обязательно должна транслироваться. Единицей трансляции для них является файл. Из этого вытекает, что программа на этих языках может представляться одним или несколькими файлами исходного кода, каждый из которых должен подаваться на вход транслятора. Любой файл, содержащий исходный код всей программы или её части, может включать в себя последовательность определений интерфейсов, классов, делегатов и структур. Для VB файл может содержать модули. Внутри каждого модуля вы можете объявлять и определять типы, постоянные, переменные и подпрограммы. Для C++ файл может также содержать набор функций, границы которых не пересекаются.

Напоминание!

Структуры – типы, которые являются упрощёнными вариантами классов.

Делегаты - специальные классы, предназначенные для описания объектов, способ-ных стать средством вызова связанных с ними методов.

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

3.2. Структура программы и подпрограммы

Программа Visual Basic построена из стандартных блоков – решений, проектов, сборок, исходных файлов, модулей, классов и интерфейсов. Решение состоит из одного или нескольких проектов. Проект, в свою очередь, может содержать одну или несколько сборок. Каждая сборка компилируется из одного или нескольких исходных файлов. Исходный файл включает в себя определения и реализацию классов, структур, модулей и интерфейсов, и, в конечном счёте, содержит весь код.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]