Проектирование приложения, осуществляющего синтаксический анализ программы

Решение задач синтаксического анализа простой программы. Алгоритм нахождения синтаксических ошибок в ее тексте. Вывод данных о местоположении ошибки. Проектирование программы анализа арифметического выражения и методы проверки его на сумму или разность.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 01.07.2011
Размер файла 2,6 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

Курсовая работа на тему

Разработка программного приложения для решения информационно-логических задач

Сафронов Вячеслав Андреевич

ИС-091

Содержание

Введение

1. Разработка технического задания на проектирование

1.1 Общая постановка задачи

1.2 Определение требований к программе

1.3 Предварительный выбор метода решения задачи

1.4 Определение требований к системе

1.4.1 Требования к системе в целом

1.4.2 Требования к техническому и программному обеспечению

2. Проектирование программного приложения

2.1 Разработка технологии обработки информации

2.2 Разработка структуры и формы представления данных

2.3 Разработка алгоритма решения задачи

2.4 Разработка программы решения задачи

2.4.1 Выбор инструментальных средств

2.4.2 Разработка структуры программы

2.4.3 Проектирование программных модулей

2.4.4 Проектирование программного интерфейса

2.4.5 Обеспечение надежности программы

2.5 Определение конфигурации технических средств

2.6 Тестирование программы

2.6.1 Общие сведения

2.6.2 Процесс тестирования программы

2.6.3 Оценка надежности программы

Заключение

Список использованных источников

Приложения

Введение

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

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

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

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

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

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

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

1. Разработка технического задания на проектирование

1.1 Общая постановка задачи

В данном курсовом проекте требуется проверить, является ли заданное арифметическое выражение суммой(разностью). Также необходимо разработать приложение, осуществляющее синтаксический анализ простой программы, содержащей следующие элементы: типы float, операторы if...goto, if...else, switch, описание библиотек, описание переменных, арифметические и логические выражения, функции ввода и вывода. В процессе синтаксического анализа требуется проверить разделение операторов символом ”;”, парность скобок ”(…)”, ”[…]”, ”{…}”, правильность оформления комментариев вида ”/*...*/”, переменные должны соответствовать заданному типу и состоять из одного символа латинского алфавита, расположить все операторы на отдельных строках с соблюдением правил отступа.

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

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

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

1.2 Определение требований к программе

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

Программа анализа арифметического выражения должна анализировать арифметические выражения длинной не более, чем 256 символов. Это ограничение связано с выделением места в оперативной памяти под строку, состоящей из 256 символов, и с тем, что ввод данных программы производиться из консоли, а так как консоли не поддерживают команды длиной более 256 символов, то вводиться это ограничение. Во вводимых данных должны быть правильно расставлены скобки, иначе программа анализа выражения выдаст сообщение об ошибке с сообщением, что неправильно расставлены скобки. Должны быть правильно расставлены знаки арифметических операций. На неправильно поставленные знаки программа реагирует выдачей сответствующего сообщения о ошибке. Не должно быть вложенных друг в друга скобок более, чем в три раза. Это усложняет процесс анализа выражения на непарность скобок. Арифметическое выражение не должно быть вложено в скобки, если это не изменяет смысл выражения. Допустимые для ввода символы: “+“, “-“, “*“, “/“, “(“, “)”. При вводе иных символов будет выведено сообщение об ошибке.

Требования к программе синтаксического анализа текста простой программы состоят в следующих условиях. Длина строки кода программы не должна превышать 80 символов. Использование длинных строк усложняет процесс чтения текста программы, а также процесс отладки, так как программа синтаксического анализа выводит причину ошибки и номер строки с ошибкой. Если записать несколько операторов в одну строку, то найти причину ошибки будет трудно, поэтому и вводиться данное ограничение. Описание всех библиотек и инициализация переменных должны производиться строго в начале программы. Простая программа не должна содержать вызовов других функций, кроме функций ввода и вывода, находящихся в библиотеках. При открытии блока с использованием символа “{” и при закрытии “}”, данные символы должны находиться на отдельных строках, и ничего не должно также присутствовать на них. Операторы заканчиваются символами “;“ и “:“, и последующий код должен быть перенесен на новую строку.

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

Использование неинициализированных переменных не допускается. При инициализации имя переменной должно быль не более одного символа. Присваивание значения переменной во время её инициализации запрещается. Инициализация должна завершаться символом «;».

Использование операторов должно завершаться символом «;». При использовании оператора «goto» не должна использоваться больше, чем одна метка. При использовании оператора switch, оператор «case» должен в качестве аргументов иметь константу, а завершаться символом «:». Не должно использоваться вложенных друг в друга конструкций «switch». При использовании оператора «if» обязательно должен ставиться в соответствие оператор «else». Не должно использоваться вложенных операторов «if» во избежание выдачи некорректных результатов.

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

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

Средства разработки данных программ должны поддерживать язык C и иметь возможность компиляции исходного кода программ под описанные выше платформы.

1.3 Предварительный выбор метода решения задачи

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

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

При решении задачи анализа арифметического выражения необходимо первоначально проанализировать, чтобы не было знаков на концах арифметического выражения. Исключение составляет только знак “-“, который может находиться только в начале выражения. Суммой считается выражение, где все слагаемые соединены между собой знаком сложения “+“. Разностью считается аналогично, только со знаком “-“. Если все знаки одинаковы, то происходит определение принадлежности к сумме или к разности. Также помимо знаков сложения и вычитания будут попадаться другие знаки, такие как: “*“, “/“, “»“. Они будут игнорироваться, а результат анализа будет считаться по преобладанию в выражении знаков сложения или вычитания.

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

В программе синтаксического анализа текста простой программы метод решения следующий. Загрузка из файла строк посимвольно и хранение их в массиве. Это облегчает доступ, а также вывод местоположения ошибки. В первую очередь проверяются одно строчные и многострочные комментарии, чтобы сузить диапазон анализа. Проверка наличия функции «main», а также проверка парности скобок “(…)“, “[…]“, “{…}“, а также проверка парности кавычек и оформления комментариев вида “/*…*/“. Поиск вызова функций ввода и вывода и сопоставление с подключенными библиотеками. Далее следует анализ операторов, входящих в текст программы. На этом этапе происходит анализ на инициализацию используемых в строке кода переменных, проверку использования переменных в этих операторах. Если используется не инициализированная переменная - выводится сообщение об ошибке. Проверка нахождения операторов в пределах функции main. Также производиться поиск переменных и операторов, определенных в условии задания.

При форматировании текста программы убираются повторяющиеся пробелы и выставляются правильные отступы во время проверки на парность фигурных скобок. Комментарии сохраняются, но входящий в них текст не проверяется. В коде операторов ставятся необходимые пробелы.

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

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

В следующих разделах настоящего курсового проекта следует подробное описание создания программ на основе данного метода решения задачи.

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

Для начала укажем входной алфавит.

Рисунок 1 - РБНФ инициализации алфавита

Опишем процесс анализа суммы или разности.

Рисунок 2 - Анализ арифметического выражения

Изучив диаграммы, можно получить полное представление о том, как происходит анализ синтаксиса в программе анализа арифметического выражения. Запишем диаграммы в виде металингвистических формул. Для диаграммы на рисунке 1 она будет выглядеть следующим образом:

<Буква> ::= “a” | “b” | “c” | “d” | “e” | “f” | “g” | “h” | “i" | “j” | “k” | “l” | “m” | “n” | “o” | “p” | “r” | “s” | “t” | “u” | “v” | “w” | “x” | “y” | “z” | “A” | “B” | “C” | “D” | ”E” | “F” | “G” | “H” | “I” | “J” | “K” | “L” | “M” | “N” | “O” | “P” | “R” | “S” | “T” | “U” | “V” | “W” | “X” | “Y” | “Z” | “0” | “1” | “2” | “3” | “4” | “5” | “6” | “7” | “8” | “9” | “/” | “*” | “-“ | “+”.

В данном случае перечисляются все разрешенные для написания выражения символы.

Запишем металингвистическую формулу для диаграммы, указанной на рисунке 2.

<Множитель> ::= <Константа> | “(” <Выражение> “)”.

<Арифметическое выражение> ::= <Множитель> {(“+” | “-”) <Множитель>}.

1.4 Определение требований к системе

1.4.1 Определение требований к системе в целом

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

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

Разработанная программа имеет интерфейс командной строки. Следовательно, ввод и вывод информации происходит через терминал. Это сделано для того, чтобы уменьшить количество необходимых библиотек, необходимых для функционирования программы. Поэтому теоретически программа может быть скомпилирована на разные операционные системы, но в качестве целевой ОС используется Microsoft Windows.

1.4.2 Требования к техническому и программному обеспечению

Для запуска программы требуется IBM - совместимый компьютер с установленной на него 32-х разрядной операционной системой Microsoft Windows XP или старше. Компиляция осуществляется с помощью свободного компилятора MinGW 3.4.2, распространяемого по свободной лицензии GNU GPL. Это обеспечит патентную чистоту проектного решения, так как выбор компилятора довольно важен для выполнения курсовой работы. Нет зависимостей, от каких либо сторонних библиотек, так как MinGW -- это версия компилятора GCC для Windows. Необходимый для работы код помещается в исполняемый файл. В программе используется язык С стандарта С 89. В программе синтаксического анализа происходит анализ программ на языках С и С++. В силу своей похожести есть возможность анализа языков стандартов С 89 и С 99, так как не используются дополнительные функции, содержащиеся в языке С++.

2. Проектирование программного приложения

2.1 Разработка технологии обработки информации

В процессе своего функционирования программа производит ввод информации и вывод результатов преобразований во внешние файлы. Для корректного ввода и функционирования программы, необходимо соблюдать требования к программе, описанные в пункте 1.3.

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

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

Преимущества:

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

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

- Пакетная запись, в отличие от интерактивной, реже обращается к постоянным запоминающим устройствам (ПЗУ), то актуально при использовании в качестве ПЗУ накопителей на основе Flash-памяти.

Недостатки:

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

- При сбое в процессе работы программы теряются промежуточные результаты работы программы.

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

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

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

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

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

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

Обработка комментариев позволяет сделать текст в теле комментариев “невидимым“ для операций обработки операторов и скобок.

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

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

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

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

2.2 Разработка структуры и формы представления данных

Внешние данные программы представляются пользователем заранее. Программа синтаксического анализа читает и записывает файлы в кодировке Windows CP=1251. Использование кодировок, отличных от используемой в настоящем курсовом проекте, не разрешается.

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

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

Для хранения инициализированных переменных применяется структура, состоящая из полей: название переменной, ее тип, номер строки инициализации, номер столбца инициализации.

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

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

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

Что касается программы анализа арифметического выражения, то все данные хранятся в массиве символов с количеством элементов равным 255. Запись в массив происходит из консоли при вводе текста пользователем. Среди операций обработки данных используется поиск необходимого символа в массиве. На базе этой операции реализована операция проверки парности скобок.

2.3 Разработка алгоритма решения задачи

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

Разработаем алгоритм решения задачи анализа арифметического выражения.

Первоначально необходимо предусмотреть вариант ввода пользователем некорректных данных. Для этого будем использовать цикл «do{ }while()» в котором будем проверять введенное выражение на ошибки, а условием выхода из цикла будет считаться переменная «flag» (имеющая по умолчанию ложное значение) которой будет присваиваться истинное значение в случае обнаружения ошибки. После цикла находиться проверка выражения на сумму или разность.

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

Алгоритм решения данной задачи представлен в виде блок-схемы в Приложении А;

Теперь разработаем алгоритм решения задачи синтаксического анализа текста простой программы на языке С.

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

Рассмотрим операцию сдвига символов. Она состоит из цикла, число повторов в котором равно количеству сдвигаемых символов. В теле цикла находится условие, по которому определяется направление сдвига. Если сдвигаем символы влево, то в цикле перебираются все элементы массива, начиная с того, где установлен курсор, в текущий элемент приравнивается следующий. Если сдвиг происходит вправо, то происходит аналогичный перебор, но в обратном порядке, а символ, где установлен курсор, записывается пробел.

Рассмотрим операцию поиска текста в строке. Эта операция будет возвращать результат. Если функция возвратит результат минус 1, введенное слово не найдено. Если слово найдено, то будет возвращаться индекс элемента строки, где произошло совпадение. Операция реализована циклом, где еще одним вложенным циклом проверяется наличие совпадений, и если есть совпадение - переменная-счетчик увеличивается на единицу. Если количество совпадений равно длине искомого слова - возвращается индекс строки, иначе минус 1.

В операции удаления пробелов в цикле проверяется - равен ли следующий элемент текущему, если равны, то проверяется на равенство пробелу, если равно - происходит сдвиг на один символ влево.

В операции поверки парности скобок проверяется парность скобок вида «( … )», «[ … ]», «{ … }», а также проверка парности кавычек «”». Подсчитывается в цикле количество открывающих и закрывающих скобок. Открывающая скобка увеличивает значение счетчика на единицу, закрывающая уменьшает на единицу. После тела цикла проверяется отличие счетчиков от нуля. Если оно найдено, то детально обрабатывается каждая строка и выводится индекс строки, где нарушена парность скобок.

В операции организуется поиск ячеек, содержащих символы «;» или «:», и, если они найдены, производится сдвиг на один символ вправо и запись в следующую ячейку символа перехода на новую строку. Также организуется поиск открывающих и закрывающих фигурных скобок. Если они найдены - происходит сдвиг вправо, на кратное двум, число пробелов, в зависимости от уровня вложенности.

В операции обработки библиотек организуется поиск ключевого слова, соответствующего наименованию библиотеки, в данном случае «stdio.h». Если библиотека найдена, то в найденной строке ищется директива «#include» и проверяется порядок их следования в тексте.

Операция сохранения в файл представляет передачу в цикле каждого ненулевого символа в файл.

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

Операция обработки синтаксиса программы включает в себя несколько операций: обработку функции «main», обработку инициализации переменных, обработку функций ввода-вывода, обработку оператора «goto», «if», «switch», обработку арифметических выражений.

Рассмотрим подробнее эти под операции. Обработчик функции main ищет в тексте функцию «main», проверяет случай отсутствия её в тексте и многократную инициализацию. Если найдена функция main, то строка, где она обнаружена, запоминается в глобальной переменной для последующего использования.

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

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

Обработка оператора «goto» организует поиск в тексте этого оператора, при нахождении которого ищет метку, если метка не найдена или находится не в функции main, то выводится сообщение об ошибке.

Обработка оператора «if» организует поиск его в строке, проверку правильности условия: парность скобок, использование инициализированных констант, наличия в условии только арифметических и логических знаков. Также проверяется местоположение оператора «else», если он объявлен перед оператором «if» выводится сообщение об ошибке.

Обработка оператора «switch» организует поиск названия этого оператора в тексте, также проверяется наличие операторов «case» если «switch» не найден. При нахождении искомого оператора проверяется местонахождение оператора «case» перед «switch». Проверяется наличие констант после «case» и финализация оператора двоеточием.

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

Алгоритм решения данной задачи представлен в виде блок-схем в приложении Б.

2.4 Разработка программы решения задачи

2.4.1 Выбор инструментальных средств

Разработка программного приложения производилась с использованием языка С стандарта С89. Несмотря на то, что язык С устарел и вытеснен языком С++, он продолжает оставаться языком операционной системы UNIX, и языком на котором разрабатывается системное программное обеспечение. Язык С позволяет компилировать исходный код программ для разных операционных систем. Программы, написанные на этом языке, занимают небольшой объем, благодаря этому не требуется больших аппаратных ресурсов для их запуска. В отличии он языков, основанных на платформе .NET, программам, написанным на нем, не требуется для функционирования среда. Для разработки настоящего программного обеспечения использовался компилятор GCC, позволяющий компилировать код под различные платформы. Язык С позволяет наиболее гибко и удобно работать с массивами и символами, что актуально в условиях данной задачи.

В качестве среды разработки использовалась свободная среда разработки MonoDevelop 2.4. Она предоставляет программисту следующие возможности: подсветка синтаксиса кода, сворачивание участков кода, соблюдение отступов. Если в коде есть ошибка, то среда подсветит ошибочную строку. Все эти возможности позволяют облегчить и ускорить процесс разработки программного обеспечения.

синтаксический программа арифметический

2.4.2 Разработка структуры программы

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

Программы работают автономно и не взаимодействуют с другими программами. Исключение составляет лишь программа «dir». Её запуск происходит программой синтаксического анализа перед вводом имени файла. Так как эта программа тесно связана с терминалом командной строки, то зависимостью программы от нее можно пренебречь.

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

Рассмотрев в пункте 2.3 алгоритмы решения задачи синтаксического анализа, опишем их взаимосвязь, так как одна функция может использовать другую. Функция обработки комментариев использует функцию сдвига символов для освобождения места под нулевой символ, который будет добавляться далее в коде функции. Аналогично функция выравнивания текста программ использует сдвиг символов, чтобы записать символ перехода на новую строку и подвинуть заданное количество раз текст. Функция обработки библиотек использует функцию поиска текста в строке. Среди функций обработки операторов используются сразу оба оператора. Главная функция, main, использует функцию нахождения количества строк для инициализации внутренней памяти, функцию проверки входного алфавита, проверки парности скобок, ликвидации лишних пробелов, проверки инициализации библиотек, функции операторов, выравнивание, сохранения в файл.

2.4.3 Проектирование программных модулей

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

В программе арифметического анализа вся программа, в силу небольшого спектра решаемых задач, представлена в виде одной функции «main». Исходный код программ прилагается в Приложении В.

2.4.4 Проектирование программного интерфейса.

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

Номер строки: Номер столбца: «Ошибка» : Наименование ошибки

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

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

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

Выводимые сообщения об ошибках можно разделить на две группы: критические и синтаксические. Критические сообщения об ошибках повествуют, о некорректно введенных данных. Их вывод сопровождается аварийным завершением работы программы. После этого пользователь должен перезапустить программу и ввести данные по-новому. К таким ошибкам можно отнести некорректные имена файлов, незавершенные многострочные комментарии, наличие во входных данных (текст простой программы или арифметическое выражение) символов не соответствующих принятому алфавиту, непарность скобок и кавычек. Синтаксические сообщения об ошибках повествуют, о неправильности синтаксиса простой программы, и не приводят к аварийному завершению работы программы. Таким образом выводятся для обозревания пользователем список найденных ошибок в тексте простой программы. В случае анализа арифметического выражения синтаксических ошибок нет, а вместо них выводится результат работы программы. Синтаксические ошибки выводятся в случае: нарушения правил инициализации библиотек, нарушения правил инициализации и использования функции «main», нарушения правил инициализации переменных, использования функций ввода-вывода без инициализированной библиотеки, неправильное использование функций ввода-вывода, неправильное использование операторов if, goto, switch, арифметические ошибки.

2.4.5 Обеспечение надежности программы

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

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

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

2.5 Определение конфигурации технических средств

Данный вопрос был рассмотрен в пункте 1.4.2, теперь рассмотрим подробнее эту конфигурацию. Для нормального функционирования программы требуется операционная система Microsoft Windows XP и старше. В настоящее время эта версия операционной системы самая распространенная. Она сочетает в себе мультимедийные возможности операционных систем серии 9х и стабильность, унаследованную из семейства NT. Также невысокие системные требования поспособствовали широкому распространению это операционной системы. Для нормального функционирования этой операционной системы требуется процессор Intel Celeron 1 гигагерц, объем оперативной памяти 192 мегабайт, наличие VGA адаптера. Так как операционная система нормально функционирует на данном оборудовании, то программное обеспечение, разработанное в рамках настоящего курсового проекта, будет требовать наличия данных аппаратных средств.

Если не учитывать требования операционной системы, то требования программы уложатся в: процессор Intel Pentium и выше, объем оперативной памяти в 32 килобайт, свободное место на жестком диске - 96 килобайт. Теоретически есть возможность запустить данную программу (предварительно скомпилировав) на операционной системе MS-DOS, но ограничения на длину имени файла потребуют переписывания исходного кода программы.

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

2.6 Тестирование программы

2.6.1 Общие сведения

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

При выполнении настоящего курсового проекта требуется подготовить простую программу на языке С, содержащую только функцию «main», на ней необходимо продемонстрировать работу программы синтаксического анализа. Исходный код простой программы приведен в Приложении Г.

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

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

2.6.2 Процесс тестирования программы

Порядок выполнения основных операций приведен в разделе 2.6.1, поэтому в повторении не нуждается. Что касается тестирования программы, то в процессе тестирования были найдены ошибки в функции обработки оператора «switch», программа при отсутствии этого оператора не проверяла на наличие оператора «case». Ошибка исправлена, последующее тестирование программы показало хорошие результаты в нахождении различных ошибок, внесенных в код простой программы. Программа работает стабильно при введении в нее корректных данных.

2.6.3 Оценка надежности программы

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

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

Заключение.

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

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

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

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

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

Список использованных источников

1. Полный справочник по С. Четвертое издание [Текст]: Пер. с англи. /Шилдт, Герберт. - М.: Издательский дом «Вильямс», 2002. - 704 с. : ил. - Парал. Тип. Англ. - ISBN 5-8459-0226-6(рус)

Приложения

Приложение А

Блок-схема алгоритма решения задачи анализа арифметического выражения.

Приложение Б

Блок-схема алгоритма решения задачи синтаксического анализа простой программы на языке С.

Алгоритм подсчета количества строк в файле.

Алгоритм сдвига символов в строке.

Алгоритм обработки комментариев.

Алгоритм поиска текста в строке.

Алгоритм обработки пробелов.

Алгоритм обработки парности скобок.

Алгоритм форматирования текста простой программы.

Алгоритм анализатора библиотеки.

Алгоритм сохранения форматированного кода в файл.

Алгоритм инициализации алфавита простой программы.

Алгоритм анализатора инициализации переменных.

Алгоритм анализатора функций ввода-вывода.

Алгоритм анализатора оператора «goto»

Алгоритм анализатора конструкции if-else.

Алгоритм анализатора оператора switch.

Алгоритм анализатора арифметических выражений в тексте программы.

Алгоритм анализатора функции «main»

Алгоритм функции «main».

Приложение Б

Исходный код задачи анализа арифметического выражения.

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define bool char

#define false 0

#define true 1

int main()

{

char string[255];

bool flag=false;

int result=0, i=0;

float cnt=0.0, cnt1=0.0;

do{

flag=false;

cnt=0;

gets(string);

if (!strlen(string))

{

printf("Вы ввели пустую строку, введите заного\n");

flag=true;

}

for (i=0; string[i]!=0; i++)

{

if (string[i]>=65 && string[i]<=90)

{

string[i]=string[i]+32;

}

if ((string[i]=='(')&&(string[i+1]==')'))

{

printf("Выражение не можнт содержать (), введите заного\n");

flag=true;

}

if (string[i]=='(') cnt++;

if (string[i]==')') cnt--;

if (!(strchr("abcdefghijklmnopqrstuvwxyz+-*^/)(1234567890", string[i])))

{

printf("Не корректный символ %c попробуйте заного\n",string[i]);

flag=true;

}

}

if (flag==false&&((strchr("*+^/", string[0])) \

||(strchr("+*-^/", string[strlen(string)-1]))))

{


Подобные документы

  • Разработка технологии обработки информации, структуры и формы представления данных. Проектирование программных модулей. Блок-схема алгоритма и исходный код программы анализа арифметического выражения, синтаксического анализа простой программы на языке С.

    курсовая работа [2,4 M], добавлен 12.12.2011

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

    курсовая работа [28,5 K], добавлен 28.06.2011

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

    курсовая работа [1,6 M], добавлен 12.12.2011

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

    курсовая работа [934,7 K], добавлен 01.07.2011

  • Рaзрaботка программного приложения (синтаксического aнaлизaторa), которое производит проверку синтaксисa простейшей программы на языке С++. Процедура проверки арифметических и логический выражений. Механизм удаления всех фиктивных переменных из программы.

    курсовая работа [27,2 K], добавлен 28.06.2011

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

    лабораторная работа [1,6 M], добавлен 23.11.2014

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

    курсовая работа [2,0 M], добавлен 14.06.2010

  • Разработка программного приложения, производящего проверку синтаксиса простой программы: выбор метода создания синтаксического анализатора, описание требований к программному обеспечению, написание алгоритмов решения и тестирование конечного продукта.

    курсовая работа [579,7 K], добавлен 03.07.2011

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

    курсовая работа [1,6 M], добавлен 22.06.2011

  • Аспекты безопасности информации, предотвращение внедрения программных закладок. Проектирование и разработка программы шифрования данных по заданной таблице из 160 символов. Дешифровка и вывод результата приложения. Его программный код и тестирование.

    курсовая работа [163,1 K], добавлен 05.05.2016

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.