Разработка транслятора

Автор работы: Пользователь скрыл имя, 22 Августа 2014 в 11:19, курсовая работа

Краткое описание

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

Содержание

ВВЕДЕНИЕ
4
1
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
5
2
ФОРМАЛЬНОЕ ОПИСАНИЕ ЯЗЫКА ПРОГРАММИРОВАНИЯ
7
3
РАЗРАБОТКА АЛГОРИТМОВ СКАНЕРА, СИНТАКСИЧЕСКОГО АНАЛИЗАТОРА И ГЕНЕРАТОРА ПРОМЕЖУТОЧНОЙ ФОРМЫ ПРЕДСТАВЛЕНИЯ ПРОГРАММЫ
14
4
РАЗРАБОТКА ПРОГРАММНОГО КОМПЛЕКСА ПРОЕКТА
21
5
РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ И ОТЛАДКИ ПС
24

ЗАКЛЮЧЕНИЕ
27

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
28

Прикрепленные файлы: 1 файл

курсовая по сис. прог. Межитханов.docx

— 121.52 Кб (Скачать документ)

● Си обеспечивает полный набор операторов структурного программирования.

●   Си предлагает необычно большой набор операций. Многие операции Си соответствуют машинным командам и поэтому допускают прямую трансляцию Язык программирования Си в машинный код. Разнообразие операций позволяет выбирать их различные наборы для минимизации

результирующего кода.

●  Си поддерживает указатели на переменные и функции. Указатель на объект программы соответствует машинному адресу этого объекта.

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

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

 

2.1 Правила записи программы на языке Си

 

Как указывалось выше, программа перед обработкой компьютером должна быть помещена в файл на диске. Обычно этот файл имеет расширение <.c>.Рассмотрим типичную структуру файла с программой на языке Си и правила его оформления на следующем простом примере:

/* Включить описания функций  стандартного ввода-вывода */

#include <stdio.h>

/* Включить описания математических  функций */

#include <math.h>

/* Другие включаемые файлы */

/* Собственно текст программы */

 void main( void ) /* <-- заголовок главной функции */

{

 float num; /* <-- описание типов данных */

/* Исполняемые операторы -* */

 num = 2.345; /* Присвоим переменной num

 значение 2.345 */

 printf( " sin(%f) = %f\n", num, sin(num) ); /* Вывод на экран */

}

Любой файл начинается с директив #include, вставляющих в текст программы так называемые заголовочные файлы, которые содержат описания функций, используемых в этом файле. В нашем примере это описания стандартных функций ввода-вывода <stdio.h> и математических функций <math.h>.

Далее следует заголовок главной функции программы main, операторы описания типов данных и исполняемые операторы.

Директивы #include должны всегда начинаться с новой строки, остальные же операторы программы могут иметь произвольное положение в файле вплоть до записи в одну строку. При записи не допускается разрывать слова, числа, двухсимвольные операции.

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

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

/* Это комментарий */

// Это тоже комментарии.

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

-          программы  читаются людьми, компьютеру комментарии  не нужны;

-          всегда  необходимы вводные комментарии, в которых указывается назначение  программы, ее автор, дата написания  и изменения, краткое описание  алгоритма, входных и выходных  данных, основных переменных и  вызываемых функций;

-          комментарии  должны содержать дополнительную  информацию, а не перефразировать  программу;

-          комментарии  должны быть расположены так, чтобы программа не была менее  наглядной;

-          неправильные  комментарии хуже, чем их отсутствие.

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

 

 

 

2.2   Правила формального описания синтаксиса языка программирования.

 

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

-          символы  в кавычках переносятся в конструкцию  языка так, как они записаны. Кавычки  при этом отбрасываются. Например, "while" означает, что в конструкции языка присутствует while;

-          имена, записанные слитно русскими и  латинскими буквами, обозначают  различные конструкции языка. Например, оператор_цикла;

-          квадратные  скобки охватывают элементы языка, которые могут повторяться 0 или 1 раз. Например, "AB"["C"] означает, что в конструкции языка может  присутствовать или AB или ABC;

-          фигурные  скобки охватывают элементы языка, которые могут повторяться 0 или  много раз. Например, "AB" { "C" } означает, что в конструкции  языка может присутствовать или AB, или ABC, или ABCC и т.д.;

-          символ | обозначает или, то есть используется  для задания альтернативных значений, из списка элементов, разделенных  знаком |. Например, "AB"|"C"|"ff" означает, что в конструкции языка может присутствовать или AB или C или ff;

-          круглые  скобки используются для группировки. Например, "A"("B"|"C")"D" означает, что в конструкции языка  может присутствовать или ABD или ACD;

-          многоточие  используется для обозначения  очевидных пропущенных значений  в перечислении;

-          символ = обозначает - слово есть. Например, буква = "A"|"B"|"C".

В дальнейшем, синтаксис языка Си будет описываться либо с помощью примеров, либо с помощью расширенной формы Бэкуса-Наура. В последнем случае это будет помечаться аббревиатурой БНФ.

 

2.3   Идентификаторы языка Си

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

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

БНФ:

 имя = ( буква | "_" ) { буква | цифра | "_" }

 буква = |"A"|"B"|...|"Y"|"Z"|"a"|"b"|...|"y"|"z"

 цифра = "0"|"1"|...|"9"

При этом прописные и строчные буквы считаются разными.

Длина имени в ANSI стандарте языка Си не ограничена. В Турбо Си имя не может быть длиннее 32 символов. Например: a, a1, _a, a_b.

Выбор имен должен производиться так, чтобы имя как можно точнее соответствовало смыслу объекта или действия, которое оно обозначает. Например: speed_of_body, SpeedOfBody, BodySpeed.

Экономия на длине имен - плохой стиль программирования.

2.4   Понятие о типах данных.

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

2.5 Основные типы данных языка Си

Язык Си относится к языку с жестко определенными типами данных: каждое имя всегда обозначает объект некоторого типа, причем этот тип нельзя изменить до конца выполнения программы.

Назначение типа имени осуществляется с помощью описания типа.

БНФ: описание_типа =

["const "] имя_типа " " имя ["=" константа]

{ "," имя ["=" константа] } ";"

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

 Если в описании имеется  знак "=" и константа соответствующего  типа, то вместе с объявлением  переменной происходит ее инициализация, то есть присваивание начального  значения.

 В языке Си предопределены  несколько имен типов:

БНФ:

 имя_типа = "int" | "short" | "long" | "char" |

"float" | "double"

 

int - целый длиной 2 байта, диапазон значений -32768 ... +32767;

short - целый короткий, для IBM PC аналогичен int;

long - целый длиной 4 байта, диапазон значений

char - символьный длиной 1 байт, его можно рассматривать как целое -128...+127 (иногда 0...255);

float - тип данных с плавающей точкой, длиной 4 байта, вещественное число с диапазоном значений от  до  и 6-ю значащими цифрами;

double - тип данных с плавающей точкой, длиной 8 байт, вещественное число с диапазоном значений от до  и 14-ю значащими цифрами;

Примеры описаний:

 int a, b=4, c; /* описывает целые переменные a,b,c */

/* и инициализирует переменную  b */

 float speed, line; /* описывает вещественные переменные */

 /* speed, line */

const double pi=3.14159; /* описывается имя pi, которое */

 /* используется как константа */

/* типа double */

Вещественный тип данных следует использовать в тех случаях, когда данное в принципе может иметь дробную часть. Например, его надо использовать для описания почти всех физические величин: длины, массы, времени и т.д. Иногда величина, вообще говоря, целая, но большая настолько, что типа данных long не хватает. В этом случае тоже используется вещественный тип данных. Однако необходимо учитывать, что все арифметические действия с вещественными типами выполняются приближенно.

Целый тип данных часто используется для организации флагов, счетчиков, индексов и т.д.

 

 

 

 

3 АЛГОРИТМИЗАЦИЯ

 

3.1 Алгоритмизация сканера

 

 

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

  1. Зарезервированные слова
  2. Одноместные, двуместные разделители
  3. Идентификаторы
  4. Целые числа
  5. Дробные числа

Алгоритм работы сканера заключается в выполнении следующих действий:

    1. Считывание и отчистку от неиспользуемых символов исходного текста (комментарии)
    2. Формирование лексемы
    3. Проверка лексемы на соответствие одному из типов
    4. Запись типа лексемы и определение кода.
    5. Формирование таблицы лексем.

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

На четвертом шаге программа записывает тип лексемы иопределяет ее код.На пятом шаге формируется таблица всех лексем исходного текста программы.Алгоритм работы сканера приведен на рис. 3.1.В таблице 3.1. приведены основные переменные и константы, использованные при реализации алгоритма.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Таблица 3.1 - Основные переменные и константы, использованные при реализации алгоритма

 

Идентификатор

Назначение

Тип

i,j,k

параметры циклов

целый

Prog_as_string

Программа, записанная в одну строку

строковый

St

Текущая лексема

строковый

kol

Количество зарезервированных слов

Константа, kol=13

razd1

Множество одноместных разделителей

Константа, set of char=['+', '-' , '*' , '/' , ',' , ':' , ';', '(', ')' , '<' , '>' , '=', chr(39)]

razd2

Множество знаков, входящих в двуместные разделители

Константа, set of char=['<','>','='];

Идентификатор

Назначение

Тип

rezw

Множество зарезервированных слов

Константа, array[1..kol] of string=('CLS', 'DIM', 'PRINT', 'INPUT','FOR', 'TO', 'NEXT', 'IF', 'THEN', 'ELSE', 'END',' STEP', 'WHILE');

Информация о работе Разработка транслятора