Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпаргалки по ТЯПу.doc
Скачиваний:
58
Добавлен:
01.05.2014
Размер:
498.18 Кб
Скачать
  1. Построение нисходящего преобразователя.

Построение преобразователя.

Покажем теперь, как по заданной СУ - схеме можно построить детерминированный преобразователь. В начале по заданной СУ - схеме построим транслирующую грамматику Г. Это всегда можно сделать, поскольку заданная СУ - схема должна быть простой. Если входная грамматика заданной СУ - схемы относится к классу LL(1) -грамматик, то и входная грамматика транслирующей грамматики также должна относиться к этому классу, поскольку при построении Т - грамматики входные правила изменениям не подвергались. Учитывая, что искомый преобразователь должен в процессе формирования выхода осуществлять и распознавание входной цепочки, будем его строить по правилам транслирующей грамматики, используя правила построения распознавателя.Такой преобразователь должен воспроизводить левый вывод входной цепочки в магазине и удалять терминальные символы, на ходящиеся в вершине, при совпадении их с очередным символом на входной ленте. Однако при этом в магазин будут записываться выходные символы, содержащиеся в правилах Т - грамматики, и возникнут неопределенные ситуации при появлении выходного символа в вершине магазина. Чтобы исключить такие ситуации, дополним этот правила построения преобразователя следующим правилом: при появлении выходного символа в вершине магазина он должен передаваться на выход независимо от того, какой символ находится под входной головкой.Построение функции переходов МП (1) для всех правил вида<A> --> b, где bVтвх и(VтвхU VтвыхU Va)*, строим команды:( s0, b, A)=( s0, ', $ ), где' - зеркальное отображение цепочки. (2) Для всех правил вида<A> --> <B>, где BVa и(VтвхU VтвыхU Va)*, строим команды:*( s0, u, A ) = ( s0, B , $ ),где uВЫБОР(<A> --> <B>вх) ивх- цепочка, полученная изпутем удаления из нее всех выходных символов. . (3) Для всех правил вида<A> --> $строим команды: *( s0, u, A ) = ( s0, $, $ ),гдеuВЫБОР(<A> --> $). (4) Для всех символов b, принадлежащих, Vтвх , стоящих на первом месте в правой части правил транслирующей грамматики, т.е. символов,заносимых в магазин, строим правило: ( s0, b, b ) = ( s0, $, $ ).(5) Для всех выходных символов {u}, таких что uVтвыхU {$}, строим команды: *( s0, z, {u} ) = ( s0, $, {u} ),где zVтвх. Точнее команды строятся для сочетаний {u}z, таких что z может следовать за {u} в цепочках, выводимых в за данной грамматике. (6) Заключительное правило строим так: ( s0, $, h0 ) = ( s0, $, $ ).

Пример построения преобразователя. Применение правил построения команд преобразователя рассмотрим на примере транслирующей грамматики Г, которая описывает перевод инфиксных выражений, состоящих из идентификаторов и знаков + и *, в постфиксные польские выражения. Эта грамматика имеет следующую схему:Г 4. 2:R = {<E>+<E><E>{+}, <E>x<E><E>{x}, <E>a{a}}

Используя правило построения команд преобразователя (1) для правил грамматики, начинающихся входным терминальным символом, получаем команды преобразователя Мп1: q(s0, +, <E>) = (s0, {+}<E><E>, $),q(s0, *, <E>) = (s0, {*}<E><E>, $),q(s0, a, <E>) = (s0, {a},$)

Правила построения команд вида (2),(3),(4) к заданной грамматике неприменимы, поэтому с помощью правил вида (5) построим команды, обеспечивающие передачу выходных символов на выход. Эти команды имеют вид: q*(s0, +, {+}) = (s0, $, +), q*(s0, *, {+}) = (s0, $, +), q*(s0, a, {+}) = (s0, $, +), q*(s0, $', {+}) = (s0, $, +), q*(s0, *, {*}) = (s0, $, *), q*(s0, +, {*}) = (s0, $, *), q*(s0, *,{a}) = (s0, $, *), q*(s0, $',{*}) = (s0, $, *), q*(s0, a,{a}) = (s0, $, a), q*(s0, +{a}) = (s0, $, a), q*(s0, *,{a}) = (s0, $, a), q*(s0, $', {a}) = (s0, $, a)

Для перехода в заключительное состояние s1в соответствии с правилом (6) построим команду:

q(s0,$',h0) = (s1,$,$) Чтобы посмотреть как работает построенный преобразователь, рассмотрим построение выходной цепочки для входа +a*aa. Последовательность конфигураций, получаемых с помощью команд преобразователя имеет вид: (s0,+a*aa,h0E,$) |-- (s0,a*aah0{+}EE, $) |-- (s0,*aa,h0{+}T{a},$) |-- (s0,*aa,h0{+}E,a) |-- (s0,aa,h0{+}{*}T{a},a) |-- (s0,a,h0{+}{*}E,aa) |-- (s0,$,h0{+}{*}{a},aa) |-- (s0,$,h0{+}{*},aaa) |-- (s0,$,h0{+},aaa*)|-- (s0,$,h0,aaa*+) |-- (s0,$,$,aaa*+).

Результатом работы преобразователяявляется выходная цепочка aaa*+, представляющая постфиксную запись заданной входной цепочки.

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