Программное обеспечение удалённого доступа к технической документации (diplom)

Посмотреть архив целиком

Введение. 3

1. Постановка задачи. 8

1.1 Требования, предъявляемые к транслятору. 8

1.2 Оценка достоинств и недостатков существующих трансляторов. 10

Заключение. 15

2. Проектирование транслятора 16

2.1 Схема разработки транслятора. 16

2.2 Принципы построения лексических анализаторов. 18

2.3 Грамматики. Принципы построения грамматических анализаторов. 21

Заключение. 34

3. Технология реализации транслятора с помощью генераторов программ Lex и Yacc. 35

3.1 Определение лексем, встречающихся в формате nroff 35

3.2 Описание грамматических правил преобразования из формата nroff в формат HTML. 40

3.3 Соответствие между командами форматов nroff и HTML. 43

3.4 Отладка лексического и грамматического анализаторов. 48

Заключение. 49

4. Экономическое обоснование разработки НИОКР. 50

4.1 Расчет затрат времени на разработку транслятора. 50

4.2 Расчет стоимости основных фондов, используемых для разработки транслятора. 52

4.3 Расчет затрат на разработку транслятора. 56

4.4 Формирование расчетной (остаточной) прибыли предприятия и определение эффективности произведенных затрат на разработку транслятора. 60

4.5 Оценка значимости разработки транслятора. 65

Заключение. 68

5. Обеспечение комфортных условий труда при работе на ПЭВМ. 69

5.1 Характеристика условий труда оператора ЭВМ 69

5.2 Требования к защите от шума и вибраций. 69

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

5.4 Требования к интенсивности электромагнитных полей, рентге-
новского, видимого, ультрафиолетового и инфракрасного излучений. 73

5.5 Требования к освещению помещений и рабочих мест с ПЭВМ. 74

5.6 Расчет освещенности рабочего места программиста. 78

Заключение. 84

Список литературы: 85

Приложения. 86

Фрагмент кода лексического анализатора. 86

Фрагмент кода грамматического анализатора. 87

Код головной программы. 89



Введение.

Одним из основополагающих моментов организации САПР является выбор архитектуры вычислительного комплекса и технологии доступа к прикладным программным средствам. В настоящее время наиболее распространенным является подход, получивший наименование «технологии клиент-сервер». Этот подход состоит в сосредоточении вычислительных и прикладных ресурсов на выделенных компьютерах - серверах и организации доступа к ним с рабочих мест - клиентов.

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

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

Например, документация о системе UNIX и функциях языка «c++» (или его аналога «g++») представлена в виде так называемых «manual pages». Она просматривается с помощью команды системы UNIX «man» либо с помощью утилиты просмотра «Xman». Справочные файлы САПР «Compass» используют формат «Iview», просматриваемый с помощью специальных утилит просмотра. А САПР «Cadence» предоставляет информацию пользователю в формате «Open Book», также требующем специальных средств просмотра.

Кроме того, при использовании в качестве рабочего места X‑терминала, доступ к некоторым документам становится невозможен в принципе, так как, например, программе просмотра «Iview» требуется для работы графический клиент X‑Window версии 6, а многие из находящихся в эксплуатации Х‑терминалов имеют аппаратно‑реализованную версию X‑Window 5.

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

Единый формат для документации должен отвечать следующим требованиям:

  • Тексты, записанные в выбранном формате, должны быть доступны для чтения как на персональном компьютере под управлением операционной системы Windows 95(NT), так и на сервере, работающим под управлением UNIX, а также на Х‑терминале.

  • Тексты должны сохранять исходное форматирование.

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

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

Представляется оптимальным выбор формата HTML. Этот формат просматривается с помощью программ, версии которых работают как под управлением Windows, так и под управлением UNIX. Формат HTML поддерживает широкие возможности форматирования. Кроме того, этот формат является стандартным форматом для текстов в технологиях Internet, и его использование позволяет легко решить проблему общедоступности документации при помощи использовании этих технологий. Используя формат HTML, можно сделать документацию, преобразованную из того или иного формата, общедоступной, поместив ее в один из узлов сети. Следует заметить, что в настоящее время большинство локальных сетей строятся на тех же принципах и с использованием того же инструментария, что и сети Internet. Формат HTML удобен еще и тем, что форматирование текста в нем, как и в формате nroff (наиболее распространенном в среде UNIX), осуществляется простыми текстовыми командами, что позволяет его легко редактировать в случае надобности с помощью любого текстового редактора.



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

Рассмотрены экономические аспекты разработки программы‑транслятора, произведена оценка значимости разработки транслятора.

1. Постановка задачи.

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

1.1 Требования, предъявляемые к транслятору.

Согласно условиям технического задания программа должна функционировать в вычислительных системах под управлением ОС "Unix" и совместимых с ней (“SunOS”, “Linux”, “FreeBSD”, и др.). Проблема состоит в том, что исполняемые файлы ОС “UNIX” могут быть неработоспособны в среде “Linux”. В то же время, многие из UNIX-подобных систем поставляются пользователю в виде исходных файлов, предназначенных для компилирования. Так же и в данном случае можно передавать программу в виде исходных текстов, снабженных программой компиляции. Это, с одной стороны, повысит переносимость программы, а с другой - позволит вносить достаточно опытному пользователю необходимые поправки и корректировки, расширяя возможности транслятора в соответствии с потребностями пользователя. При этом необходимым условием становится написание программы при помощи таких средств, которые присутствовали бы в любой UNIX-подобной операционной системе.

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

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

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

1.2 Оценка достоинств и недостатков существующих трансляторов.

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

Наиболее известными и распространенными программами в настоящее время являются следующие:

  1. Программа “nroff2HTML” (автор Р. Ричи).

Программа написана на языке “C”, работает под управлением ОС “UNIX”.

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

. В
результате
получается
сплошной текст.

  1. Программа “gnome-man2html”, входящая в графический интерфейс пользователя “GNOME”.

Программа написана на языке "C", работает под управлением операционной системы "Linux", тесно интегрирована с графическим интерфейсом пользователя "GNOME".

Данная программа работает не с реальными файлами, а выступает как фильтр при выводе текста с помощью программы “man” на экран компьютера, перенаправляя вывод в окно HTML-броузера и снабжая его при этом всеми командами, необходимыми для форматирования. Полученный на экране текст выглядит наилучшим образом, т.к. в нем сохраняются все необходимые виды форматирования и поддерживаются перекрестные ссылки. Но данная программа не может работать без пакета “GNOME”, для работы которого, в свою очередь, необходима ОС “Linux”.

  1. Программа “hypernroff” (автор К. Садовски).

Программа написана на языке “C”, работает под управлением ОС “UNIX”.

В качестве входного и выходного потоков используется стандартный поток ввода‑вывода. Позволяет принимать информацию из файлов и выводить ее в файл посредством перенаправления потоков, доступном в среде UNIX. Вставляет в текст конечного файла обязательные теги формата HTML. Поддерживает некоторые виды управления текстом, такие, как выравнивание (по левому и правому краям, по центру). Все форматирование осуществляется заменой пробелов, при помощи которых форматируется текст в формате nroff, на символ формата HTML “nbsp” - неразрывный пробел. Изменение шрифтов, подчеркивание, курсив не поддерживаются.

  1. Программа “man2html” (автор Р. Верховен).

Программа написана на языке “C”, работает под управлением ОС “FreeBSD”. Под управлением других разновидностей ОС “UNIX” не полностью работоспособна. Существует cgi-скрипт “vh-man2html” (автор М. Гамильтон), обеспечивающий вызов программы и выдачу результатов ее работы в html-броузере.

Работает с исходными текстами в формате nroff. Поддерживает макросы man-1.4 и формат BSD-mandoc (разновидность nroff). Вставляет в текст конечного файла обязательные теги формата HTML. Поддерживает различные виды управления текстом, в том числе таблицы. Замена шрифтов не производится. Не вставляются перекрестные ссылки, хотя скрипт “vh-man2html” сильно облегчает поиск необходимых файлов.

Ни одна из этих программ не удовлетворяет нашим требованиям, так как нам необходимо сохранять максимально полный объем форматирования (что дает нам программа “gnome-man2htmnl”), добившись переносимости программы и максимальной ее независимости от наполнения операционной среды (программа “gnome-man2htmnl” является непереносимой, она функционирует только под управлением системы Linux). Главным недостатком всех рассмотренных программ является их ориентация на работу непосредственно на одном рабочем месте, без использования сетевых технологий. Этим объясняется, например то, что ни одно из программ не поддерживает замену шрифтов X‑Window System на шрифты операционной системы Windows.

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

1.3 Выбор способа реализации транслятора.

Первым очевидным элементом, присутствующим во всех таких ОС, является компилятор языка “С”, на котором, собственно, и написана операционная система “UNIX”. Но язык “С” является достаточно сложным языком и не все пользователи знакомы с ним. В тоже время, в ОС “UNIX” существуют другие средства написания программ: это генераторы программ LEX и YACC. Описание их команд настолько просто и логично, что позволяет вносить коррективы в существующую программу не имея специальной подготовки, и, возможно, даже не будучи знакомым с описанием этих средств, имея только текст исходной программы.



Заключение.

Выявлена необходимость создания программы‑транслятора, так как существующие на данный момент программы не удовлетворяет предъявляемым требованиям. В качестве конечного формата выбран гипертекстовый формат HTML, как наиболее полно соответствующий нашим целям, широко распространенный и простой в использовании. В качестве средства создания программ выбраны генераторы программ Lex и Yacc благодаря легкости освоения и полной переносимости программ, написанных на их основе, в среде UNIX.

2. Проектирование транслятора

Проектирование программы‑транслятора с использованием генераторов программ Lex и Yacc имеет свои особенности, независящие от конкретных форматов, с которыми будет работать разрабатываемый транслятор.

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

2.1 Схема разработки транслятора.

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

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

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

Компиляция модулей (лексического анализатора, синтаксического анализатора и головной программы) происходит в следующем порядке:

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

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

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

2.2 Принципы построения лексических анализаторов.

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

Основным элементом лексического анализатора являются правила. Правила – это расширенные регулярные выражения и действия. Действия могут быть записаны как с помощью команд «языка» Lex, так и на языке C. Регулярные выражения – это описания возможных наборов символов из входного потока, называемые в дальнейшем лексемами.

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

Хотя лексический анализ по своей идее прост, тем не менее эта фаза работы транслятора часто занимает больше времени, чем любая другая. Частично это происходит из-за необходимости просматривать и анализировать исходный текст символ за символом. Иногда даже бывает необходимо вернуть прочитанный символ во входной поток с тем, чтобы повторить просмотр и анализ. Происходит это потому, что часто бывает трудно определить, где проходят границы лексемы. Например, могут существовать две лексемы: “make” и “makefile”. При анализе входного потока символов может быть выделена лексема “make”, хотя правильно было бы выделить лексему “makefile”. Единственный способ преодолеть это затруднение - просмотр полученной цепочки символов назад и вперед. В нашем примере при выделении лексемы “make” мы должны просмотреть следующий поступающий символ и, если он будет символом "f", то вполне возможно, что поступает лексема “makefile”.

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

Также в общем случае предполагается, что лексема может находиться в любом месте входного потока. Но при этом предусмотрены способы учитывать контекст. Во‑первых, для этого применяются так называемые «состояния» лексического анализатора. Переход в состояние осуществляется при срабатывании какого‑либо правила по специальной команде. Исходным состоянием анализатора является состояние «0». Возможна ситуация, когда одно и тоже правило может выполняться в нескольких состояниях. Во‑вторых, существует оператор определения контекста: «/». Например, выражение «ab/cd» удовлетворяет строке ab только в том случае, если за ней следует cd.

Кроме того, в Lex существуют инструменты, использующие просмотр вперед и назад: в правиле при определении лексемы могут использоваться спецсимволы «^» и «$», говорящие, что лексема должна находится в начале строки или в конце. Последний, на самом деле, является частным случаем оператора «/», так как для определения конца строки используется выражение

\”\n”

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

Для передачи данных из лексического анализатора в синтаксический существует несколько путей. Наиболее простым является метод передачи данных при помощи глобальных переменных – текстовой yytext и числовой yylval.

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

2.3 Грамматики.
Принципы построения грамматических анализаторов.

Спецификация Yacc (грамматика) описывается как набор правил в виде, близком к форме Бэкуса‑Наура (БНФ). Каждое правило описывает грамматическую конструкцию, называемую нетерминальным символом, и сопоставляет ей имя. С точки зрения грамматического разбора правила рассматриваются как правила вывода (подстановки). Грамматические правила описываются в терминах некоторых исходных конструкций, которые называются лексическими единицами, или лексемами. Как правило, имена сопоставляются лексемам, соответствующим классам объектов, конкретное значение которых не существенно для целей грамматического анализа.

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

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

Если порождающее правило имеет следующий вид:

A ::= ,

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

Если порождающее правило имеет вид:

A ::= ,

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

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

Контекстно-свободные грамматики.

Существует несколько основополагающих терминов в теории грамматик. Нетерминальный символ (нетерминал) – описываемые элементы. Например, при определении языков программирования нетерминалами служат <оператор>, <арифметическое выражение> и т.п. В контекстно-свободной грамматике может быть любое конечное число нетерминалов.

Слова из словаря языка играют роль терминальных символов (терминалов). Контекстно-свободная грамматика может также содержать любое конечное число терминалов. В языках программирования терминалами являются фактически используемые в них слова и символы: «do», «else», «+» и т.п.

Правила грамматики иногда называются продукциями и в общем виде выглядят так:

Один_нетерминал любая конечная цепочка из терминалов и нетерминалов.

При этом цепочка справа от стрелки может быть и пустой. Например,

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

<оператор> IF <логическое_выражение> THEN <оператор>

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

Итак, контекстно-свободная грамматика будет задаваться:

  1. конечным множеством нетерминалов;

  2. конечным множеством терминалов, которое не пересекается с множеством нетерминалов;

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

  4. одним нетерминальным символом, выделенным в качестве начального.

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

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

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

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

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

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

Описать дерево вывода цепочки контекстно-свободного языка проще на примере.

Пусть дана следующая грамматика (начальный нетерминал ):

1. ac

2.

3. c

4. b

5. b

6. a

Пусть дана цепочка: ac, тогда вывод будет выглядеть следующим образом:

(1) ==> ac (2) ==> abc (3) ==> acbc (4) ==> acabc (5) ==> acabc (6) ==> acabac (7).

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


(1)


(2)

 

a c  


(3)

 

a c  

b  


(4)

 

a c  

b  

c  


(5)

 

a c  

b  

c  


(6)

 

a c  

b  

c  

  • a  


(7)

 

a c  

b a  

c  

  • a  


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

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

Таким образом, резюмируя вышесказанное, можно подытожить:

  1. Каждой цепочке, выводимой в данной контекстно-свободной грамматике, соответствует одно или несколько деревьев вывода.

  2. Каждому дереву соответствует один или более выводов.

  3. Каждому дереву соответствует единственный правый и единственный левый выводы.

  4. Если каждой цепочке, выводимой в данной контекстно-свободной грамматике, соответствует единственное дерево вывода, эта грамматика называется однозначной; в противном случае ее называют неоднозначной.

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

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

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

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

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

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

Если нетерминал в левой части правила является достижимым, то достижимы и все символы правой части этого правила.

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

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

text: text string

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

text: text word

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

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

Команды могут иметь аргументы, описание аргументов также подчиняется определенным правилам.

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

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



Заключение.

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

3. Технология реализации транслятора с помощью генераторов программ Lex и Yacc.

При построении транслятора сначала строится лексический анализатор и происходит его отладка. На этом этапе лексемы определяются, но передачи их куда-либо не происходит. После отладки (когда есть уверенность, что тексты на лексическом уровне обрабатываются достаточно полно) в правила лексического анализатора добавляется возврат лексем командой return(). Естественно, что на этом этапе лексический анализатор самостоятельно может принять из потока и обработать не более одной лексемы. Начинается построение синтаксического анализатора, который каждый раз для получения лексемы вызывает лексический анализатор. Затем также происходит отладка анализаторов. Окончательным этапом является создание головной программы и отладка взаимодействия всех частей транслятора.

3.1 Определение лексем, встречающихся в формате nroff

Прежде всего, в формате nroff можно выделить четыре группы лексем: текст, команды, аргументы команд и переменные.

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

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

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

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

Если строка не содержит никаких символов (кроме конца строки), то происходит вывод пустой строки и выдается команда перевода строки.

Состояния, имеющиеся в формате nroff.

Состояние

Описание

Переходы

0

Начальное состояние

Возможен переход в состояние приема команды или текста.

TEXT

Состояние приема текста

После приема одной текстовой строки происходит переход в начальное состояние.

COMMAND

Состояние приема команд

После приема команды происходит переход в состояние приема аргумента.

COMARG

Состояние приема аргумента команды

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


Основные лексемы, встречающиеся в формате nroff.

Лексема

Значение

TEXTSTR

Строка текста

EMPTYSTR

Пустая строка

FONT

Команды управления

SIZE

шрифтами

ADJUST

Команды управления

NOADJUST

расположением

SCENTER

текста

IN

Команды управления

TIN

отступами

SUNDERLINE

Команды управления

UNDERLINE

видом

BOLD

текста

BREAKLINE

Команды вывода

SPACE

символов разрыва строк и

LINESPACE

пробельных символов

UNKNOW

Все неизвестные команды

EXIT

Команда прекращения обработки текста

DARG

Аргументы

CARG

команд

SARG



Случайные файлы

Файл
MarkLION.doc
160655.rtf
73111.rtf
153840.rtf
11459.rtf