- •Транслирующая грамматика
- •C) Функии переходов преобразователя и пример его работы
- •Пример работы преобразователя
- •Лексический анализатор
- •A) Грамматика лексических единиц и структура лексем
- •B) Матрица переходов лексического анализатора
- •D) Структура программы лексического анализатора и пример его работы
- •C) Описание символов действия
- •D) Атрибутная грамматика в окончательном виде
- •E) Вывод в атрибутной грамматике
- •B) Построение инструкций а-преобразвателя
- •C) Фрагмент работы а-преобразователя
- •Заключение
C) Описание символов действия
{new_cell} выделяет новую ячейку в таблице переменных,
first2 не связывая ее с каким-либо именем
last2
cell
{make_lbl} генерирует уникальные имена для меток
lbl
{new_INT} выделяет новую ячейку в таблице переменных,
first1 связывая ее с идентификатором типа INT
last1
name
{new_FLOAT} выделяет новую ячейку в таблице переменных,
first1 связывая ее с идентификатором типа FLOAT
last1
name
{#(LABEL)#} cоздает атом-метку с заданным именем
beg_lbl
{#(JMP_UP)#} создает атом-команду безусловного перехода
beg_lbl1 на вышеопределенную метку с заданным именем
{#(JMP_DOWN)#} создает атом-команду безусловного перехода
end_lbl1 на нижеописанную метку с заданным именем
{#(JMP_DOWN_FALSE)#} создает атом-команду условного перехода
end_lbl1 на нижеописанную метку с заданным именем
cond при нуле в заданной ячейке
{#(<)#} создает атом-команду '<'
1op1
2op
dest
{#(>)#} создает атом-команду '>'
1op1
2op
dest
{#(=)#} создает атом-команду присвоить содержимое
source источника приемнику
dest
{#(*)#} создает атом-команду '*'
1op1
2op
dest
{#(+)#} создает атом-команду '+'
1op1
2op
dest
D) Атрибутная грамматика в окончательном виде
<PROGRAM>::="main()"' { '<MAIN_BLOCK>'}' ¦
first #key #razd first1 #razd ¦first1=first
last last1 ¦last=last1
<MAIN_BLOCK>::=$ ¦
first ¦first=last
last ¦
<MAIN_BLOCK>::=<DEF_VAR>
first first1 ¦first1=first
last last1 ¦last=last1
<DEF_VAR>::=<VAR> <CONTINUE> ¦first1=first
first first1 first2 ¦first2=last1
last last1 last2 ¦last=last2
<CONTINUE>::=<BLOCK>
first first1 ¦first1=first
last last1 ¦last=last1
<CONTINUE>::=$
first ¦first=last
last ¦
<BLOCK>::= '{' <BODY> '}'
first #razd first1 #razd ¦first1=first
last last1 ¦last=last1
<BODY>::=<START> <CONT_BODY> ¦first1=first
first first1 first2 ¦first2=last1
last last1 last2 ¦last=last2
<START>::=<EQUATION> ‘;’
first first1 #razd ¦first1=first
last last1 ¦last=last1
<START>::=<FOR>
first first1 ¦first1=first
last last1 ¦last=last1
< CONT_BODY >::=$
first ¦first=last
last ¦
< CONT_BODY >::=<BODY>
first first1 ¦first1=first
last last1 ¦last=last1
//описание циклов и их условий
<FOR>::={make_lbl} <HEAD> <BLOCK>{#(JMP_UP)#}{#(LABEL)#} ‘;’
first lbl first1 first2 beg_lbl1 end_lbl1 #razd
last last1 last2
beg_lbl
end_lbl
(beg_lbl1,beg_lbl)=lbl first1=first end_lbl1=end_lbl
first2=last1
last=last2
<HEAD>::= 'for ( ' <EQUATION> <CONT_HEAD> ¦ first1=first
first #key first1 first2 ¦ first2=last1
last last1 last2 ¦ last=last2
beg_lbl beg_lbl1 ¦ beg_lbl1=beg_lbl
end_lbl end_lbl1 ¦ end_lbl=end_lbl1
<CONT_HEAD>::= ‘;’ {#(LABEL)#} <CONDITION2>{make_lbl} {#(JMP_DOWN_FALSE)#}
first #razd beg_lbl1 first1 lbl end_lbl1
last last1 cond
beg_lbl rslt
end_lbl
<CCONT_HEAD> (continued)
first2
last2
(end_lbl1 , end_lbl )=lbl first1=first cond=rslt beg_lbl1=beg_lbl
first2=last1
last=last2
<CCONT_HEAD>::= ‘;’ <CONDITION3> ‘ )’ ¦first1=first
first #razd first1 #razd ¦last=last1
last last1
<CONDITION2>::= <IDENTIFICATOR> <CONT_COND2>
first #ID first1 ¦first1=first
last last1 ¦last=last1
rslt 1op ¦1op=#ID
rslt1 ¦rslt=rslt1
<CONT_COND2>::= ‘>’ <CONSTANT>{new_cell}{#(>)#} ¦first1=first
first #op #CONST first1 1op1 ¦ last=last1
last last1 2op ¦1op1=1op
1op cell dest ¦2op=#CONST
rslt ¦dest=cell
¦rslt=cell
<CONT_COND2>::= ‘<’ <CONSTANT>{new_cell}{#(<)#} ¦first1=first
first #op #CONST first1 1op1 ¦ last=last1
last last1 2op ¦1op1=1op
1op cell dest ¦2op=#CONST
rslt ¦dest=cell
¦rslt=cell
<CONDITION3>::= <EQUATION> ‘;’ ¦first1=first
first first1 #razd ¦last=last1
last last1
//описание присвоения и арифметических выражений
<EQUATION>::=<IDENTIFICATOR> ‘=’ <R_EQUATION>{#(=)#} ¦first1=first
first #ID #OP first1 source ¦source=rslt
last last1 dest ¦dest=#ID
rslt ¦last=last1
<R_EQUATION>::= <IDENTIFICATOR> <CONT_R_EQUATION> ¦first1=first
first #ID first1 ¦1op=#ID
last last1 ¦last=last1
rslt 1op ¦rslt=rslt1
rslt1 ¦
<R_EQUATION>::= <CONSTANT> < CONT_R_EQUATION > ¦first1=first
first #CONST first1 ¦1op=#CONST
last last1 ¦last=last1
rslt 1op ¦rslt=rslt1
rslt1 ¦
< CONT_R_EQUATION >::=$ ¦
first ¦last=first
last ¦rslt=1op
1op ¦
rslt ¦
< CONT_R_EQUATION >::= ‘+’ <R_EQUATION>{ new_cell}{#(+)#} ¦first1=first
first #OP first1 first2 1op1 ¦first2=last1
last last1 last2 2op ¦1op1=1op
1op rslt1 cell dest ¦2op=rslt1
rslt ¦dest=cell
¦rslt=cell
¦last=last2
< CONT_R_EQUATION >::= ‘*’ <R_EQUATION>{ new_cell}{#(*)#} ¦first1=first
first #OP first1 first2 1op1 ¦first2=last1
last last1 last2 2op ¦1op1=1op
1op rslt1 cell dest ¦2op=rslt1
rslt ¦dest=cell
¦rslt=cell
¦last=last2
//описание блока объявления переменных
<VAR>::=<DEFINE_CONSTANT> <CONT_VAR> ¦first1=first
first first1 first2 ¦first2=last1
last last1 last2 ¦last=last2
<CONT_VAR>::=<VAR>
first first1 ¦first1=first
last last1 ¦last=last1
<CONT_VAR>::=$
first ¦last=first
last ¦
<DEFINE_CONSTANT >::="int " <LIST_IDENT_I> ‘;’
first #KEY first1 #razd ¦first1=first
last last1 ¦last=last1
<DEFINE_CONSTANT >::="float " <LIST_IDENT_F> ‘;’
first #KEY first1 #razd ¦first1=first
last last1 ¦last=last1
//списки объявляемых переменных определенного типа
<LIST_IDENT_I>::=<IDENTIFICATOR>{new_INT}<C_L_I_I> ¦first1=first
first #NAME first1 first2 ¦name=#NAME
last last1 last2 ¦first2=last1
name ¦last=last2
<C_L_I_I>::=$ ¦
first ¦last=first
last ¦
< C_L_I_I >::= ‘,’ < LIST_IDENT_I > ¦
first #RAZD first1 ¦first1=first
last last1 ¦last=last1
<LIST_IDENT_F>::=<IDENTIFICATOR>{new_FLOAT}<C_L_I_F> ¦first1=first
first #NAME first1 first2 ¦name=#NAME
last last1 last2 ¦first2=last1
name ¦last=last2
<C_L_I_F>::=$ ¦
first ¦last=first
last ¦
< C_L_I_F >::= ‘,’ < LIST_IDENT_F > ¦
first #RAZD first1 ¦first1=first
last last1 ¦last=last1