Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
tyapr_answers.doc
Скачиваний:
11
Добавлен:
16.04.2019
Размер:
495.1 Кб
Скачать
  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*+, представляющая постфиксную запись заданной входной цепочки.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]