diplom (664366), страница 2

Файл №664366 diplom (Программное обеспечение удалённого доступа к технической документации) 2 страницаdiplom (664366) страница 22016-07-31СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 2)

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

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

  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

a

Характеристики

Тип файла
Документ
Размер
353 Kb
Тип материала
Учебное заведение
Неизвестно

Список файлов реферата

Example
man.1
man.html
Poster
p1.vsd
p2.vsd
p3.vsd
p4.vsd
p5.vsd
Programm
cc-nroff2html.
lex.yy.c
nroff2html.
nroff2html.c
nroff2html.lex
nroff2html.yacc
runtest.
y.output
y.tab.c
Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6683
Авторов
на СтудИзбе
290
Средний доход
с одного платного файла
Обучение Подробнее