close

Вход

Забыли?

вход по аккаунту

?

пояснилка

код для вставкиСкачать
Содержание
Введение2
1. Назначение и область применения.3
2. Постановка задачи.4
3. Описание алгоритма программы с описанием функций и составных частей и связи между ними. Описание входных и выходных данных.6
4. Программное и аппаратное обеспечение программы. 19
5. Руководство пользователя. 20
Заключение. 24
Список литературы. 25
Приложение 1. Листинг программы. 26
Приложение 2. Результат работы. 43
Приложение 3. Схема алгоритма. 45
ВВЕДЕНИЕ
Для решения заданной задачи используется среда разработки Borland Delphi 7. Программный продукт Delphi 7.0 представляет собой уникальную систему разработки, в которой технология высокопроизводительной оптимизирующей компиляции сочетается с визуальными средствами разработки и масштабируемым процессором баз данных. Это позволяет создавать эффективные приложения Windows, работающие с базами данных, в том числе и программы для систем клиент/сервер. Для создания таких приложений в Delphi 7.0 используется объектно-ориентированный подход, базирующийся на применении различных компонентов (визуальных и не визуальных), что обеспечивает неограниченную расширяемость и масштабируемость. Delphi 7.0 позволяет разработчику быстро создавать и свободно распространять приложения с архитектурой клиент/сервер, работающие существенно быстрее и надежнее предыдущего поколения программных продуктов, которые строились при помощи систем разработки, основанных на интерпретируемом коде.
Большим преимуществом приложений, разрабатываемых в среде Delphi 7.0, - стала доступность использования как реляционного, так и навигационного программирования при работе с данными. Язык программирования Delphi базируется на Borland Object Pascal.
Кроме того, Delphi поддерживает такие низкоуровневые особенности, как подклассы элементов управления Windows, перекрытие цикла обработки сообщений Windows, использование встроенного ассемблера.
Данная курсовая работа представляет собой работу со строковыми функциями, такими как: pos, delete, insert и copy, а также и остальными встроенными процедурами и функциями языка паскаль. 1. НАЗНАЧЕНИЕ И ОБЛАСТЬ ПРИМЕНЕНИЯ
Программа предназначена для перевода исходного текста программы, написанной на языке высокого уровня программирования "Си", на другой язык программирования "Паскаль".
Данная программа может быть использована при необходимости быстрого получения кода программы на языке Паскаль из готовой программы на языке Си.
2. ПОСТАНОВКА ЗАДАЧИ
Написать конвертор в среде Делфи 7 для перевода программ на языке Си в текст программы на языке Паскаль. Языки, а также допустимые операторы в исходном тексте, синтаксис арифметических и логических выражений определяются в соответствии с вариантом. Для всех допустимых операторов в задании на курсовую работу должны быть приведены синтаксические диаграммы, в соответствии с которыми будет производиться анализ операторов исходного текста и их конвертация (по согласованию с преподавателем синтаксис некоторых сложных операторов может быть упрощён). Необходимо описать возможное и обязательное использование пробелов в исходном тексте.
Исходные данные и результат хранятся в текстовых файлах. Имя исходного файла должно запрашиваться программой в диалоговом режиме.
При обнаружении синтаксической ошибки в операторе исходного текста транслятор должен вносить в выходной текст комментарий, включающий диагностическое сообщение, текст ошибочного оператора и осуществлять переход к следующему оператору.
Алгоритмы обработки отдельных операторов и других элементов исходного языка (константа, переменная, выражение) должны быть оформлены в виде подпрограмм.
Комментарии предусмотреть во всех вариантах. Комментарий не может располагаться внутри оператора.
Для ключевых слов операторов в программе на языке Си используются только строчные буквы, а в программе на языке Паскаль - строчные и прописные. В идентификаторах возможны любые буквы - они конвертируются без изменений.
Между отдельными лексемами может быть любое количество пробелов (точнее, пробельных символов - пробелов, табуляций и переводов строки). В одной строке исходного текста может быть несколько операторов или только часть одного оператора.
При формировании выходного текста можно не учитывать правило отступа.
3. ОПИСАНИЕ АЛГОРИТМА ПРОГРАММЫ С ОПИСАНИЕМ ФУНКЦИЙ И СОСТАВНЫХ ЧАСТЕЙ И СВЯЗИ МЕЖДУ НИМИ.
В программе были использованы следующие константы:
* Max - Максимальное количество строк программного кода на языке Си;
* Max1 - максимальное количество подключаемых модулей;
* Max2 - максимальное количество типов переменных;
* Max3 - максимальное количество операторов циклов;
* Max4 - максимальное количество операторов, встроенных процедур и функций языков программирования Паскаль и Си;
* Dl - Максимальная длина строки программ на Си и паскале;
* Direct1 - массив подключаемых модулей на языке Си;
* Direct2 - массив подключаемых модулей на языке Паскаль;
* Perem1 - массив типов переменных языка Си;
* Pereme2 - массив типов переменных языка Паскаль;
* Cykl1 - массив операторов циклов языка Си;
* Cykl2 - массив операторов циклов языка Паскаль;
* Op1 - массив операторов, встроенных процедур и функций языка Си;
* Op2 - массив операторов, встроенных процедур и функций языка Паскаль. А также были использованы глобальные переменные: * M1: array [1..Max] of string[Dl]; - массив строк исходного текста программы на языке Си;
* M2: array [1..Max] of string[Dl]; - массив строк полученного текста программы на языке Паскаль;
* F - текстовый файл, в котором хранится программа на языке Си;
* F2 - текстовый файл, в котором будет храниться программа на языке Паскаль (результат выполнения конвертера - разрабатываемой программы);
* Error - текстовый файл, в котором будет храниться отчет об ошибках, которые были обнаружены в исходной программе на языке Си;
* Kol (переменная целого типа) - количество строк исходного текста программы;
* Perv (переменная целого типа) - признак первого встреченного описания переменной, чтобы вставить служебное слово "var";
* perv2 (переменная целого типа) - признак первой встреченной "{", то есть началась функциональная часть программы;
* perv3 (переменная целого типа) - признак первого встреченного "include", чтобы вставить служебное слово "uses";
* sm (переменная целого типа) - количество добавленных строк в массив M2, отличающегося от количества строк массива M1.
Входными данными в программе является файл "F", содержащий исходный текст программы на языке Си. Все данные из файла копируются в массив строк M1. Файл с исходной программой на языке программирования Си выбирается пользователем в диалоговом режиме.
Выходными данными является массив строк M2, который записывается в файл "F2". Наименование файла формируется по следующему принципу: название исходного файла (текст программы на Си) + добавляется расширение '.pas'. Полученный файл-результат сохраняется автоматически в текущую директорию исходного файла. А также в той же директории создается файл "ERROR.LOG", в котором фиксируются ошибки, встреченные в программе на языке Си.
В программе были использованы следующие подпрограммы языка паскаль:
* AssignFilt (процедура) - Назначает файловой переменной имя внешнего файла.
* Halt (процедура) - Останавливает выполнение программы и выходит в операционную систему.
* Dec (процедура) - Уменьшает значение переменной.
* Inc (процедура) - Увеличивает значение переменной.
* Операторы между словами Repeat и Until повторяются до тех пор, пока булево выражение не станет Истинным (True).
* CloseFile (процедура) - Закрывает ранее открытый файл.
* ReWrite (процедура) - Создает и открывает новый файл.
* FindFirst (функция) - Ищет файл.
* Reset (процедура) - открывает существующий файл для чтения.
* Mod - возвращает остаток от деления.
* Append (процедура) - открывает существующий файл для продолжения записи в файл.
* Pos (функция) - ищет подстроку в строке.
* Delete (процедура) - удаляет подстроку из строки.
* Chr (функция) - возвращает символ с определенным номером в ASCII таблице.
* Insert (процедура) - вставляет подстроку в строку.
* Str (процедура) - преобразовывает число в строку.
* Copy (функция) - возвращает подстроку строки.
* OemToChar - переводит текст из ДОСовской кодировки в window.
* Length (функция) - возвращает динамическую длину строки. Теперь опишем используемые процедуры.
1. procedure TFormKonvert.ButtonExitClick(Sender: TObject); - выполняется при нажатии кнопки "Выход". Осуществляется выход из программы
2. procedure TFormKonvert.ButtonIsxFileClick(Sender: TObject); - процедура выбора исходного файла через компонент "TOpenDialog". Данные из файла выводятся в окошко "TMemoIsh", при этом автоматически подсчитывается кол-во считанных строк, а также формируются имена двух файлов: файла с ошибками "error.log" и ".pas", где имя файла равно имени исходного файла. Алгоритм подпрограммы: сначала пользователем выбирается имя исходного файла (OpenDialog1.Execute), затем формируется полное наименование исходного файла с путем (Puth), наименование выходного файла-результата (Puth2) и будет создан файл "error.log" в текущей директории. Рассмотрим переменные, использованные в данной подпрограмме:
* s: string; (строка) - полученная строка данных из файла (исходный текст программы на Си).
* sl :LPTSTR; - промежуточная переменная, необходима для преобразования строки из ДОСовской кодировки в window.
* Puth, Puth2: string; (переменные строкового типа) - полные наименования файлов.
3. TFormKonvert.ButtonSpravkaClick(Sender: TObject); - процедура выводит краткую справку о программе и ее разработчике. 4. procedure TFormKonvert.FormShow(Sender: TObject); - процедура выполняется при отображении окна программы. Происходит инициализация переменных.
5. TFormKonvert.ButtonErrorClick(Sender: TObject); - процедура выводит диалоговое окно с найденными ошибками в исходной программе на Си.
6. Procedure TFormKonvert.Rezultat; - процедура выводит результат выполнения программы-конвертера на экран монитора. Алгоритм подпрограммы: с помощью оператора "reset(F2);" открывается файл для чтения, пока не достигнут конец файла, читается информация построчно; в конце процедуры выполняется closefile, который закрывает ранее открытый файл. Рассмотрим переменные, использованные в данной подпрограмме:
* s: string; (переменная строкового типа) - предназначена для получения строки из файла.
* sl :LPTSTR; - предназначена для перевода полученной строки из кодировки ДОС в window..
7. Procedure TFormKonvert.AddReport(sk:string); - процедура формирует отчет об ошибках, обнаруженных в исходном тексте программы, написанной на языке Си. При новом запуске программы старый отчет стирается, и ведется новый отчет. В качестве входного параметра процедуре передается строка sk, далее append открывает существующий файл для продолжения записи в файл. Error - переменная текстового файла. Writeln добавляет строку в конец файла отчета и записывает маркер конца строки (CR/LF) в файл. По окончании всех действий процедурой Closefile закрывается ранее открытый файл.
8. function TFormKonvert.Trim(s:string):string; - функция усекает лишние пробелы в указанной строке. Возвращается результат в виде строки с усеченными пробелами. Входным параметром является строка, в которой требуется усечь все пробелы. Выходным параметром является полученная строка. Переменная p используется для получения номера позиции первого обнаруженного пробела в строке. Если пробел был обнаружен, то он удаляется с помощью delete. Цикл выполняется до тех пор, пока не будет обнаружен ни один пробел в строке.
9. function TFormKonvert.Kavychki(n:integer; s:string):string; - функция заменяет все двойные кавычки " одинарными ', то есть в операторах: prinf, scanf. Входными параметрами являются следующие переменные:
* n:integer; (переменная целого типа) - номер строки исходного текста.
* s:string (переменная строкового типа) - строка для обработки. Выходным параметром является полученная строка. Алгоритм подпрограммы: с помощью Pos ищутся двойные кавычки, если такие есть в строке, то они удаляются с помощью delete, а вместо них вставляются одинарные с помощью insert. Если двойных кавычек не хватает в строке, то эта ошибка фиксируется в файле с помощью подпрограммы AddReport, где указывается номер строки и причина ошибки. Рассмотрим переменные, использованные в данной подпрограмме:
* j (переменная целого типа) - количество обнаруженных двойных кавычек в строке.
* Z (переменная целого типа) - счетчик цикла for. * p (переменная целого типа) - получает номер позиции, в которой обнаружена двойная кавычка.
* s2 (переменная строкового типа) - получает целое число в строковом виде (номер строки исходного текста программы).
10. function TFormKonvert.Peremennye(n:integer; s:string):string; - функция заменяет все ключевые слова переменных, которые обозначают тип переменных, с языка Си на Паскаль. Входными параметрами являются следующие переменные:
* n:integer; (переменная целого типа) - номер строки исходного текста.
* s:string (переменная строкового типа) - строка для обработки. Выходным параметром является полученная строка. Алгоритм подпрограммы: с помощью Pos ищутся данные из массива Perem1, если такие есть в строке, то они заменяются соответствующими данными из массива Perem2. Данные в этих массивах расположены таким образом, чтобы номера соответствующих элементов для замены были одинаковыми. Если не хватает в строке символа ";", то эта ошибка фиксируется в файле с помощью подпрограммы AddReport, где указывается номер строки и причина ошибки. Также в данной подпрограмме отслеживаются массивы и указатели. Рассмотрим переменные, использованные в данной подпрограмме:
* j (переменная целого типа) - счетчик для массива Perem1. Чтобы в обрабатываемой строке просмотреть все элементы массива Perem1.
* J2 (вспомогательная переменная целого типа) - номер позиции в строке. * p (переменная целого типа) - получает номер позиции, в которой обнаружена нужная строка.
* P2, p3, х1, х2 (вспомогательные переменные целого типа) - номера позиций в строке.
* s2 (переменная строкового типа) - получает целое число в строковом виде (номер строки исходного текста программы).
11. function TFormKonvert.Cikl(n:integer; s:string):string; - функция заменяет все операторы циклов и условий (do..while, for, if). Входными параметрами являются следующие переменные:
* n:integer; (переменная целого типа) - номер строки исходного текста.
* s:string (переменная строкового типа) - строка для обработки. Выходным параметром является полученная строка. Алгоритм подпрограммы: сначала проверяется на принадлежность в строке оператора if, также здесь происходит проверка на открывающую скобку "(" и закрывающую ")". Если не хватает в строке какого-то символа, то эта ошибка фиксируется в файле с помощью подпрограммы AddReport, где указывается номер строки и причина ошибки. Затем проверяется, есть ли в строке операторы цикла "do..while" и "for". Рассмотрим переменные, использованные в данной подпрограмме:
* j, j2, p, p2, p3 (вспомогательные переменные целого типа) - номера позиций в строке.
* s2 (переменная строкового типа) - получает целое число в строковом виде (номер строки исходного текста программы).
12. function begin_end(n:integer; s:string):string; - функция заменяет фигурные скобки операторами begin-end. Входными параметрами являются следующие переменные:
* n:integer; (переменная целого типа) - номер строки исходного текста.
* s:string (переменная строкового типа) - строка для обработки. Выходным параметром является полученная строка. Алгоритм подпрограммы: в строке ищутся символы "{" и "}". Если такие найдены, то они заменяются на "begin" и "end" соответственно. Рассмотрим переменные, использованные в данной подпрограмме:
* p (переменная целого типа) - получает номер позиции в строке, где обнаружен нужный символ. Если фигурная скобка закрывающая последняя в программе, то после нее ставится точка для паскалевской программы.
13. function TFormKonvert.Comment(n: integer; s: string):string; - функция заменяет все символы, открывающие и закрывающие комментарий, на соответствующие символы паскалевского кода. Входными параметрами являются следующие переменные:
* n:integer; (переменная целого типа) - номер строки исходного текста.
* s:string (переменная строкового типа) - строка для обработки. Выходным параметром является полученная строка. Алгоритм подпрограммы: в строке ищутся символы "/*" и "*/". Если такие найдены, то они заменяются на "{" и "}" соответственно. Если не хватает в строке какого-то символа, то эта ошибка фиксируется в файле с помощью подпрограммы AddReport, где указывается номер строки и причина ошибки. Рассмотрим переменные, использованные в данной подпрограмме:
* j (переменная целого типа) - счетчик найденных символов.
* p (переменная целого типа) - номер позиции в строке, где обнаружены данные символы.
* s2 (переменная строкового типа) - получает целое число в строковом виде (номер строки исходного текста программы).
14. function TFormKonvert.Vstr_procedur(n:integer; s:string):string; - функция заменяет все встроенные процедуры и функции из массива Op1, на соответствующие из массива Op2. Входными параметрами являются следующие переменные:
* n:integer; (переменная целого типа) - номер строки исходного текста.
* s:string (переменная строкового типа) - строка для обработки. Выходным параметром является полученная строка. Алгоритм подпрограммы: в строке ищутся данные из массива Op1. Если такие найдены, то они заменяются на соответствующие данные из массива Op2. Рассмотрим переменные, использованные в данной подпрограмме:
* j (переменная целого типа) - счетчик для массива Op1.
* p (переменная целого типа) - номер позиции в строке, где обнаружены данные из массива Op1.
* P2, p3 (вспомогательные переменные целого типа) - для обработки оператора scanf. Используются в качестве номеров позиций в строке.
15. function Prisvaivanie(s:string):string; - заменяет знак равно, где происходит операция присваивания, на знак ":=". Входными параметрами являются следующие переменные:
* s:string (переменная строкового типа) - строка для обработки. Выходным параметром является полученная строка. Алгоритм подпрограммы: в строке ищется символ "=". Если найден, то проверяется в какой именно операции он участвует, если присваивание, то перед ним добавляется символ ":". Рассмотрим переменные, использованные в данной подпрограмме:
* p (переменная целого типа) - номер позиции в строке, где обнаружен данный символ.
* P21, p22 (переменные целого типа) - начало и конец позиции оператора if соответственно.
* P31, p32 (переменные целого типа) - начало и конец позиции оператора while соответственно.
* P41, p42 (переменные целого типа) - начало и конец позиции оператора printf соответственно.
* P5 (переменная целого типа) - номер позиции начала комментария.
* S2 (переменная строкового типа) - вспомогательная переменная для обработки исходной строки.
* Bb (переменная булевского типа) - если ни один из вышеперечисленных операторов не был найден, то значит, эта операция присваивание и переменная равна false, иначе - true.
16. function TFormKonvert.Includes(n:integer; s:string):string; - заменяет "include" на "uses". Входными параметрами являются следующие переменные:
* n:integer; (переменная целого типа) - номер строки исходного текста.
* s:string (переменная строкового типа) - строка для обработки. Выходным параметром является полученная строка. Алгоритм подпрограммы: в строке ищутся данные из массива Direct1. Если такие найдены, то они заменяются на соответствующие данные из массива Direct2. Рассмотрим переменные, использованные в данной подпрограмме:
* j (переменная целого типа) - счетчик для массива Direct1.
* p (переменная целого типа) - номер позиции в строке, где обнаружены данные из массива Direct1.
* P2, p3 (вспомогательные переменные целого типа) - для обработки комментария. Используются в качестве номеров позиций в строке.
17. procedure TFormKonvert.ButtonPuskClick(Sender: TObject); - Главная процедура конвертера, из которой будут вызываться вспомогательные процедуры и функции вышеописанные для обработки каждой строки. Алгоритм подпрограммы: открывается файл для чтения с исходным текстом программы на языке Си. Информация считывается построчно, записывается в массив M1, происходит подсчет количества полученных строк (Kol). По окончании получения всей информации на экран выводится текст "Кол-во" строк красным цветом. После в цикле начинается обработка каждой строки из массива M1 в следующем порядке: 1. Includes - заменяет "include" на "uses".
2. Prisvaivanie - заменяет "=" на ":=", в тех местах, где происходит присваивание.
3. Vstr_procedur - заменяет встроенные процедуры и функции.
4. Cikl - заменяет операторы циклов и условия.
5. begin_end - заменяет фигурные скобки операторами begin-end.
6. Comment - заменяет комментарии.
7. Kavychki - заменяет двойные кавычки " одинарными '.
8. Peremennye - обрабатывает переменные.
9. Происходит проверка - если началась функциональная часть программы, то вставить "begin".
10. Если в текущей обрабатываемой строке есть слово "program", то переместим ее на самый верх.
По окончании обработки всех строк исходного текста программы на языке Си полученные данные записываются в паскалевский файл. Рассмотрим переменные, использованные в данной подпрограмме:
* i (переменная целого типа) - счетчик цикла for.
* J2 (вспомогательная переменная целого типа) - используется в качестве счетчика для перемещения строки, содержащей слово program.
* P, p2 (переменные целого типа) - номера позиций в строке, где обнаружены необходимые символы.
* S (переменная строкового типа) - строка, полученная из из файла и массива M1. Обрабатываемая строка.
По окончании выполнения данной процедуры содержимое массива m2 записывается в файл.
4. ПРОГРАММНОЕ И АППАРАТНОЕ ОБЕСПЕЧЕНИЕ ПРОГРАММЫ.
* Pentium 100MHz/16MB RAM;
* OS: Windows98;
* HDD: 100kB свободного места;
* Наличие файла "proga.C" в корне диска "C:" или любого другого на языке Си.
5. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
Программа разработана в среде Делфи 7. Программа предназначена для перевода исходного текста программы на Си в текст программы на языке паскаль.
Найдите файл "ProjectKonvert.exe", установите на него курсор и нажмите Enter. На экране отобразится окно на рисунке 1.
Рисунок 1 - Запуск программы.
При нажатии на кнопку "Найти файл для преобразования" на экране отобразится диалоговое окно (рисунок 2), где необходимо выбрать файл, содержащий код программы на языке Си.
Рисунок 2 - Выбор исходного файла программы на языке Си.
После этого весь текст программы будет считан из файла и выведен в левое окошко главного окна программы (рисунок 3). Также будет отображено количество считанных строк из файла
Рисунок 3 - Вывод исходного кода программы
При нажатии на кнопку "Перевести в паскаль" в правом окошке главного окна программы отобразится конвертированный код программы в язык паскаль (рисунок 4).
Рисунок 4 - Результат выполнения конвертера.
При нажатии на кнопку "Ошибки" отобразится окно на рисунке 5 со списком найденных ошибок в исходном тексте программы на языке Си.
Рисунок 5 - Вывод найденных ошибок в исходном коде программы.
При нажатии на кнопку "Справка" отобразится окно на рисунке 6.
Рисунок 6 - Вывод справки о программе и ее разработчике.
Чтобы выйти из программы достаточно нажать кнопку "Выход" в главном окне программы.
ЗАКЛЮЧЕНИЕ
В процессе выполнения курсового проекта научился работать со строками, файлами в среде разработки Делфи 7, а также освоил синтаксис языка Си.
СПИСОК ЛИТЕРАТУРЫ
1. Бобровский С. Delphi 5: Учебный курс. СПб.: "Питер", 2000. 2. Культин Н.Б. Программирование в Turbo Pascal 7.0 и Delphi. - СПб.: BHV - Санкт-Петербург, 1998. - 240 с. 3. Дериев И.И., Токарь С.В. Справочник по процедурам и функциям Borland Pascal with Objects 7.0. Киев 1993г.
4. Перминов О.Н. Программирование на языке ПАСКАЛЬ. Москва 1988г.
Приложение 1. Листинг программы.
{Небольшие требования к исходному тексту программы,
которые пользователь легко может проделать:
1. После окончания программы, т.е. после последней фигурной
скобки не должно быть больше строк.}
Файл "Main.pas"
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
st= string[20];
TFormKonvert = class(TForm)
ButtonExit: TButton;
Label1: TLabel;
MemoIsh: TMemo;
Label2: TLabel;
MemoResult: TMemo;
ButtonIsxFile: TButton;
OpenDialog1: TOpenDialog;
ButtonSpravka: TButton;
ButtonPusk: TButton;
LabelKolIsh: TLabel;
ButtonError: TButton;
procedure ButtonExitClick(Sender: TObject);
procedure ButtonIsxFileClick(Sender: TObject);
procedure ButtonSpravkaClick(Sender: TObject);
Procedure Rezultat;
Procedure AddReport(sk:string);
function Trim(s:string):string;
function Kavychki(n:integer; s:string):string;
function Peremennye(n:integer; s:string):string;
function Cikl(n:integer; s:string):string;
function Includes(n:integer; s:string):string;
function Comment(n: integer; s: string):string;
function Vstr_procedur(n:integer; s:string):string;
procedure ButtonPuskClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure ButtonErrorClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Const Max=100; {Максимальное количество строк программного кода}
Max1=2;
Max2=3;
Max3=4;
Max4=10;
Dl=90; {Максимальная длина строки программ на Си и паскале}
Direct1:array[1..Max1] of st=( {описание подключаемых модулей на Си}
('<conio.h>'),
('<string.h>'));
Direct2:array[1..Max1] of st=( {описание подключаемых модулей на паскале}
('crt'),
('strings'));
Perem1:array[1..Max2] of st=( {описание переменных на Си}
('float '),
('int '),
('char '));
Perem2:array[1..Max2] of st=( {описание переменных на паскале}
(':real;'),
(':integer;'),
(':char;'));
Cykl1:array[1..Max3] of st=( {описание операторов циклов на Си}
('do{'),
('}while'),
('for('),
('while{'));
Cykl2:array[1..Max3] of st=( {описание операторов циклов на паскале}
('repeat'),
('until'),
('for '),
('while'));
Op1:array[1..Max4] of st=( {операторы на Си}
('void main(void)'),
('getch()'),
('clrscr()'),
('gotoxy'),
('putchar'),
('puts'),
('scanf'),
('printf'),
('!='),
('break'));
Op2:array[1..Max4] of st=( {операторы на паскале}
('program test;'),
('readkey'),
('clrscr'),
('gotoxy'),
('write'),
('writeln'),
('readln'),
('writeln'),
('<>'),
('break'));
var
FormKonvert: TFormKonvert;
M1: array [1..Max] of string[Dl];{массив строк исходного текста программы}
M2: array [1..Max] of string[Dl];{массив строк полученного текста программы}
F, F2, Error: TextFile; {текстов. файл.}
Kol: integer;{перем. целого типа}
perv, {признак первого встреченного описания переменной (для var)}
perv2,{признак первой встреченной "{" (для begin)}
perv3,{признак первого "include" (для uses)}
sm: integer;
implementation
uses Spravka, FileError;
{$R *.dfm}
procedure TFormKonvert.ButtonExitClick(Sender: TObject);
begin
Close;
end;
{Вывод результата}
Procedure TFormKonvert.Rezultat;
var s: string;
sl :LPTSTR;
begin
MemoResult.Clear;
reset(F2);{открыть файл для чтения}
while not eof(F2)
do begin
readln(F2,s);
sl:= LPCSTR(s);
OemToChar(sl, sl);//убираем досовскую кодировку
MemoResult.Lines.Add(sl);
end;
closefile(F2); {закрыть файл}
end;
procedure TFormKonvert.ButtonIsxFileClick(Sender: TObject);
var Puth, Puth2: string;
s: string;//[Dl];
sl :LPTSTR;
begin
OpenDialog1.InitialDir:= GetCurrentDir;
if OpenDialog1.Execute=true //вызов диалога выбора файла
then begin
//сюда попадаем при выборе файла
Puth:=OpenDialog1.FileName; //получить наименование выбранного файла с полным путем
Puth2:= StringReplace(Puth, '.C', '.pas', [rfReplaceAll]);
Puth2:= StringReplace(Puth2, '.CPP', '.pas', [rfReplaceAll]);
assignfile(F, Puth);
assignfile(F2,Puth2);
MemoIsh.Clear;
MemoResult.Clear;
ButtonError.Enabled:=false;
reset(F);
rewrite(F2);
closefile(F2);
assignfile(Error, GetCurrentDir+'\error.log');{установить зависимость}
rewrite(Error);{создаем файл}
closefile(Error);{закрыть файл}
{подсчитаем кол-во строк программного кода в исходном файле}
reset(F);{открыть файл для чтения}
Kol:=0;
while not eof(F) do
begin
readln(F, s); {чтение из файла построчно}
inc(Kol); {счетчик строк программного кода на Си}
M1[Kol]:=s;{записываем программу на Си в массив строк}
sl:= LPCSTR(s);
OemToChar(sl, sl);//убираем досовскую кодировку
MemoIsh.Lines.Add(sl);
end;
closefile(F);
LabelKolIsh.Visible:=true;
LabelKolIsh.Caption:= IntToStr(Kol)+' строк';
end;
end;
{----Процедура формирования отчета по ошибкам}
Procedure TFormKonvert.AddReport(sk:string);
begin
append(Error);{открыть файл отчета для добавления}
writeln(Error,sk);{добавить текст в конец файла}
closefile(Error);{закрыть файл}
end;
{усекаем лишние пробелы в указанной строке
Возвращается результат в виде строки с усеченными пробелами}
function TFormKonvert.Trim(s:string):string;
var p: integer;
begin
repeat
p:= pos(' ', s);
if p>0
then delete(s,p,1);
until p=0;
Trim:=s;
end;
{заменяем все двойные кавычки " одинарными '}
function TFormKonvert.Kavychki(n:integer; s:string):string;
var j, z, p :integer;
s2: string;
begin
j:=0;
for z:=1 to 4 do
begin
p:= Pos(chr(34), s);
if p>0
then begin
delete(s, p, 1);
insert(chr(39),s,p);
inc(j);
end;
end;
if (j mod 2) <> 0
then begin
str(n, s2);
AddReport('В строке N '+ s2+' не хватает кавычек.');
end;
Kavychki:=s;
end;
{заменяем все ключевые слова переменных, которые обозначают тип переменных}
function TFormKonvert.Peremennye(n:integer; s:string):string;
var j, j2, p, p2, p3, x1, x2: integer;
s3, s2: string[Dl];
begin
str(n, s3);
j:=1;
repeat
p:= pos(Perem1[j], s);
if p>0
then begin
delete(s,p,length(Perem1[j]));
s:= Trim(s);
p2:=pos(';', s);
if p2>0
then delete(s,p2,1)
else begin
AddReport('В строке N '+ s3+' отсутствует ";".');
p2:= length(s)+1;
end;
insert(Perem2[j],s,p2);
{проверка указателей}
repeat
p2:=pos('*',s);
if p2>0
then begin
if (s[p2+1]=',') or (s[p2+1]=';')
then AddReport('В строке N '+ s3+' отсутствует переменная после "*".');
j2:=p2;
repeat inc(j2); until (s[j2]=':') or (s[j2]=',');
s2:=copy(s,p2+1,j2-p2-1);
if (s[p2-1]=',') and (s[j2]=',')
then begin x1:=p2-1; x2:=j2; end
else begin x1:=p2; x2:=j2; end;
delete(s, x1, x2-x1);
M2[n+sm]:= s2+':'+chr(24)+copy(Perem2[j],2,length(Perem2[j])-1);
if perv=0
then begin
perv:=1;
insert('var ',M2[n+sm],1);
end;
inc(sm);
end;
until p2=0;
{проверка массивов}
repeat
p2:=pos(']',s);
if (p2=0) and (pos('[',s)>0)
then AddReport('В строке N '+ s3+' отсутствует "]".');
if p2>0
then begin
j2:=p2;
repeat dec(j2); until (s[j2]=',') or (j2=0);
s2:=copy(s, j2+1, p2-j2);
if s[j2]=','
then delete(s, j2, p2-j2+1)
else delete(s, 1, p2-j2+1);
p3:= pos('[',s2);
if p3=0
then AddReport('В строке N '+ s3+' отсутствует "[".')
else begin
insert(' :array',s2,p3);
p3:= pos('[',s2);
insert('1..',s2,p3+1);
if Perem1[j]='int '
then insert(' of integer;',s2,length(s2)+1);
if Perem1[j]='char '
then insert(' of char;',s2,length(s2)+1);
if Perem1[j]='float '
then insert(' of real;',s2,length(s2)+1);
end;
M2[n+sm]:= s2;
if perv=0
then begin
perv:=1;
insert('var ',M2[n+sm],1);
end;
inc(sm);
end;
until p2=0;
if perv=0
then begin
perv:=1;
insert('var ', s, 1);
p2:= pos('{',s);
if p2>0 then delete(s,p2,1);
end;
end;
inc(j);
until (j>Max2) or (p>0);
if s[1]=',' then delete(s,1,1);
Peremennye:=s;
end;
{заменяем операторы циклов}
function TFormKonvert.Cikl(n:integer; s:string):string;
var j, j2, p, p2, p3:integer;
s2, s3: string[Dl];
begin
str(n, s3);
if perv2=1
then begin
{обрабатываем оператор if}
p:= pos('if',s);
if p>0
then begin
p2:= pos('(',s);
if p2>0
then begin
delete(s,p2,1);
insert(' ',s,p2);
end
else AddReport('В строке N '+ s3+' в операторе if отсутствует "(".');
p2:= pos(')',s);
if p2>0
then begin
delete(s,p2,1);
insert(' ',s,p2);
insert(' then ',s,p2+1);
end
else AddReport('В строке N '+ s3+' в операторе if отсутствует ")".');
end;
{если есть "else", то перед ним убрать ";"}
p:= pos('else',s);
if p>0
then begin
p2:= pos(';',s);
if (p2>0) and (p2<p)
then begin
delete(s,p2,1);
insert(' ',s,p2)
end
else begin
p:= length(M2[n+sm-1]);
while M2[n+sm-1][p]<>';' do inc(p);
M2[n+sm-1][p]:=' ';
end;
end;
{обрабатываем оператор do...while}
p:= pos('do',s);
if p>0
then begin
p2:= pos('/*',s);
if p2=0
then p2:=length(s);
s2:= copy(s, p+3, p2-p-3);
s2:= Trim(s2);
delete(s,p,p2-p);
insert('repeat ',s,p);
insert(s2,s,p+length('repeat '));
end;
p:= pos('while',s);
if p>0
then begin
p2:= pos('}',s);
if (p2>0) and (p2<p)
then while s[p-1]=' ' do delete(s,p-1,1);
delete(s,p-1,length('while')+1);
insert(' until ', s, p-1);
end;
{обрабатываем оператор for()}
p:=pos('for', s);
if p>0
then begin
p2:= pos(')',s);
if p2=0
then begin
AddReport('В строке N '+ s3+' в операторе for отсутствует ")".');
if pos('/*',s)>0
then p2:=pos('/*',s)-1
else p2:=length(s);
end;
{ else begin}
s2:= copy(s,p,p2-p);
s2:=Trim(s2);
delete(s2,1,4);
insert('for ', s2, 1);
{убираем лишние символы}
p:=pos('=',s2);
repeat
delete(s2,p+2,1);
until (s2[p+2]='<') or (s2[p+2]='=') or (s2[p+2]='>');
repeat
delete(s2,p+2,1);
until (s2[p+2]<>'<') and (s2[p+2]<>'=') and (s2[p+2]<>'>');
{проверяем, счетчик увеличивается или уменьшается}
p3:=pos('++', s2);
if p3>0
then insert(' to ',s2,p+2)
else insert(' downto ',s2,p+2);
p3:=pos('++', s2);
j:=p3;
repeat dec(j); until s2[j]=';';
delete(s2,j+1,p3-j+1);
insert(' do ', s2, length(s2)+1);
for j2:=1 to 2 do
begin
p:=pos(';',s2);
if p>0
then begin
delete(s2,p,1);
insert(' ',s2,p);
end
else AddReport('В строке N '+ s3+' в операторе for отсутствует ";".');
end;
s:=s2+copy(s,p2+1,length(s)-p2);
{ end;}
end;
end;
Cikl:=s;
end;
{заменяем фигурные скобки операторами begin-end}
function begin_end(n:integer; s:string):string;
var p: integer;
begin
p:= Pos('{', s);
if p>0
then begin
delete(s, p, 1);
insert('begin ',s,p);
end;
p:= Pos('}', s);
if p>0
then begin
delete(s, p, 1);
insert(' end', s, p);
if n=Kol
then insert('.', s, length(s)+1)
else insert(';', s, length(s)+1)
end;
begin_end:=s;
end;
{Обработка комментария}
function TFormKonvert.Comment(n: integer; s: string):string;
var j, p: integer;
s2: string[Dl];
begin
j:=0;
p:=pos('/*', s);{поиск открывающего комментария}
if p>0
then begin
j:=1;
delete(s, p, 2);
insert('{', s, p);
end;
p:=pos('*/',s);{поиск закрывающего комментария}
if p>0
then begin
j:=j+2;
delete(s, p, 2);
insert('}', s, p);
end;
str(n, s2);
if j=1
then AddReport('В строке N '+ s2+' отсутствует закрытие комментария.');
if j=2
then AddReport('В строке N '+ s2+' отсутствует открытие комментария.');
Comment:= s;
end;
{заменяем встроенные процедуры и функции}
function TFormKonvert.Vstr_procedur(n:integer; s:string):string;
var j, p, p2, p3: integer;
s2: string;
begin
str(n, s2);
j:=1;
repeat
p:= Pos(Op1[j], s);
if p>0
then begin
if Op1[j]='scanf'
then begin
p2:=pos('%',s);
if p2=0
then AddReport('В строке N '+ s2+' в операторе scanf отсутствует "%".');
repeat inc(p2); until(s[p2]=',');
p3:=p+length(Op1[j])+1;
delete(s,p3,p2-p3+1);
p3:=pos('&',s);
if p3>0
then delete(s,p3,1);
end;
if Op1[j]='printf'
then begin
p2:=pos('%',s); p3:=p2;
if p2>0
then begin
repeat inc(p3);
until(s[p3]='f')or(s[p3]='d')or(s[p3]='o')or(s[p3]='x')or(s[p3]='e')or(p3>length(s));
delete(s,p2,p3-p2+1);
end;
end;
delete(s, p, length(Op1[j]));
insert(Op2[j],s,p);
if (perv=1) and (perv2=0)
then begin
insert('begin ',s,1);
perv2:=1;
end;
j:=0; p:=0;{сбрасываем значения, чтобы
проверить строку на другие процедуры}
end;
inc(j);
until (j>Max4) or (p>0);
if perv=0
then begin
p:= pos('{',s);
if p>0 then delete(s,p,1);
end;
Vstr_procedur:= s;
end;
{Заменяем "=" на ":=", в тех местах, где происходит присваивание}
function Prisvaivanie(s:string):string;
var p, p21, p22, p31, p32, p41, p42, p5: integer;
s2: string[Dl];
bb: boolean;
begin
s2:=s;
s:='';
repeat
p21:=0; p22:=0; p31:=0; p32:=0; p41:=0; p42:=0; p5:=0;
bb:=false;
p:= pos('=', s2);
if p>0
then begin
p21:= pos('if',s2);
if p21>0
then begin
p22:=p21;
while s2[p22]<>')' do inc(p22);
if (p>p21) and (p<p22) then bb:=true;
end;
p31:= pos('while',s2);
if p31>0
then begin
p32:=p31;
while s2[p32]<>')' do inc(p32);
if (p>p31) and (p<p32) then bb:=true;
end;
p41:= pos('printf',s2);
if p41>0
then begin
p42:=p41;
while s2[p42]<>')' do inc(p42);
if (p>p41) and (p<p42) then bb:=true;
end;
p5:= pos('/*',s2);
if (p>p5) and (p5>0) then bb:=true;
if bb=false
then insert(':',s2,p);
p:=p+2;
end
else p:= length(s2);
s:=s + copy(s2,1,p);
delete(s2,1,p);
until p=0;
Prisvaivanie:=s;
end;
{заменяем "include" на "uses"}
function TFormKonvert.Includes(n:integer; s:string):string;
var j, p, p2, p3: integer;
begin
j:=1;
repeat
p:= Pos(Direct1[j], s);
if p>0
then begin
p3:= pos('/*',s);
s:= copy(s,p3,length(s)-p3+1);
if perv3=0
then begin
perv3:=1;
s:='uses '+s;
p:=6;
end
else p:=1;
insert(Direct2[j],s,p);
p2:= pos('include',M1[n+1]);
p3:= pos('/*',s);
if p2>0
then insert(',',s,p3)
else insert(';',s,p3);
end;
inc(j);
until (j>Max1) or (p>0);
Includes:=s;
end;
procedure TFormKonvert.ButtonSpravkaClick(Sender: TObject);
begin
FormSpravka:= TFormSpravka.Create(self);
FormSpravka.ShowModal;
end;
{Главная процедура конвертера, из которой будут вызываться
вспомогательные процедуры и функции.}
procedure TFormKonvert.ButtonPuskClick(Sender: TObject);
var s: string[Dl];
i, j2, p, p2: integer;
begin
if Kol<=0
then begin
ShowMessage('Выберите файл программы на языке Си для преобразования в Паскаль!');
exit;
end;
ButtonError.Enabled:=true;
MemoResult.Clear;
rewrite(Error);{создаем файл}
closefile(Error);{закрыть файл}
perv:=0; perv2:=0; perv3:=0; sm:=0;
for i:=1 to Kol do
begin
s:= M1[i];
{заменяем "include" на "uses"}
s:= Includes(i, s);
{заменяем "=" на ":=", в тех местах, где происходит присваивание}
s:= Prisvaivanie(s);
{заменяем встроенные процедуры и функции}
s:= Vstr_procedur(i, s);
{заменяем операторы циклов}
s:= Cikl(i, s);
{заменяем фигурные скобки операторами begin-end}
s:= begin_end(i, s);
{заменяем комментарий}
s:= Comment(i, s);
{заменяем двойные кавычки " одинарными '}
s:= Kavychki(i, s);
{обрабатываем переменные}
s:= Peremennye(i, s);
{если началась функциональная часть программы, то вставить "begin"}
p:= pos('=',s); p2:=pos(';',s);
if (perv=1) and (perv2=0) and (p>0) and (p2>0)
then begin
perv2:=1;
M2[i+sm]:='begin ';
inc(sm);
end;
M2[i+sm]:=s;
{вернем строку с служебным словом "program" на самый верх}
p:=pos('program',s);
if p>0
then begin
for j2:=1 to (i+sm) do
M2[i+sm-j2+1]:=M2[i+sm-j2];
M2[1]:=Op2[1];
end;
end;
rewrite(F2);
for i:=1 to Kol+sm do
writeln(F2, M2[i]);
closefile(F2);
Rezultat;
end;
procedure TFormKonvert.FormShow(Sender: TObject);
begin
Kol:=0;
perv:=0; perv2:=0; perv3:=0; sm:=0;
MemoIsh.Clear;
MemoResult.Clear;
LabelKolIsh.Visible:=false;
end;
procedure TFormKonvert.ButtonErrorClick(Sender: TObject);
begin
FormError:= TFormError.Create(self);
FormError.ShowModal;
end;
end.
Файл "FileError.pas".
unit FileError;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TFormError = class(TForm)
MemoError: TMemo;
ButtonExit: TButton;
procedure ButtonExitClick(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormError: TFormError;
implementation
uses Main;
{$R *.dfm}
procedure TFormError.ButtonExitClick(Sender: TObject);
begin
Close;
end;
procedure TFormError.FormShow(Sender: TObject);
var s: string;
sl :LPTSTR;
retval: Integer;
SRec: TSearchRec; begin
MemoError.Clear;
retval:= FindFirst(ExtractFileDir(Application.ExeName)+'\Error.log', faAnyFile, SRec);
if retval<>0
then begin
MemoError.Lines.Add('Файл с ошибками не обнаружен!');
exit;
end;
reset(Error);{открыть файл для чтения}
while not eof(Error)
do begin
readln(Error,s);
sl:= LPCSTR(s);
CharToOem(sl,sl);
OemToCharA(sl,sl);
MemoError.Lines.Add(sl);
end;
closefile(Error); {закрыть файл}
end;
end.
Файл "Spravka.pas".
unit Spravka;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TFormSpravka = class(TForm)
Memo: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormSpravka: TFormSpravka;
implementation
{$R *.dfm}
procedure TFormSpravka.Button1Click(Sender: TObject);
begin
Close; end;
end.
К курсовой работе прилагается рабочая программа и исходный файл. Приложение 2. Результат работы.
Приложение 3. Схема алгоритма.
Схема алгоритма процедуры ButtonPuskClick.
Схема алгоритма основной программы.
2
Документ
Категория
Рефераты
Просмотров
63
Размер файла
460 Кб
Теги
пояснилка
1/--страниц
Пожаловаться на содержимое документа