Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по тяпу.docx
Скачиваний:
8
Добавлен:
01.04.2025
Размер:
808 Кб
Скачать
☆

44. Автомат с магазинной памятью. Допустимость по заключительному состоянию и по пустому магазину.

Автомат с магазинной памятью – это недерменированный конечный автомат с έ-переходами и одним дополнением – магазин, в котором хранится цепочка “магазинных символов”. Магазинный автомат может обозревать символ на вершине магазина и совершать переход нм основе текущего состояния, входной символ и символ на вершине магазина. Он может выполнить спонтанный переход, используя έ в качестве входного символа. За один такт автомат совершает следующие действия: 1) прочитывает и пропускает входной символ. Если в качестве входа έ, то входные символы не пропускаются. Переходит в новое состояние, которое может и не отличаться от предыдущего 3) Заменяет символ на вершине магазина некоторой цепочкой. Цепочкой может быть έ, что соответствует снятию с вершины магазина, т.е магазин не измениться. Автомат может заменить магазинный символ на один или несколько.

Формально МП-автомат - это семёрка объектов <Q, Σ, Г, δ, q0, Z0, F> где Q - конечное множество состояний; Σ - конечное множество символов – алфавит; Г - конечное множество символов – алфавит магазина; δ - функция переходов, которая тройке аргументов (q,a,X), q ∈Q, a ∈ Σ, X ∈ Г, ставит в соответствие множество пар (p,γ), где p - новое состояние, γ – цепочка магазинных символов, заменяющая X на вершине магазина; q0 ∈Q - начальное состояние; Z0 – начальный символ магазина.

F - Множество финальных состояний.

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

По состоянию: Пусть P= <Q, Σ, Г, δ, q0, Z0, F> - МП-а, тогда L(P) – язык, допускаемый P по заключительному состоянию определяется так: {w | (q0 w, Z0 ) } |-* (q, έ, α)} для некоторого состояния q из F и произвольной магазинной цепочки α. Таким образом начиная со стартовой конфигурации с w на входе, P прочитывает w и достигает допускающего состояния. Содержимое магазина при этом не имеет значения. По магазину: Пусть P - МП-а, тогда N(P) {N – пустой магазин} – язык, допускаемый P по пустому магазину определяется так: N(P) = {w| (q0 w Z0) |-* (q, έ, έ)} где q – любое состояние. Таким образом N(P) представляет собой множество входов w, которые P может прочитать, одновременно опустошив магазин.

35. Типы и проверка типов.

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

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

Тип языковой конструкции будет описывать “выражение типа”, т.е выражение типа либо представляет собой базовый тип, либо построен с помощью применения оператора, называемого конструктором типа, к другим выражениям типа. Базовый тип является выражением типа. В базовый тип входят boolean, char, integer. Поскольку выражение типа можно именовать, имя типа является выражением типа. Конструкторы типа могут включать следующее: массивы, произведения, записи, указатели, функции.

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

{ спросить что тут ещё нужно

Спецификация простой программы проверки типов.

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

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

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

Например если возьмем выражение Lispa

( let ((x 5) (y 7) (+ x y))

x: int, y: int → (+x y): int (сумма тоже целочисленна)

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

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

Система проверки типов является дедуктивной системой. В ней аксиомы определяют правильное назначение типа примитивным элементам, а правила – сложным выражениям. А тип сложного выражения определяется исходя из типов составляющих его частей с применением соответствующего правила вывода: t1,t2,…/t, где t1,t2,… - типирование. Если типирование t1,t2,…выполняется (истинно), тогда выполняется и типирование t.

Для суммы двух целых чисел применимо следующее правило типирования:

Е├е1:Int Е├е2:Int

Е├е1+е2:Int

Все выражения программы должны иметь вывод ├е: τ для некоторого типа τ. Такие выражения называются правильно-типированные. Если для какого-то выражения тип вывести нельзя, то транслятор выдаст сообщение о несоответствии типов: type miss match.