- •2.1. Входная грамматика в структурированной форме
- •2.2. Су-схема и транслирующая грамматика
- •2.3. Функции переходов преобразователя
- •3.1. Грамматика лексических единиц и структура лексем
- •3.2. Диаграмма состояний лексического анализатора
- •3.3. Структуры данных и символы действия
- •4.1. Неформальное описание семантики
- •4.2. Атрибутная грамматика
- •4.3. Описание символов действия
- •4.4. Пример вывода в атрибутной грамматике.
- •5.1. Построение функций переходов атрибутного преобразователя.
- •5.2. Построение инструкций атрибутного преобразователя.
2.2. Су-схема и транслирующая грамматика
Синтаксически управляемой схемой(СУ-схемой) называется множество, состоящее из пяти объектов:T ={Va, Vтвх, Vтвых, R, <I>}, где:
Va - множество нетерминальных символов;
Vтвх - множество терминальных символов, используемых для построения входных
цепочек;
Vтвых - множество терминальных символов, используемых для построения выходных цепочек;
<I> - начальный символ; <I>Va;
R- множество правил вида <A>,; где:
<A>Va,(VaU Vтвх)*,(VaU Vтвых)* и нетерминалы, входящие в цепочкуобразуют перестановку нетерминалов цепочки.
Приведенное определение СУ-схемы не накладывает никаких ограничений на правила, кроме необходимости совпадения нетерминалов во входной и выходной частях правила. Для построения детерминированных устройств, осуществляющих перевод цепочек, используются СУ-схемы с дополнительными ограничениями на вид правил.
В данной работе СУ-схема должна быть простой.
СУ-схема Т ={Va, Vтвх, Vтвых,R, <I>} называетсяпростой, если для каждого правила <A>,изRсоответствующих друг другу вхождения нетерминалов встречаются вив одном и том же порядке.
СУ-схема:
Входные цепочки: Выходные цепочки:
<I>::=<Vars><Code> == <Vars>' '<Code>
<Bukva>::=a|b|c|d|e == a|b|c|d|e
<Zifra>::=0|1|2|3|4|5|6|7|8|9 == 0|1|2|3|4|5|6|7|8|9
<Const>::="'true'"|"'false'" == "'true'"|"'false'"
<Simvol>::="'a'"|"'b'"|"'c'"|"'d'"|"'e'" == "'a'"|"'b'"|"'c'"|"'d'"|"'e'"
<ID>::=<Bukva><R1> == <Bukva><R1>
<R1>::=<Bukva><R1> == <Bukva><R1>
<R1>::=<Zifra><R1> == <Zifra><R1>
<R1>::=$ == $
<Chislo>::=<Zifra><R2> == <Zifra><R2>
<R2>::=<Zifra><R2> == <Zifra><R2>
<R2>::=$ == $
<MasBool>::='<arr>'<ID>','<Chislo>'</arr>' == <ID>' ''bool'' '<Chislo>' ''RM'
<MasChar>::='<arr>'<ID>','<Chislo>'</arr>' == <ID>' ''char'' '<Chislo>' ''RM'
<ElMas>::='<earr>'<ID>','<Chislo>'</earr>' == <ID>' '<Chislo>' ''EM'
<Vars>::='<boolean>'<NamesBool>'</boolean>'<R3> == <NamesBool><R3>
<Vars>::='<char>'<NamesChar>'</char>'<R3> == <NamesChar><R3>
<R3>::=<Vars> == ' '<Vars>
<R3>::=$ == $
<NamesBool>::=<ID><R4> == <ID>' ''bool'<R4>
<NamesBool>::=<MasBool><R4> == <MasBool><R4>
<R4>::=','<NamesBool> == ' '<NamesBool>
<R4>::=$ == $
<NamesChar>::=<ID><R5> == <ID>' ''char'<R5>
<NamesChar>::=<MasChar><R5> == <MasChar><R5>
<R5>::=','<NamesChar> == ' '<NamesChar>
<R5>::=$ == $
<Code>::='<ass>'<Perem>','<Vyrazh>'</ass>'<R6> == <Perem>' '<Vyrazh>'='<R6>
<Perem>::=<ID>|<ElMas> == <ID>|<ElMas>
<Vyrazh>::=<Const>|<Perem>|<Operation>|<Simvol> == <Const>|<Perem>|
<Operation>|<Simvol>
<Operation>::='<and>'<Operand>','<Operand>'</and>' == <Operand>' '<Operand>'&'
<Operation>::='<or>' <Operand>','<Operand>'</or>' == <Operand>' '<Operand>'V'
<Operation>::='<not>'<Operand>'</not>' == <Operand>'!'
<Operand>::=<Operation> == <Operation>
<Operand>::=<Perem> == <Perem>
<Operand>::=<Const> == <Const>
<R6>::=<Code> == ' '<Code>
<R6>::=$ == $
Пример вывода в данной СУ-схеме.
Для примера выведем цепочку: <boolean> b1 </boolean> <ass> b1 <not> ’false’ </not> </ass>
( <I> , <I> ) (<Vars><Code> , < Vars >’ ‘<Code >)
( <boolean><NamesBool></boolean><R3><Code> , <NamesBool><R3>’ ‘<Code> )
( <boolean><ID><R4></boolean><R_3><Code> , <ID>‘ ‘‘bool’<R4><R3>’ ‘<Code> )
( <boolean>b1<R4></boolean><R3><Code> , b1‘ ‘‘bool’<R4><R3>’ ‘<Code> )
( <boolean>b1</boolean><R3><Code> , b1’ ’’bool’<R3>’ ‘<Code> )
( <boolean>b1</boolean><Code> , b1’ ’’bool’’ ‘<Code> )
( <boolean>b1</boolean><ass><Perem>’,‘<Vyrazh></ass><R6> ,
b1‘ ‘‘bool’‘ ‘<Perem>‘ ‘<Vyrazh>’=’<R6>)
( <boolean>b1</boolean><ass><ID>’,‘<Vyrazh></ass><R6> ,
b1‘ ‘‘bool’‘ ‘<ID>‘ ‘<Vyrazh>’=’<R6>)
( <boolean>b1</boolean><ass>b1’,‘<Vyrazh></ass><R6> ,
b1‘ ‘‘bool’‘ ‘b1‘ ‘<Vyrazh>’=’<R6>)
( <boolean>b1</boolean><ass>b1’,‘<Operation></ass><R6> ,
b1‘ ‘‘bool’‘ ‘b1‘ ‘<Operation>’=’<R6>)
( <boolean>b1</boolean><ass>b1’,‘<not><Operand></not></ass><R6> ,
b1‘ ‘‘bool’‘ ‘b1‘ ‘<Operand>’!’’=’<R6>)
( <boolean>b1</boolean><ass>b1’,‘<not><Const></not></ass><R6> ,
b1‘ ‘‘bool’‘ ‘b1‘ ‘<Const>’!’’=’<R6>)
( <boolean>b1</boolean><ass>b1’ ‘<not>’false’</not></ass><R6> ,
b1‘ ‘‘bool’‘ ‘b1‘ ‘’false’’!’’=’<R6>)
( <boolean>b1</boolean><ass>b1’ ‘<not>’false’</not></ass> ,
b1‘ ‘‘bool’‘ ‘b1‘ ‘’false’’!’’=’)
Основой построения СУ-схем перевода является использование двух грамматик, с помощью которых осуществляется синхронный вывод входной и выходной цепочек. Построение транслирующих грамматик предполагает применение другого подхода, который предусматривает использование одной грамматики и разрешает включение как входных, так и выходных символов в каждое правило такой грамматики.
Транслирующей грамматикой(Т-грамматикой) называется КС-грамматика, множество терминальных символов которой разбито на множество входных символов и множество выходных символов.
Транслирующая грамматика:
<I>::=<Vars># #<Code>
<Bukva>::=a#a#|b#b#|c#c#|d#d#|e#e#
<Zifra>::=0#0#|1#1#|2#2#|3#3#|4#4#|5#5#|6#6#|7#7#|8#8#|9#9#
<Const>::="'true'"#'true'#|"'false'"#'false'#
<Simvol>::="'a'"#'a'#|"'b'"#'b'#|"'c'"#'c'#|"'d'"#'d'#|"'e'"#'e'#
<ID>::=<Bukva><R1>
<R1>::=<Bukva><R1>
<R1>::=<Zifra><R1>
<R1>::=$
<Chislo>::=<Zifra><R2>
<R2>::=<Zifra><R2>
<R2>::=$
<MasBool>::='<arr>'<ID>','# ##bool## #<Chislo>'</arr>'# ##RM#
<MasChar>::='<arr>'<ID>','# ##char## #<Chislo>'</arr>'# ##RM#
<ElMas>::='<earr>'<ID>','# #<Chislo>'</earr>'# ##EM#
<Vars>::='<boolean>'<NamesBool>'</boolean>'<R3>
<Vars>::='<char>'<NamesChar>'</char>'<R3>
<R3>::=# #<Vars>
<R3>::=$
<NamesBool>::=<ID># ##bool#<R4>
<NamesBool>::=<MasBool><R4>
<R4>::=','# #<NamesBool>
<R4>::=$
<NamesChar>::=<ID># ##char#<R5>
<NamesChar>::=<MasChar><R5>
<R5>::=','# #<NamesChar>
<R5>::=$
<Code>::='<ass>'<Perem>','# #<Vyrazh>'</ass>'#=#<R6>
<Perem>::=<ID>|<ElMas>
<Vyrazh>::=<Const>|<Perem>|<Operation>|<Simvol>
<Operation>::='<and>'<Operand>','# #<Operand>'</and>'#&#
<Operation>::='<or>' <Operand>','# #<Operand>'</or>' #V#
<Operation>::='<not>'<Operand>'</not>'#!#
<Operand>::=<Operation>
<Operand>::=<Perem>
<Operand>::=<Const>
<R6>::=# #<Code>
<R6>::=$
Выходные символы в данной транслирующей грамматике заключены в # #.
Пример вывода в данной транслирующей грамматике.
Для примера выведем цепочку: <boolean> b1 </boolean> <ass> b1 <not> ’false’ </not> </ass>
<I>
<Vars># #<Code>
<boolean><NamesBool></boolean><R3># #<Code>
<boolean><ID># ##bool#<R4></boolean><R3># #<Code>
<boolean>b#b#1#1## ##bool#<R4></boolean><R3># #<Code>
<boolean>b#b#1#1## ##bool#</boolean><R3># #<Code>
<boolean>b#b#1#1## ##bool#</boolean># #<Code>
<boolean>b#b#1#1## ##bool#</boolean># #
<ass><Perem>’,’# #<Vyrazh></ass>#=#<R6>
<boolean>b#b#1#1## ##bool#</boolean># #
<ass><ID>’,’# #<Vyrazh></ass>#=#<R6>
<boolean>b#b#1#1## ##bool#</boolean># #
<ass>b#b#1#1#’,’# #<Vyrazh></ass>#=#<R6>
<boolean>b#b#1#1## ##bool#</boolean># #
<ass>b#b#1#1#’,’# #<Operation></ass>#=#<R6>
<boolean>b#b#1#1## ##bool#</boolean># #
<ass>b#b#1#1#’,’# #<not><Operand></not>#!#</ass>#=#<R6>
<boolean>b#b#1#1## ##bool#</boolean># #
<ass>b#b#1#1#’,’# #<not><Const></not>#!#</ass>#=#<R6>
<boolean>b#b#1#1## ##bool#</boolean># #
<ass>b#b#1#1#’,’# #<not>’false’#’false’#</not>#!#</ass>#=#<R6>
<boolean>b#b#1#1## ##bool#</boolean># #
<ass>b#b#1#1#’,’# #<not>’false’#’false’#</not>#!#</ass>#=#
Удалив из выведенной цепочки все выходные символы, получим входнуюцепочку –
<boolean>b1</boolean><ass>b1’,’<not>’false’</not></ass>
Удалив из выведенной цепочки все входные символы, получим выходнуюцепочку –
b1 bool b1 ’false’ ! =