
3 Построение дерева вывода
3.1 Исходные данные
Для построения синтаксического анализатора будем использовать анализатор на основе грамматик операторного предшествования. Этот анализатор является линейным распознавателем (время анализа линейно зависит от длины входной цепочки), для него существует простой и эффективный алгоритм построения распознавателя на основе матрицы предшествования.
Для построения синтаксического анализатора используется язык, задан-ный с помощью КС-грамматики:
G({for, do, <, >, =, a, :=, (, ), ;}, {S, F, T, E}, P, S) с правилами P:
S → F;
F → for (T) do F│a:=a
T → F;E;F│;E;F│F;E;│;E;
E → a<a│ a>a│ a=a
3.2 Построение синтаксического анализатора
Множества крайних левых и крайних правых символов L(U), R(U) относительно всех нетерминальных символов грамматики представлены в таблице 2. В таблице 3 описаны итоговые множества крайних левых и крайних правых символов L(U), R(U) относительно всех нетерминальных символов грамматики.
Таблица 2
U |
L(U) |
R(U) |
S |
F |
; |
F |
for, a |
F, a |
T |
F, ; |
F, E, ; |
E |
a |
A |
Таблица 3
U |
L(U) |
R(U) |
S |
F, for, a |
;, F, a |
F |
for, a |
F, a |
T |
F, for, a |
F, E, a |
E |
a |
a |
Множества крайних левых и крайних правых терминальных символов Lt(U), Rt(U) относительно всех нетерминальных символов грамматики и итоговые множества крайних левых и крайних правых терминальных символов Lt(U), Rt(U) относительно всех нетерминальных символов грамматики представлены соответственно в таблицах 4 и 5.
Таблица 4
U |
Lt(U) |
Rt(U) |
S |
; |
; |
F |
for, a |
do, a |
T |
; |
; |
E |
<, >, = |
<, >, = |
Таблица 5
U |
Lt(U) |
Rt(U) |
S |
;, for, a, <, >, = |
;, do, a, <, >, = |
F |
for, a, <, >, = |
do, a, <, >, = |
T |
;, for, a, <, >, = |
;, do, a, <, >, = |
E |
a |
a |
Матрица операторного предшествования показана в таблице 6
Таблица 6 – Матрица операторного предшествования
|
; 1 |
for 2 |
do 3 |
< 4 |
> 5 |
a 6 |
= 7 |
:= 8 |
( 9 |
) 10 |
┴к |
; |
= |
< |
|
< |
< |
< |
< |
|
> |
|
> |
for |
|
|
|
|
|
|
|
|
= |
|
|
do |
> |
< |
|
< |
< |
< |
= |
|
> |
|
> |
< |
> |
|
|
|
|
= |
|
|
> |
|
> |
> |
> |
|
|
|
|
= |
|
|
> |
|
> |
a |
> |
|
|
= |
= |
|
= |
= |
> |
|
> |
= |
> |
|
|
|
|
= |
|
|
> |
|
> |
:= |
|
|
|
|
|
= |
|
|
|
|
|
( |
< |
< |
|
< |
< |
< |
< |
|
|
= |
|
) |
|
|
= |
|
|
|
|
|
|
|
|
┴н |
< |
< |
|
< |
< |
< |
< |
|
|
|
|
Остовная грамматика, полученная на основе исходной грамматики выглядит следующим образом:
G’({for, do, <, >, =, a, :=, (, ), ;}, {E}, P, S)
E → E;
E → for (E) do E│a:=a
E → E;E;E│;E;E│E;E;│;E;
E → a<a│ a>a│ a=a