Распознаватели КС-языков

Содержание

Слайд 2

Системное программное обеспечение Тема № 13 Распознаватели КС-языков

Системное программное обеспечение

Тема № 13

Распознаватели КС-языков

Слайд 3

Системное программное обеспечение Распознаватели КС-языков Распознавателями КС-языков являются односторонние недетерминированные автоматы

Системное программное обеспечение

Распознаватели КС-языков

Распознавателями КС-языков являются односторонние недетерминированные автоматы с магазинной

(стековой) памятью – МП-автоматы.

R(Q, V, Z, δ, q0, z0, F),

где Q – множество состояний автомата;

V – алфавит входных символов автомата;

– функция переходов автомата, которая отображает множество Q×(V∪{λ})×Z на конечное множество подмножеств P(Q×Z*);

q0 – начальное состояние автомата Q, q0∈Q;

F – множество конечных состояний
автомата, F⊆Q.

Z – специальный конечный алфавит магазинных символов автомата (обычно включает в себя алфавиты терминальных и нетерминальных символов грамматики), V⊆Z;

z0∈Z – начальный символ магазина;

Слайд 4

Системное программное обеспечение Распознаватели КС-языков Конфигурация МП-автомата на каждом шаге работы

Системное программное обеспечение

Распознаватели КС-языков

Конфигурация МП-автомата на каждом шаге работы определяется в

виде:

(q, α, ω),

где q – текущее состояние автомата, q∈Q;

α – цепочка еще непрочитанных символов на входе автомата, α∈V*;

ω – содержимое магазина, ω∈Z*.

можно указать пару (β, n),
где β∈V* – вся цепочка входных символов,
n∈N∪{0}, n>0 –положение считывающего
указателя в цепочке

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

Допускаются λ-переходы (λ-такты), при которых входной символ игнорируется (он будет входным символом при следующем переходе).

Автомат не обязательно должен извлекать символ из магазина (при z=λ этого не происходит).

Слайд 5

Системное программное обеспечение Распознаватели КС-языков МП-автомат является недетерминированным, если из одной

Системное программное обеспечение

Распознаватели КС-языков

МП-автомат является недетерминированным, если из одной и той

же его конфигурации возможен более чем один переход.

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

Не для каждого МП-автомата можно
построить эквивалентный ему
детерминированный МП-автомат

Начальная конфигурация МП-автомата: (q0, α, z0), α∈V*;
множество конечных конфигураций – (q, λ, ω), q∈F, ω∈Z*.

МП-автомат допускает (принимает) цепочку символов, если, получив эту цепочку на вход, он может перейти в одну из конечных конфигураций (при окончании цепочки автомат находится в одном из конечных состояний, а стек содержит некоторую определенную цепочку) – тогда входная цепочка принимается (после окончания цепочки автомат может сделать произвольное количество λ-переходов), иначе цепочка символов не принимается.

Слайд 6

Системное программное обеспечение Распознаватели КС-языков МП-автомат допускает цепочку символов с опустошением

Системное программное обеспечение

Распознаватели КС-языков

МП-автомат допускает цепочку символов с опустошением магазина, если

при окончании разбора цепочки автомат находится в одном из конечных состояний, а стек пуст – конфигурация (q, λ, λ), q∈F
обозначается: Lλ(R).

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

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

Слайд 7

Системное программное обеспечение Распознаватели КС-языков Распознаватели КС-языков с возвратом Это самый

Системное программное обеспечение

Распознаватели КС-языков

Распознаватели КС-языков с возвратом

Это самый примитивный тип распознавателей

КС-языков (логика работы основана на моделировании недетерминированного МП-автомата).

два варианта реализации:

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

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

Слайд 8

Системное программное обеспечение Распознаватели КС-языков Распознаватели КС-языков с возвратом алгоритм моделирования

Системное программное обеспечение

Распознаватели КС-языков

Распознаватели КС-языков с возвратом

алгоритм моделирования МП-автомата должен

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

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

Слайд 9

Системное программное обеспечение Распознаватели КС-языков Несмотря на то, что МП-автомат является

Системное программное обеспечение

Распознаватели КС-языков

Несмотря на то, что МП-автомат является односторонним распознавателем,

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

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

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

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

Слайд 10

Системное программное обеспечение Распознаватели КС-языков Принцип работы нисходящего распознавателя с подбором

Системное программное обеспечение

Распознаватели КС-языков

Принцип работы нисходящего распознавателя с подбором альтернатив

Данный распознаватель

моделирует работу МП-автомата с одним состоянием
q: R({q}, V, Z, δ, q, S,{q}),
распознающим цепочки КС-языка, заданного КС-грамматикой G(VT, VN, P, S) – V=VT, Z=VT∪VN.

Начальная конфигурация: (q, α, S) – автомат пребывает в своем единственном состоянии q, считывающая головка находится в начале входной цепочки символов α∈VT*, в стеке лежит символ, соответствующий целевому символу грамматики S.

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

Функция переходов МП-автомата строится на основе правил грамматики:
(q, α)∈δ(q, λ, A), A∈VN, α∈(VT∪VN)*, если A→α ∈Р грамматики G;
(q, λ)∈δ(q, a, a) ∀a∈VT.

Слайд 11

Системное программное обеспечение Распознаватели КС-языков Принцип работы нисходящего распознавателя с подбором

Системное программное обеспечение

Распознаватели КС-языков

Принцип работы нисходящего распознавателя с подбором альтернатив

Работа автомата

описана с использованием псевдокодов:

если на верхушке стека автомата находится символ А∈VN

то А можно заменить на цепочку символов α (если в грамматике языка есть правило A→α) и СГ не сдвигается – этот шаг работы называется «подбор альтернативы»

всеесли

если на верхушке стека находится символ а∈VТ: а=тек_сим_вх_цеп

то а можно выбросить из стека и передвинуть СГ→1 – этот шаг работы называется «выброс».

всеесли

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

Данный МП-автомат может быть недетерминированным, поскольку при подборе альтернативы в грамматике языка может оказаться более одного правила вида A→α, следовательно, тогда функция δ(q, λ, A) будет содержать более одного следующего состояния – у автомата будет несколько альтернатив.

Слайд 12

Системное программное обеспечение Распознаватели КС-языков Принцип работы нисходящего распознавателя с подбором

Системное программное обеспечение

Распознаватели КС-языков

Принцип работы нисходящего распознавателя с подбором альтернатив

Данный МП-автомат

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

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

Преимущества данного алгоритма:

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

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

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

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

Символ A∈VN в КС-грамматике G(VT, VN, P, S)
называется рекурсивным, если для него существует
цепочка вывода вида А⇒+αАβ, где α, β∈(VT∪VN)*:
если α=λ и β≠λ, то рекурсия называется левой, а грамматика G – леворекурсивной;
если α≠λ и β=λ, то рекурсия называется правой, а грамматика G – праворекурсивной;
если α=λ и β=λ, то рекурсия представляет собой цикл.

Слайд 13

Системное программное обеспечение Распознаватели КС-языков Принцип работы восходящего распознавателя по алгоритму

Системное программное обеспечение

Распознаватели КС-языков

Принцип работы восходящего распознавателя по алгоритму «сдвиг-свертка»

Данный распознаватель

моделирует работу расширенного МП-автомата с одним состоянием
q: R({q}, V, Z, δ, q, S,{q}),
распознающим цепочки КС-языка, заданного КС-грамматикой G(VT, VN, P, S) – V=VT, Z=VT∪VN.

Начальная конфигурация: (q, α, λ) – автомат пребывает в своем единственном состоянии q, считывающая головка находится в начале входной цепочки символов α∈VT*, стек пуст.

Конечная конфигурация: (q, λ, S) – автомат пребывает в своем единственном состоянии q, считывающая головка находится за концом входной цепочки символов, в стеке лежит символ, соответствующий целевому символу грамматики S.

Функция переходов МП-автомата строится на основе правил грамматики:
(q, А)∈δ(q, λ, γ), A∈VN, γ∈(VT∪VN)*, если A→γ ∈Р грамматики G;
(q, a)∈δ(q, a, λ) ∀a∈VT.

Слайд 14

Системное программное обеспечение Распознаватели КС-языков Принцип работы восходящего распознавателя по алгоритму

Системное программное обеспечение

Распознаватели КС-языков

Принцип работы восходящего распознавателя по алгоритму «сдвиг-свертка»

Работа автомата

описана с использованием псевдокодов:

если на верхушке стека автомата находится цепочка символов γ

то γ можно заменить на А∈VN (если в грамматике языка есть правило A→γ) и СГ не сдвигается – этот шаг работы называется «свертка»

всеесли

если СГ обозревает тек_сим_вх_цеп а∈VТ

то а можно поместить в стек и передвинуть СГ→1 – этот шаг работы называется «сдвиг» или «перенос».

всеесли

На каждом шаге работы автомата необходимо решать:
что необходимо выполнять: сдвиг или свертку;
если выполнять свертку, то какую цепочку γ
выбрать для поиска правил
(цепочка γ должна встречаться в правой части правил грамматики);
какое правило выбрать для свертки, если окажется,
что существует несколько правил вида А→γ
(несколько правил с одинаковой правой частью).
Чтобы промоделировать работу этого
расширенного МП-автомата, надо на каждом шаге
запоминать все предпринятые действия, чтобы
иметь возможность вернуться к уже сделанному шагу
и выполнить эти же действия по-другому.
Этот процесс должен повторяться до тех пор,
пока не будут перебраны все возможные варианты.

Слайд 15

Системное программное обеспечение Распознаватели КС-языков Принцип работы восходящего распознавателя по алгоритму

Системное программное обеспечение

Распознаватели КС-языков

Принцип работы восходящего распознавателя по алгоритму «сдвиг-свертка»

Данный расширенный

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

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

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

Преимущества данного алгоритма:

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

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

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

Слайд 16

Системное программное обеспечение Распознаватели КС-языков Табличные распознаватели для КС-языков Табличные распознаватели

Системное программное обеспечение

Распознаватели КС-языков

Табличные распознаватели для КС-языков

Табличные распознаватели получают на вход

цепочку входных символов α=а1a2…an, α∈VT*, |α|=n, построение вывода основывают на правилах заданной КС-грамматики G(VT, VN, P, S).

Принцип работы заключается в следующем:
искомая цепочка вывода строится не сразу – сначала на основе входной цепочки порождается некоторое промежуточное хранилище информации объема n*n (промежуточная таблица), а потом уже на его основе строится вывод.

Табличные алгоритмы обладают полиномиальными характеристиками требуемых вычислительных ресурсов в зависимости от длины входной цепочки.
Для произвольной КС-грамматики G(VT, VN, P, S) время выполнения алгоритма имеет кубическую зависимость от длины входной цепочки символов, а необходимый объем памяти – квадратичную зависимость от длины входной цепочки символов (она напрямую связана с использованием промежуточного хранилища данных).

Слайд 17

Системное программное обеспечение Распознаватели КС-языков Табличные распознаватели для КС-языков универсальны –

Системное программное обеспечение

Распознаватели КС-языков

Табличные распознаватели для КС-языков

универсальны – они могут

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

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

Слайд 18

Системное программное обеспечение Распознаватели КС-языков Табличные распознаватели для КС-языков Для построения

Системное программное обеспечение

Распознаватели КС-языков

Табличные распознаватели для КС-языков

Для построения вывода могут использоваться:

алгоритм Кока-Янгера-Касами;

алгоритм Эрли.

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

Слайд 19

Системное программное обеспечение Распознаватели КС-языков Распознаватели КС-языков без возвратов Универсальные распознаватели

Системное программное обеспечение

Распознаватели КС-языков

Распознаватели КС-языков без возвратов

Универсальные распознаватели для КС-языков (позволяющие

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

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

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

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

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

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

Слайд 20

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

Системное программное обеспечение

Распознаватели КС-языков

Существуют два принципиально разных класса распознавателей без возвратов,

читающих входную цепочку символов слева направо.

Распознаватели КС-языков без возвратов

Нисходящие распознаватели – порождают цепочки левостороннего вывода и строят дерево вывода сверху вниз – используют модификации алгоритма с подбором альтернатив и при их создании применяются методы, которые позволяют однозначно выбрать одну и только одну альтернативу на каждом шаге работы МП-автомата (шаг «выброс» в этом автомате всегда выполняется однозначно);

К этому классу относятся:

распознаватель на основе метода рекурсивного спуска;

распознаватель на основе LL(k)-грамматики;

распознаватель на основе LL(1)-грамматики.

КС-грамматика обладает свойством LL(k), k>0,
если на каждом шаге вывода для однозначного выбора
очередной альтернативы МП-автомату достаточно знать
символ на верхушке стека и рассмотреть первые k символов
от текущего положения считывающей головки
во входной цепочке символов.
LL – left – цепочка читается слева направо,
left – вывод левосторонний

Слайд 21

Системное программное обеспечение Распознаватели КС-языков Распознаватели КС-языков без возвратов Восходящие распознаватели

Системное программное обеспечение

Распознаватели КС-языков

Распознаватели КС-языков без возвратов

Восходящие распознаватели – порождают цепочки

правостороннего вывода и строят дерево вывода снизу вверх – используют модификации алгоритма «сдвиг-свертка» и при их создании применяются методы, которые позволяют однозначно выбрать между выполнением «сдвига» («переноса») или «свертки» на каждом шаге работы расширенного МП-автомата, а при выполнении свертки однозначно выбрать правило, по которому будет производиться свертка.

К этому классу относятся:

распознаватель на основе LR(k)-грамматики;

распознаватель на основе LR(0)-грамматики;

распознаватель на основе LR(1)-грамматики;

распознаватель на основе грамматик предшествования.

КС-грамматика обладает свойством LR(k), k≥0,
если на каждом шаге вывода для однозначного
решения вопроса о выполняемом действии в алгоритме
«сдвиг-свертка» расширенному МП-автомату достаточно
знать содержимое верхней части стека и
рассмотреть первые k символов от текущего
положения считывающей головки во входной цепочке символов.
LR – left – цепочка читается слева направо,
right – вывод правосторонний

Слайд 22

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования Принцип

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Принцип организации такого распознавателя

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

В процессе анализа входной цепочки расширенный МП-автомат сравнивает текущий символ входной цепочки с одним из символов, находящихся на верхушке стека, проверяя, какое из возможных отношений предшествования существует между ними, и в зависимости от найденного отношения выполняется либо сдвиг (перенос), либо свертка, а при отсутствии его – алгоритм сигнализирует об ошибке.

Слайд 23

Системное программное обеспечение Распознаватели КС-языков Существуют следующие виды грамматик (различающихся по

Системное программное обеспечение

Распознаватели КС-языков

Существуют следующие виды грамматик (различающихся по тому, какие

отношения предшествования в них определены и между какими символами (терминальными или нетерминальными) могут быть установлены эти отношения):

Распознаватель на основе грамматик предшествования

простого предшествования;

расширенного предшествования;

слабого предшествования;

смешанной стратегии предшествования;

операторного предшествования.

Слайд 24

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования Грамматика

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Грамматика простого предшествования –

это такая приведенная КС-грамматика G(VT, VN, P, S), V=VT∪VN в которой:

для каждой упорядоченной пары терминальных и нетерминальных символов выполняется не более чем одно из трех отношений предшествования:

Fi=.Fj
(∀Fi, Fj∈V), если и только если ∃ правило A→xFiFjy∈P, где A∈VN, x, y∈V*;

Fi<.Fj
(∀Fi, Fj∈V), если и только если ∃ правило A→xFiDy∈P и вывод D⇒*Fjz,
где A, D∈VN, x, y, z∈V*;

Fi.>Fj
(∀Fi, Fj∈V), если и только если ∃ правило A→xCFjy∈P и вывод C⇒*zFi,
или ∃ правило A→xCDy∈P и выводы C⇒*zFi и D⇒*Fjw, где A, C, D∈VN,
x, y, z, w∈V*;

различные порождающие правила имеют разные правые части.

Слайд 25

Системное программное обеспечение Распознаватели КС-языков Отношения предшествования для символов обозначаются =⋅,

Системное программное обеспечение

Распознаватели КС-языков

Отношения предшествования для символов обозначаются =⋅, <⋅, ⋅>.


Распознаватель на основе грамматик предшествования

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

Отношения предшествования зависят от порядка, в котором стоят символы, например, если Fi.>Fj, то не обязательно, что Fi<.Fj.
(поэтому знаки предшествования иногда помечают специальной точкой)

Слайд 26

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования Метод

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Метод предшествования основан на

том факте, что отношения предшествования между двумя соседними символами распознаваемой строки соответствуют трем следующим вариантам:

Fi=.Fi+1,
если символы Fi и Fi+1 принадлежат одной основе – «составляют основу»;

Fi<.Fi+1,
если символ Fi+1 есть крайний левый символ некоторой основы –
«предшествует основе»;

Fi.>Fi+1,
если символ Fi есть крайний правый символ некоторой основы – «следует за основой».

Исходя из этих соотношений, выполняется разбор строки для грамматики предшествования.

Слайд 27

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования Матрица

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Матрица предшествования

первые (левые) символы

вторые

(правые) символы

знак отношений

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

множество крайних левых и множество крайних правых символов относительно нетерминальных символов грамматики, которые определяются как:

L(А)={Х| ∃ А⇒*Хz}, А∈VN, Х∈V, z∈V* – множество крайних левых символов относительно нетерминального символа А (цепочка z может быть и пустой цепочкой);

R(А)={Х| ∃ А⇒*zХ}, А∈VN, Х∈V, z∈V* – множество крайних правых символов относительно нетерминального символа А.

Fi=.Fj (∀Fi, Fj∈V), если ∃ правило A→xFiFjy∈P, где A∈VN, x, y∈V*;

Fi<.Fj (∀Fi, Fj∈V), если ∃ правило A→xFiDy∈P и Fj∈L(D), где A, D∈VN, x, y∈V*;

Fi.>Fj (∀Fi, Fj∈V), если ∃ правило A→xCFjy∈P и Fi∈R(C)
или ∃ правило A→xCDy∈P и Fi∈R(C), Fj∈L(D), где A, C, D∈VN, x, y∈V.

Слайд 28

Системное программное обеспечение Распознаватели КС-языков После построения множеств L(А) и R(А)

Системное программное обеспечение

Распознаватели КС-языков

После построения множеств L(А) и R(А) по правилам

грамматики создается матрица предшествования, которая дополняется символами ⊥н и ⊥к :

Распознаватель на основе грамматик предшествования

⊥н<.Х, ∀ Х∈V, если ∃ S⇒*Хy, где S∈VN, y∈V* или если Х ∈L(S);

⊥к.>Х, ∀ Х∈V, если ∃ S ⇒*yХ, где S∈VN, y∈V* или если Х ∈R(S).

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

Слайд 29

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования Схема

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Схема алгоритма распознавания
для

грамматики простого предшествования

Данный алгоритм выполняется расширенным МП-автоматом с одним состоянием.
Отношения предшествования служат для того, чтобы определить в процессе выполнения алгоритма, какое действие – сдвиг или свертка – должно выполняться на данном шаге и однозначно выбрать правило при свертке (обеспечивается за счет различия правых частей всех правил грамматики).

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

Слайд 30

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования Грамматики

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Грамматики простого предшествования являются

удобным механизмом для анализа входных цепочек КС-языка, но они имеют
недостатки:

не всякий детерминированный КС-язык может быть задан грамматикой простого предшествования, и поэтому не для каждого детерминированного КС-языка можно построить распознаватель по методу простого предшествования;

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

Слайд 31

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования Операторная

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Операторная грамматика – такая

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

Грамматика операторного предшествования это операторная КС-грамматика G(VT, VN, P, S), V=VT∪VN, в которой:

для каждой упорядоченной пары терминальных символов выполняется не более чем одно из трех отношений предшествования:

a=.b, если и только если ∃ правило А→xaby∈P
или правило А→xaCby, где a, b∈VT, А, C∈VN, x, y∈V*;

a<.b, если и только если ∃ правило A→xaCy∈P и вывод C⇒*bz
или вывод C⇒*Dbz, где a, b∈VT, A, C, D∈VN, x, y, z∈V*;

a.>b, если и только если ∃ правило A→xCby∈P и вывод C⇒*za
или вывод C⇒*zaD, где a, b∈VT, A, C, D∈VN, x, y, z∈V*;

различные порождающие правила имеют разные правые части.

Слайд 32

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования Матрица

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Матрица предшествования

первые (левые) терминальные

символы

вторые (правые) терминальные символы

знак отношений

Для построения матрицы предшествования вводятся множества:

множество крайних левых и множество крайних правых терминальных символов относительно нетерминальных символов грамматики, которые определяются как:

Lt(А)= {t | ∃ А⇒*tz или ∃ А⇒*Ctz},
где t∈VT, А, C∈VN, z∈V*;

Rt(А)= {t | ∃ А⇒*zt или ∃ А⇒* ztC},
где t∈VT, А, C∈VN, z∈V*.

a=.b, если ∃ правило А→xaby∈P или правило А→xaCby, где a, b∈VT, А, C∈VN, x, y∈V*;

a<.b, если ∃ правило А→xaCy∈P и b∈Lt(C), где a, b∈VT, А, C∈VN, x, y∈V*;

a.>b, если ∃ правило А→xCby∈P и a∈ Rt(C), где a, b∈VT, А, C∈VN, x, y∈V*.

Предварительно необходимо выполнить построение множеств L(А) и R(А).

Слайд 33

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования Для

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Для практического использования матрицу

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

⊥н<.a, ∀ a∈VT, если ∃ S⇒*ax или ∃ S⇒*Cax, где S, C∈VN, x∈V*
или если a∈Lt(S);

⊥к.>a, ∀ a∈VT, если ∃ S⇒*xa или ∃ S⇒*xaC, где S, C∈VN, x∈V*
или если a∈Rt(S).

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

Слайд 34

Выполнение алгоритма может быть прервано, если на одном из его шагов

Выполнение алгоритма может быть прервано, если на одном из его шагов

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

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Схема алгоритма распознавания
для грамматики операторного предшествования

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

Слайд 35

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования Пример:

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Пример: задана грамматика операторного

предшествования для арифметических выражений над символами a и b:
G({+, -, /, *, a, b, “(“, “)”}, {S, T, E}, P, S):
P:
S→S+T1|S-T2|T3
T→T*E4|T/E5|E6
E→(S)7|a8|b9

Далее строятся множества крайних левых и крайних правых символов L(А), R(А) относительно всех нетерминальных символов грамматики.

S

T

E

S

T

E

, E

(, a, b

, a

, T

T

(

)

T, E, (, a, b

, a

, b

, b

), a, b

E, ), a, b

S, T, E

T, E

(, a, b

), a, b

T, E, (, a, b

E, ), a, b

S, T, E , (, a, b

T, E, ), a, b

Слайд 36

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования На

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

На основе полученных множеств,

строятся множества крайних левых и крайних правых терминальных символов Lt(А), Rt(А) относительно всех нетерминальных символов грамматики.

P:
S→S+T1|S-T2|T3
T→T*E4|T/E5|E6
E→(S)7|a8|b9

+

+

*

*

, -

+ , -, *, /, (, a, b

(

, /

, a

)

, -

, /

, a

, b

, b

+ , -, *, /, ), a, b

*, /, (, a, b

*, /, ), a, b

(, a, b

), a, b

Слайд 37

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования P:

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

P:
S→S+T1|S-T2|T3
T→T*E4|T/E5|E6
E→(S)7|a8|b9

Матрица операторного предшествования

крайние правые

терминальные символы

крайние левые терминальные символы

<.

<.

<.

<.

<.

.>

.>

.>

.>

.>

.>

.>

=.

<.

<.

<.

<.

<.

<.

<.

.>

.>

.>

.>

.>

.>

.>

Слайд 38

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования Алгоритм

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Алгоритм разбора цепочек грамматики

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

P:
F→F+F 1|F-F 2|F 3
F→F*F 4|F/F 5|F 6
F→(F)7|a8|b9

P:
F→F+F 1|F-F 2
F→F*F 3|F/F 4
F→(F)5|a6|b7

F→F

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

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

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

Слайд 39

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования По

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

По результатам остовного вывода

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

При распознавании исходной цепочки символов последовательность разбора будем записывать в виде последовательности конфигураций расширенного МП-автомата из следующих элементов:

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

содержимое стека;

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

Такт автомата обозначен символом ÷:
если на данном такте выполняется сдвиг (перенос) – ÷сд, если свертка – ÷св.

Слайд 40

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования Входная

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Входная цепочка: a-b/a.

Матрица предшествования

{a-b/a⊥к;

⊥н; ∅}÷

сд

крайние правые терминальные символы (вх.цепочка)

крайние левые терминальные символы (стек)

{-b/a⊥к; ⊥нa; ∅}÷


{-b/a⊥к; ⊥нF; 6}÷

сд

{b/a⊥к; ⊥нF-; 6}÷

сд

{/a⊥к; ⊥нF-b; 6}÷


{/a⊥к; ⊥нF-F; 6, 7}÷

сд

{a⊥к; ⊥нF-F/; 6, 7}÷

сд

{⊥к; ⊥нF-F/a; 6, 7}÷

св

{⊥к; ⊥нF-F/F; 6, 7, 6}÷

св

{⊥к; ⊥нF-F; 6, 7, 6, 4}÷

св

{⊥к; ⊥нF; 6, 7, 6, 4, 2}

– разбор закончен, цепочка принята.

Цепочка вывода (правосторонний вывод):
F⇒2F-F⇒4 F-F/F⇒ 6 F-F/a⇒ 7 F-b/a⇒ 6 a-b/a.

Слайд 41

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования Цепочка

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Цепочка вывода (правосторонний вывод):
F⇒2F-F⇒4

F-F/F⇒ 6 F-F/a⇒ 7 F-b/a⇒ 6 a-b/a.
Слайд 42

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования Матрица

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Матрица предшествования

крайние правые терминальные

символы (вх.цепочка)

крайние левые терминальные символы (стек)

Входная цепочка: (a-b)/a.

{(a-b)/a⊥к; ⊥н; ∅}÷

сд

{a-b)/a⊥к; ⊥н(; ∅}÷

сд

{-b)/a⊥к; ⊥н(a; ∅}÷

св

{-b)/a⊥к; ⊥н(F; 6}÷

сд

{b)/a⊥к; ⊥н(F-; 6}÷

сд

{)/a⊥к; ⊥н(F-b; 6}÷

св

{)/a⊥к; ⊥н(F-F; 6, 7}÷

св

{)/a⊥к; ⊥н(F; 6, 7, 2}÷

сд

{/a⊥к; ⊥н(F); 6, 7, 2}÷

св

{/a⊥к; ⊥нF; 6, 7, 2, 5}÷

сд

{a⊥к; ⊥нF/; 6, 7, 2, 5}÷

сд

{⊥к; ⊥нF/a; 6, 7, 2, 5}÷

св

{⊥к; ⊥нF/F; 6, 7, 2, 5, 6}÷

св

{⊥к; ⊥нF; 6, 7, 2, 5, 6, 4}

– разбор закончен, цепочка принята.

Цепочка вывода (правосторонний вывод):
F⇒4F/F⇒6F/a⇒5(F)/a⇒2(F-F)/a⇒7(F-b)/a⇒6(a-b)/a.

Слайд 43

Системное программное обеспечение Распознаватели КС-языков Распознаватель на основе грамматик предшествования Распознаватель

Системное программное обеспечение

Распознаватели КС-языков

Распознаватель на основе грамматик предшествования

Распознаватель на основе грамматик

предшествования

Матрица предшествования

крайние правые терминальные символы (вх.цепочка)

крайние левые терминальные символы (стек)

Входная цепочка: a-b/.

{ a-b/⊥к; ⊥н; ∅}÷

сд

{-b/⊥к; ⊥нa; ∅}÷


{-b/⊥к; ⊥нF; 6}÷

сд

{b/⊥к; ⊥нF-; 6}÷

сд

{/⊥к; ⊥нF-b; 6}÷


{/⊥к; ⊥нF-F; 6, 7}÷

сд

{⊥к; ⊥нF-F/; 6, 7}÷


Ошибка! – нет правила для выполнения свертки на этом такте.

Слайд 44

Системное программное обеспечение Распознаватели КС-языков Свойства КС-языков Произвольные КС-языки замкнуты относительно

Системное программное обеспечение

Распознаватели КС-языков

Свойства КС-языков

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

подстановки;


объединения;

конкатенации;

итерации;

гомоморфизма (изменения имен символов).

Произвольные КС-языки не замкнуты относительно операций:

пересечения;

дополнения.

Детерминированные КС-языки (КС-языки, цепочки которых можно распознавать с помощью детерминированных МП-автоматов) замкнуты относительно операции:

дополнения.

Детерминированные КС-языки не замкнуты относительно операций:

объединения;

пересечения.

Слайд 45

Системное программное обеспечение Распознаватели КС-языков Свойства КС-языков Часто правила КС-грамматик можно

Системное программное обеспечение

Распознаватели КС-языков

Свойства КС-языков

Часто правила КС-грамматик можно и нужно преобразовать

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

Выделяются две основные цели преобразований КС-грамматик:

упрощение правил грамматики;

облегчение создания распознавателя языка.

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

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

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

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

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