Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Формальные языки и грамматики.doc
Скачиваний:
161
Добавлен:
01.05.2014
Размер:
1.51 Mб
Скачать

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

   Покажем теперь, как по заданной СУ - схеме можно построить детерминированный преобразователь. В начале по заданной СУ - схеме построим транслирующую грамматику Г. Это всегда можно   сделать, поскольку заданная СУ - схема должна быть простой. Если входная грамматика заданной СУ - схемы относится к классу 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.3.5. Пример построения преобразователя.

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

 Г 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*+, представляющая постфиксную запись заданной входной цепочки.

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