Теория языков программирования и методы трансляции

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 23.06.2011
Размер файла 231,5 K

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

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

Уменьшить i на единицу. Если i=0, то алгоритм завершен.

Взять найденное решение для Xi=iXi+i, где i=ii, i=i0+i i+1 Xi+1+…+i n Xn и подставить в него найденные окончательные решения для переменных Xi+1,…, Xn. Получим окончательное решение для Xi. Вернуться к шагу 5.

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

2.2 Конечные автоматы и грамматики

2.2.1 Автоматные грамматики

Среди регулярных грамматик можно выделить отдельный класс - автоматные грамматики. Они могут быть леволинейными и праволинейными.

Леволинейные автоматные грамматики G(VT, VN, P, S) могут иметь правила двух видов: A Bt или A t, где A, BVN, tVT.

Праволинейные автоматные грамматики могут тоже иметь правила двух видов: A tB или A t, где A,BVN, tVT.

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

Классы обычных регулярных грамматик и автоматных почти эквивалентны (т.е. с точностью до правила S ). В автоматных грамматиках разрешается правило вида S , где S - целевой символ грамматики. При этом символ S не должен встречаться в правых частях других правил грамматики; тогда язык, задаваемый автоматной грамматикой G, будет включать в себя пустую цепочку: L(G).

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

2.2.2 Определение конечного автомата

Конечным автоматом (КА) называют пятерку следующего вида: M(Q,V,,q0,F), где

Q - конечное множество состояний УУ автомата;

V - алфавит автомата (конечное множество допустимых символов);

- функция переходов, отображающая Q({V}) в множество подмножеств множества Q: (q,a)=R, aV, qQ, RQ;

q0 - начальное состояние автомата: q0Q;

F - множество конечных состояний автомата: FQ, F.

КА называется полностью определенным, если в каждом его состоянии существует функция переходов для всех возможных входных символов: aV, qQ (q,a)=R, RQ.

Работа автомата представляет собой последовательность тактов (или шагов). На каждом шаге работы автомат может остаться в том же состоянии или перейти в другое. Поведение автомата на каждом такте определяется функцией переходов, которая зависит от текущего состояния и входного символа. Если функция переходов допускает несколько переходов в следующее состояние, то КА может перейти в любое из них. В начале работы автомат находится в начальном состоянии q0. Работа автомата продолжается до тех пор, пока на его вход поступают символы входной цепочки.

Мгновенным описанием (МО), или конфигурацией автомата M называется пара (q, w), где qQ - состояние УУ, wV* - неиспользованная часть входной цепочки (т.е. символ, обозреваемый считывающей головкой и все символы справа от него). Тогда пара (q0, w) называется начальной конфигурацией для цепочки w, а конфигурация (q, ) является заключительной, или допускающей, если qF.

Представим такт автомата M бинарным отношением +-M на множестве конфигураций. Тогда: если (q,a) содержит q' - q'(q,a), то (q,aw)+-M (q',w) для всех wV*. Здесь a{V}, т.е. a является символом входного алфавита или пустым символом. Если a, то на таком такте входная головка сдвигается вправо на одну ячейку. Если же a=, то это означает, что состояние автомата изменяется независимо от обозреваемого входного символа.

Рефлексивное и транзитивное замыкание отношения +- обозначается через +-*.

Цепочка w допускается автоматом M, если (q0,w)+-*(q,) для некоторого qF, т.е. получив на вход эту цепочку, автомат из начальной конфигурации может перейти в заключительную.

Язык, допускаемый (определяемый) автоматом M, представляет собой множество L(M)={wwV* и qF(q0,w)+-*(q,)}. Два автомата эквивалентны, если они задают один и тот же язык.

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

Пусть M - конечный автомат. Он является детерминированным (ДКА) если множество (q,a) содержит не более одного состояния aV, qQ. Если (q,a) всегда содержит ровно одно состояние, то M является полностью определенным (ПО).

Функция переходов КА может быть задана таблицей или графом переходов (диаграммой). Граф переходов КА - это направленный помеченный граф, вершины которого обозначены состояниями автомата, а дуги - символами входного алфавита. При этом дуга (p,q)p,qQ обозначена символом aV, если в КА определена (p,a) и q(p,a). Начальное и конечное состояния на графе помечаются специальным образом, например, начальное - дополнительной пунктирной линией, а конечное - двойным кружком.

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

Рассмотрим 2 примера конечных автоматов - ДКА и НКА.

1. Пусть M=({p,q,r},{0,1},,p,{r}) - ДКА, где функция переходов задана таблицей:

вход

Автомат M допускает все цепочки из {0,1}*, содержащие два стоящих рядом нуля. Попав в состояние r, автомат из него уже не выходит.

Пусть w='01001'.

состояние

0

1

p

{q}

{p}

q

{r}

{p}

r

{r}

{r}

Рассмотрим последовательность тактов для данной цепочки w.

(p,01001) +- (q,1001) +- (p,001) +- (q,01) +- (r,1) +- (r,).

Поскольку rF, это означает, что `01001'L(M).

2. Построим НКА, допускающий цепочки в алфавите {1,2,3}, у которых последний символ цепочки уже появлялся в ней ранее (т.е. цепочка `1232' должна быть допущена, а `122113' - нет). Введем состояния: q0 - нейтральное, qi делает предположение, что последний символ цепочки совпадает с индексом состояния, qf - заключительное состояние. Из состояния q0 автомат может перейти в qa, если наблюдает символ ”a”, или остаться в q0. Находясь в qa и наблюдая символ ”a”, автомат может перейти в заключительное состояние qf или остаться в qa. Из qf автомат никуда не переходит.

Формально такой автомат определим следующим образом:

M=({q0,q1,q2,q3,qf},{1,2,3},,q0,{qf}), функция переходов задана таблицей:

вход

Рассмотрим для примера цепочку w='12321'. Процесс порождения конфигураций будет выглядеть следующим образом:

состояние

1

2

3

q0

{q0,q1}

{q0,q2}

{q0,q3}

q1

{q1,qf}

{q1}

{q1}

q2

{q2}

{q2,qf}

{q2}

q3

{q3}

{q3}

{q3,qf}

qf

Поскольку (q0,12321)+-*(qf,), то `12321'L(M).

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

В качестве состояний нового ДКА рассматриваются все состояния исходного автомата, а также всевозможные сочетания этих состояний по два, по три, …, по n, если в исходном автомате было n состояний.

Для всех новых состояний строится функция переходов, в которой для каждого состояния qiqj появляется переход в новое состояние, представляющий собой объединение всех существовавших ранее переходов из qi и qj.

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

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

Доказано, что описанный алгоритм строит ДКА, эквивалентный заданному КА. При этом если исходный автомат имел n состояний, то в наихудшем случае построенный ДКА будет иметь (2n-1) состояний.

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

Пусть q1 и q2 - состояния автомата M, на вход подается цепочка символов w длины k0: wV*, wk, (q1,w) +-* (q3,), (q2,w) +-* (q4,). Если при этом одно из состояний (q3 или q4) входит в F, а другое - нет, то говорят, что цепочка w различает состояния q1 и q2. Если же для любой входной цепочки w длины k она не различает состояния q1 и q2, то говорят, что они являются k-эквивалентными или k-неразличимыми. Множество K-эквивалентных состояний составляет класс эквивалентности R(k).

Очевидно, что множества F и Q\F являются 0-эквивалентными, записывается этот факт следующим образом: R(0)={F,Q\F}.

Для построения минимального автомата строятся классы эквивалентности R(n). Алгоритм построения классов эквивалентности:

1. Полагаем n:=0, строится R(0)= {F,Q\F}.

2. n:=n+1. Строится R(n) на основании R(n-1): в класс эквивалентности на шаге n входят те состояния, которые по одинаковым символам переходят в n-1-эквивалентные состояния: R(n):={rij(n): {qijQ: aV (qij,a) rj(n-1)} i,jN}.

3. Если R(n)= R(n-1), то работа заканчивается. Иначе переход на шаг 2.

Алгоритм минимизации автомата:

Исключить все недостижимые состояния.

Построить классы эквивалентности.

Каждый из этих классов становится состоянием нового автомата.

Функция переходов строится на основании функции переходов исходного автомата и новых состояний.

2.3 Особенности регулярных языков

2.3.1 Способы задания регулярных языков

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

Утверждение

Язык является РМ тогда и только тогда, когда он задан леволинейной (праволинейной) грамматикой. Язык может быть задан леволинейной (праволинейной) грамматикой тогда и только тогда, когда он является регулярным множеством.

Язык является РМ тогда и только тогда, когда он задан с помощью конечного автомата. Язык распознается с помощью конечного автомата тогда и только тогда, когда он является РМ.

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

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

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

Для построения КА на основе известной регулярной грамматики ее необходимо привести к автоматному виду. Множество состояний автомата будет соответствовать множеству нетерминальных символов грамматики. 2.3.2 Свойства регулярных языков

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

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

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

Проблема эквивалентности: Даны два регулярных языка L1(V) и L2(V). Необходимо установить, являются ли они эквивалентными.

Проблема принадлежности цепочки языку. Дан регулярный язык L(V), цепочка символов V*. Требуется проверить, принадлежит ли эта цепочка языку.

Проблема пустоты языка. Дан регулярный язык L(V). Необходимо проверить, является ли этот язык пустым, т.е. найти хотя бы одну цепочку , L(V).

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

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

Формально лемма записывается так. Если дан язык L, то константа p>0, такая, что если L и p, то цепочку можно записать в виде , где 0<p, и тогда =i, L i0.

Пример. Рассмотрим язык L={anbnn>0}. Докажем, что он не является регулярным, используя для этого лемму о разрастании языков.

Пусть этот язык регулярный, тогда для него должна выполняться лемма о разрастании. Возьмем некоторую цепочку этого языка = anbn и запишем ее в виде . Если a+ или b+, то тогда цепочка i не принадлежит языку для любого i, что противоречит условиям леммы. Если же a+b+, то цепочка 2 также не принадлежит языку L. Получили противоречие, следовательно, язык не является регулярным.

Глава 3. Описание программы

1) При нажатии на кнопку мы видим на экране ведение Формальные языки и грамматики.

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

3) При нажатии на кнопку мы увидим всё содержание курсовой которые обозначены пунктами. Также там имеется с помощью которого можно быстро найти информацию.

4) При нажатии на кнопку скрываются все вышеперечисленные кнопки, расширяется область видения.

Заключение

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

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

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

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

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

Список используемой литературы

1. Малявко А.А. Теория формальных языков / Учебное пособие, Ч.1,2,3. - Новосибирск: Изд-во НГТУ, 2001-2005.

2. Малявко А.А. Системное программное обеспечение ЭВМ. Трансляторы. / Методические указания. - Новосибирск: Изд-во НГТУ, 2006.

3. Гордеев А.В., Молчанов А.Ю. Системное программное обеспечение / Учебник для вузов. - СПб.: Питер, 2001.

4. Ахо А., Сети Р., Ульман Д. Компиляторы: принципы, технологии и инструменты. - М., Изд. дом «Вильямс», 2001.

5. Пратт Т., Зелковиц М. Языки программирования: реализация и разработка. - СПб.: Питер, 2001.

6. Рейуорд-Смит В.Дж. Теория формальных языков. Вводный курс. - М.: Радио и связь, 1988.

7. Хантер Р. Проектирование и конструирование компиляторов. - М.: Финансы и статистика, 1984.

8. Льюис Ф., Розенкранц Д., Стирнз Р. Теоретические основы проектирования компиляторов. - М., Мир, 1979.

9. Грис Д. Конструирование компиляторов для цифровых вычислительных машин. - М., Мир, 1985.

Размещено на Allbest.ru


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

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

    курс лекций [5,5 M], добавлен 04.12.2013

  • Применение правил грамматики. Синтаксический анализатор, нис- и восходящий разбор, полный перебор правил подстановки. Классификация грамматик по Хомскому. Определение языков с помощью автоматов. Форма Бекуса-Наура описания синтаксиса формальных языков.

    лекция [270,1 K], добавлен 19.10.2014

  • Рассмотрение общих сведений и уровней языков программирования. Ознакомление с историей развития, использования языков программирования. Обзор достоинств и недостатков таких языков как Ассемблер, Паскаль, Си, Си++, Фортран, Кобол, Бейсик, SQL, HTML, Java.

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

  • Классификация языков программирования. Использование циклических конструкций и выполнение итерационных процессов. Алгоритмические структуры циклов языков C, C++, Java, C#. Особенности современных языков программирования высокого уровня и их применение.

    курсовая работа [345,6 K], добавлен 13.11.2009

  • Понятия структурного программирования и алгоритма решения задачи. Краткая история развития языков программирования от машинных до языков ассемблера и языков высокого уровня. Процедурное программирование на C#. Методы и программы для моделирования.

    учебное пособие [1,7 M], добавлен 26.10.2010

  • Основные методы описания синтаксиса языков программирования: формальные грамматики, формы Бэкуса-Наура и диаграммы Вирта. Разработка алгоритма решения задачи. Лексический и синтаксический анализатор, семантический анализ. Структурная организация данных.

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

  • Характеристики и свойства языков программирования. Исследование эволюции объектно-ориентированных языков программирования. Построение эволюционной карты механизмов ООП. Разработка концептуальной модели функционирования пользовательского интерфейса.

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

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

    реферат [463,6 K], добавлен 07.09.2009

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

    курсовая работа [292,0 K], добавлен 18.03.2013

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

    презентация [873,4 K], добавлен 23.01.2013

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