i:=2; Шаг 3. Новый нетерминал появился только в FOLLOW2(E) |
|
FOLLOW¢2(S) = {),l} |
|
FOLLOW¢2(R) = {),l} |
|
FOLLOW¢2(T) = {R,+,–, ), l} |
|
FOLLOW¢2(F) = {R,+,–, ), l} |
|
FOLLOW¢2(E) = {F,*,/, R,+,–} |
добавили FIRST(R) = {+, – } – нет измен. |
Шаг 4. Проверка на пустые правила – новый нетерминал только для E |
|
FOLLOW¢¢2(S) = {),l} |
|
FOLLOW¢¢2(R) = {),l} |
|
FOLLOW¢¢2(T) = {R,+,–, ), l} |
|
FOLLOW¢¢2(F) = {R,+,–, ), l} |
|
FOLLOW¢¢2(E) = {F,*,/, R,+,–, ),l} |
$ (R ® l)ÎR, добавили FOLLOW¢1(R) |
Шаг 5. |
Поскольку новых нетерминалов относительно построенного ранее FOLLOW¢¢1 не появилось – множество FOLLOW3 совпадает с FOLLOW¢¢2 |
FOLLOW3(S) = {),l} |
|
FOLLOW3(R) = {),l} |
|
FOLLOW3(T) = {R,+,–, ), l} |
|
FOLLOW3(F) = {R,+,–, ), l} |
|
FOLLOW3(E) = {F,*,/, R,+,–, ),l} |
Множество FOLLOW3 отличается от FOLLOW2 только терминальными символами. Очевидно, что после выполнения ещё одной итерации согласно алгоритму получим FOLLOW4 = FOLLOW3. При выполнении 7 шага исключаются все нетерминальные символы. В итоге построенные множества сведём в одну таблицу для удобства пользования:
AÎVN |
FIRST(A) |
FOLLOW(A) |
S |
{ (, a, b } |
{ ), l} |
R |
{+, – } |
{ ), l} |
T |
{ (, a, b } |
{+, –, ), l} |
F |
{*, / } |
{+, –, ), l} |
E |
{ (, a, b } |
{*,/, +, –, ), l} |
Теперь рассмотрим для нашего примера оба варианта распознавания цепочек – с помощью таблицы М и без неё.
Начнём с построения таблицы М. Строки таблицы озаглавлены символами VÈ{l}, столбцы – символами VTÈ{l}. Построение таблицы было описано раньше; оно выполняется на основании множеств FIRST и FOLLOW и правил грамматики.
Например, для M(S,’a’): должно быть ‘a’ÎFIRST(1,b); где (S®b)ÎR(i), тогда M(S,’a’)=(b,i); при этом i=1, b = TR. Или для M(S,’)’): ‘)’ÏFIRST(1,TR); ‘)’ÎFOLLOW(1,S), но для единственного правила вывода для S (S®TR)ÎR(1) lÏFIRST(1,TR) Þ M(S,’)’)=’ошибка’. Для M(R,’)’): ‘)’ÏFIRST(1,b), где (R®b)ÎR(i) (из R может выводиться только первый терминальный + или – или l), ‘)’ÎFOLLOW(1,R), для (R®l)ÎR(4), lÎFIRST(1,b) Þ M(R,’)’)=(l,4). Остальные клетки таблицы заполняются аналогично. Ячейки таблицы, которые соответствуют ситуации «ошибка», оставлены пустыми.
a |
b |
( |
) |
+ |
– |
* |
/ |
l |
|
S |
TR,1 |
TR,1 |
TR,1 |
||||||
R |
l,4 |
+TR,2 |
–TR,3 |
l,4 |
|||||
T |
EF,5 |
EF,5 |
EF,5 |
||||||
F |
l,8 |
l,8 |
l,8 |
*EF,6 |
/EF,7 |
l,8 |
|||
E |
a,10 |
b,11 |
(S),9 |
||||||
a |
выброс |
||||||||
b |
выброс |
||||||||
( |
выброс |
||||||||
) |
выброс |
||||||||
+ |
выброс |
||||||||
– |
выброс |
||||||||
* |
выброс |
||||||||
/ |
выброс |
||||||||
l |
допуск |
Рассмотрим те же цепочки: a1= ¢a+b¢ и a2= ¢a/(a–b)¢.
Поскольку в данном автомате только одно состояние q, не будем его писать. Для построения вывода в дополнительный стек записываем номера правил. Таким образом, конфигурацию автомата на каждом шаге будем записывать в виде трёх компонент – оставшаяся непрочитанной цепочка, содержимое стека и список использованных правил.
Сначала выполним разбор с помощью таблицы, анализируя текущий символ цепочки ‘a’ и верхний символ стека ‘x’ и используя значение M(x,a). {a+b,S,[l]}Þ{a+b,TR,[1]}Þ{a+b,EFR,[1,5]}Þ{a+b,aFR,[1,5,10]} Þ (выброс) Þ {+b,FR,[1,5,10]} Þ {+b,FR,[1,5,10]} Þ {+b,R,[1,5,10,8]} Þ {+b,+TR,[1,5,10,8,2]} Þ {b,TR,[1,5,10,8,2]} Þ {b,EFR,[1,5,10,8,2,5]} Þ {b,bFR,[1,5,10,8,2,5,11]} Þ {l,FR,[1,5,10,8,2,5,11]} Þ {l,R,[1,5,10,8,2,5,11,8]} Þ {l,l,[1,5,10,8,2,5,11,8,4]}.
Теперь выполним разбор цепочек по второму варианту.
1 |
{a+b, S, l} |
aÎFIRST(TR)Þ выбираем S ® TR (1) |
2 |
{a+b, TR, [1]} |
aÎFIRST(EF) Þ выбираем T ® EF (5) |
3 |
{a+b, EFR, [1,5]} |
aÎFIRST(a) Þ выбираем E ® a (10) |
4 |
{a+b, aFR, [1,5,10]} |
«выброс» – убираем «a» |
5 |
{+b, FR, [1,5,10]} |
+ÎFOLLOW(F) Þ выбираем F ® l (8) |
6 |
{+b, R, [1,5,10,8]} |
+ÎFIRST(+TR) Þ выбираем R ® +TR (2) |
7 |
{+b, +TR, [1,5,10,8,2]} |
«выброс» – убираем «+» |
8 |
{b, TR, [1,5,10,8,2]} |
bÎFIRST(EF) Þ выбираем T ® EF (5) |
9 |
{b, EFR, [1,5,10,8,2,5]} |
bÎFIRST(b) Þ выбираем E ® b (11) |
10 |
{b, bFR, [1,5,10,8,2,5,11]} |
«выброс» – убираем «b» |
11 |
{l, FR, [1,5,10,8,2,5,11,8]} |
lÎFOLLOW(F) Þ выбираем F ® l (8) |
12 |
{l, R, [1,5,10,8,2,5,11,8,4]} |
lÎFOLLOW(R) Þ выбираем R ® l (4) |
13 |
{l, l, [1,5,10,8,2,5,11,8,4]} |
цепочка разобрана, стек пуст. |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.