- •Программная инженерия
- •1.1Объектно-ориентированная технология разработки программ
- •1.2 Понятие класса
- •1.3 Понятие объекта
- •1.4 Составляющие класса и объекта
- •1.7 Понятие наследования
- •1.8 Структура классов в Delphi
- •1.9 Виды наследования
- •1.4.1 Классификация грамматик по Хомскому
- •1.4.2 Классификация языков
- •2.3 Цепочки вывода (левосторонний, правосторонний)
- •2.4 Проблемы однозначности и эквивалентности грамматик
- •2.7 Построение ка для языка, заданного регулярным выражением.
- •2.9 Определение ll(k)- грамматики и принципы построения распознавателей для этой грамматики.
- •2.12 Понятие прохода
- •2.13 Общие принципы генерации кода
- •2.14 Синтаксически управляемый перевод (су-схемы).
- •Технология разработки программного обеспечения
- •Начало проекта
- •1. Конструкция иерархии данных
- •2. Конструкция последовательности данных
- •3. Конструкция выбора данных
- •4. Конструкция повторения данных
- •Проектирование для потока данных типа «преобразование»
- •Проектирование для потока данных типа «запрос»
- •Базы данных
- •13. Физическая организация баз данных
- •14. Хешированные, индексированные файлы
- •15. Защита баз данных.
- •16.Целостность и сохранность баз данных.
- •Организация эвм и систем
- •Операционные системы
- •2.5.2. Программа типа exe
- •4.3.1. Непосредственная адресация
- •4.3.2. Регистровая адресация
- •4.3.3. Косвенная адресация
- •4.3.4. Прямая адресация (адресация по смещению)
- •4.3.5. Базовая адресация
- •4.3.6. Индексная адресация
- •4.3.7. Базовая-индекснаяадресация
- •5.2.3.1. Сложение и вычитание
- •5.2.3.2. Инкремент и декремент
- •5.2.3.3. Умножение и деление
- •5.2.3.4. Изменение знака числа
- •6.5.3. Запрет определенного маскируемого прерывания
2.7 Построение ка для языка, заданного регулярным выражением.
Конечный автомат – это простейший распознаватель без вспомогательной памяти. Он является эффективным способом определения регулярных языков.
Детерминированный в том случае, когда точно известно, в какое состояние должен быть выполнен переход.
Работа автомата представляет собой последовательность тактов (или шагов). На каждом шаге работы автомат может остаться в том же состоянии или перейти в другое. Поведение автомата на каждом такте определяется функцией переходов, которая зависит от текущего состояния и входного символа. Если функция переходов допускает несколько переходов в следующее состояние, то КА может перейти в любое из них, и такой КА является недетерминированным (НКА).
В начале работы автомат находится в начальном состоянии q0. Работа
автомата продолжается до тех пор, пока на его вход поступают символы
входной цепочки. V+ α β → ∈ λ Ɐ
Мгновенным описанием (МО), или конфигурацией автомата M называется пара (q, w), где q ∈ Q – состояние УУ, w ∈ V* – неиспользованная часть входной цепочки (т.е. символ, обозреваемый считывающей головкой и все символы справа от него). Тогда пара (q0, w) называется начальной конфигурацией для цепочки w, а конфигурация (q, λ) является заключительной, или допускающей,
если q ∈ F (т.е. q – одно из заключительных состояний автомата).
Цепочка w допускается автоматом M, если (q0,w)├─*(q, λ) для некоторого q ∈ F, т.е. получив на вход эту цепочку, автомат из начальной конфигурации может перейти в заключительную.
δ (q,a) = {p} Вариант 1
|
V |
a |
Q |
|
|
q |
|
p |
Вариант 2
Пример.
M ( {q0}, {0,1}, δ, q0, {q0} )
S → 0S | 1S | λ
Например, цепочку из двух символов (q0, 10)├ (q0, 0)├ (q0, λ) . Конфигурация является заключительной, цепочка прочитана. КА её допустит
(q0, 20)├ stop, КА символа (2) такого не знает, перехода не совершит, цепочку не прочитает
10 ∈ L (m)
20 ∉ L (m), L(m) – язык задаваемого автомата
2.8 Преобразование грамматик и цель преобразований.
В общем случае для КС-грамматик невозможно проверить их однозначность и эквивалентность. Но для конкретных случаев бывает можно и нужно привести заданную грамматику к некоторому определённому виду таким образом, чтобы получить грамматику,
эквивалентную исходной. Заранее определённый вид зачастую позволяет упростить работу с языком и построение распознавателей для него. Итак, преобразования грамматик могут преследовать две цели:
1) упрощение правил грамматики;
2) облегчение создания распознавателя языка.
В теории языков программирования основой является создание компилятора для языка,
поэтому главной становится вторая цель. Следовательно, можно пренебречь упрощением правил (и даже смириться с некоторым их усложнением), если при этом удастся упростить построение распознавателя языка.
V+ α β → ∈ λ Ɐ ∪
Приведёнными (или грамматиками в каноническом виде) называются
грамматики, которые не содержат недостижимых и бесплодных символов,
циклов и пустых правил ( λ -правил).
Рассмотрим некоторую грамматику G(VT,VN,P,S) и дадим необходимые определения.
Нетерминальный символ A∈VN называется бесплодным (или бесполезным), если из него нельзя вывести ни одной цепочки терминальных символов, т.е. { α | A →* α, α ∈ VT*} = ø
В простейшем случае символ является бесплодным, если во всех правилах, где он находится в левой части, он встречается также и в правой части. В более сложных случаях бесполезные символы могут находиться в некоторой взаимной зависимости, порождая друг друга. Если из правил грамматики удалить такие символы, то эти правила станут проще.
Символ x ∈ (VT∪VN) называется недостижимым, если он не
встречается ни в одной сентенциальной форме грамматики G. Это значит, что он не может появиться ни в одной цепочке вывода. Для исключения всех недостижимых символов не обязательно рассматривать все сентенциальные формы грамматики, достаточно воспользоваться специальным алгоритмом удаления недостижимых символов. После удаления таких символов правила также упрощаются.
λ -правилами, или правилами с пустой цепочкой, называются все правила грамматики вида A→ λ, A∈VN. Грамматика G называется грамматикой без λ -правил, если в ней нет правил вида (A→ λ), A∈VN, A ≠ S, и существует только одно правило (S→ λ) ∈P, если λ ∈L(G) и при этом S не встречается в правой части ни одного правила грамматики G. Для упрощения процесса построения распознавателя цепочек языка L(G) любую грамматику целесообразно привести к виду без λ -правил.
Циклом в грамматике G называется вывод вида A→*A, A∈VN.
Очевидно, что такой вывод бесполезен, поэтому в распознавателях КС-языков рекомендуется избегать возможности появления циклов.
Таким образом, для того чтобы преобразовать произвольную КС-грамматику к каноническому виду, необходимо выполнить следующие действия (причём именно в том порядке, каком они перечислены):
удалить все бесплодные символы;
удалить все недостижимые символы;
удалить λ -правила;
удалить цепные правила.