ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 25.06.2024
Просмотров: 89
Скачиваний: 0
Символ |
else |
<state> |
|
<string> |
a |
<expr> |
else |
• > |
• > |
> |
• > |
|
• > |
а |
> |
> |
•> |
• > |
> |
Ш |
if |
< • |
< |
= |
|
> |
|
|
|
|
|
|
|
|
<string> |
< • |
< • |
= |
|
• > |
|
<state> |
< • |
III |
< • |
< • |
II |
|
|
|
< • |
|
|
|
|
<expr> |
|
|
|
|
|
|
• > e= I { область };
=e II { область };
<• e III { область }.
Вобоих случаях в матрицах не имеют места два вида отноше
ний предшествия для любой пары (т. е. нет клетки с символами
• ^ > И |
или <[• и _ L . |
|
Если |
такие порождения |
не определяются ни одним из правил |
грамматики, то грамматику |
называют простой грамматикой пред |
|
шествия. |
|
|
2.8.4. Метод Наура
Основная идея разбора заключается в следующем: фраза обра батывается терминал за терминалом в одном направлении — слева направо (канонический метод разбора). Для каждого очередного терминала формируется определенное синтаксическое состояние, т. е. предсказывается, какая конструкция может следовать в дан ной фразе за этим терминалом. Если следующий терминал удовлет
воряет этому состоянию, анализ продолжается, |
в противном слу |
|
чае— прекращается. Поскольку терминал |
может предсказывать |
|
много разных конструкций, то образуется |
много |
вариантов анали |
за, причем в случае синтаксически однозначной фразы анализ дово дится до конца только по одному варианту. В результате анализа фразы составляется система синтаксических состояний, одно из ко торых помечает границу последнего терминала, входящего в опре деленную языковую конструкцию (границу конструкции можно оп ределить с помощью скобок).
Логику действия грамматического разбора можно описать таб лицей (табл. 2), которая включает: 1) основную строку, где поме щены основные символы (терминалы) языка; 2) основной столбец, где перечисляются синтаксические состояния. Столбец является спе цифической особенностью данного метода — его можно изобразить:
140
а) либо в общей таблице, где сначала записываются синтаксиче ские состояния, и на пересечении с определенным терминалом за писан текущий номер состояния; б) либо рассматривать как две синтаксические таблицы, одна из. которых по данному синтаксиче скому состоянию определяет «начало», а другая «конец» возмож ных конструкций; 3) как рабочую зону, в которой записываются но мера новых состояний, полученных из комбинации: элемент столбца «состояние» — элемент строки «терминал».
|
|
|
|
|
Т а б л и ц а |
2 |
|
|
Входная |
строка; а5е615 : = ; |
|
|
|
|
|
|
Символы |
|
|
|
п/п |
|
|
± |
Буква |
Цифра |
|
|
Состояние |
-— |
|
|
|
|
1 |
После |
; |
1 |
2 |
3 |
|
2 |
После |
буквы |
|
|
3 |
|
3 |
Идентификатор |
|
2 |
3 |
4 |
|
4 |
Левая |
часть |
|
|
|
|
Поскольку содержимое основной строки и основного столбца в процессе разбора не меняется, то терминалы и синтаксические со стояния используются как справочники.
В отличие от них рабочая зона (называемая еще накопитель синтаксических состояний)—это место, где происходит переработ ка всех промежуточных результатов. Ее можно сравнить и рассмат ривать как неограниченное число стэков. В каждом стэке ввод осу ществляется по одному терминалу и только с одного конца зоны. Так что терминал, введенный в стэк последним, вынимается из не го первым.
Изложенная идея синтаксического анализа методом Наура име ет некоторое сходство с принципом работы машины Тьюринга с тремя лентами.
Вкратце изложим этот принцип. Машина Тьюринга имеет три ленты, ограниченные слева и неограниченные справа: а) входная — на ней расположен словарь языка (основные символы); б) рабо
чая — содержит |
набор |
синтаксических состояний; в) |
выходная — |
содержит набор |
левых |
и правых скобок, помеченных |
терминалами |
типов конструкций, и три головки (по одной на каждой ленте).
На каждом шаге машина работает только на одной ленте, вы полняя одно изследующих действий:
1) на входной ленте читается символ за символом, сдвигая го ловку на одну ячейку вправо;
2) на рабочей ленте либо пишется символ и головка сдвигает ся на одну ячейку вправо, либо на одну ячейку влево и стирается записанный в ней символ, но после такого действия всегда влево от головки остаются непустые ячейки, а вправо — пустые;
3) на выходной ленте только записываются символы, и головка сдвигается на одну ячейку вправо.
141
Работа машины начинается при пустых рабочей и выходной лен тах. Непустой остается только входная лента, содержащая основ ные символы языка. Головки всех лент при этом находятся в край не левом положении.
Машина заканчивает свою работу, если головка входной ленты дошла до пустой ячейки, а рабочая лента в этот момент пуста.
Отличие метода Наура от принципа работы машины Тьюринга заключается в следующем:
1)состояния, которые могут встретиться в процессе граммати ческого разбора, были явно перечислены, т. е. помещение синтакси ческих состояний в стэк всегда непосредственно обусловливается прочтением очередного терминала на рабочую ленту;
2)в машине Тьюринга разрешается писать на рабочей ленте за один шаг только один символ, тогда как при грамматическом раз боре иногда читается сразу несколько символов (терминалов).
Синтаксические состояния Наур рассматривает как эквивалент ные, при этом каждое состояние характеризуется своим номером. Текущий номер должен давать описание ситуации достаточное для того, чтобы полностью определить действия при выборе следующе го терминала на входе, включая определение нового текущего со стояния.
Каждый шаг анализа состоит в обработке одного терминала. При этом выполняется: проверка, может ли данный терминал на чинать предсказанную синтаксическую конструкцию. Это делается путем сравнения номера терминала с рабочим состоянием >в стэке, т. е. ищется соответствующая пара «терминал-состояние» в общей таблице (если представлены две таблицы в таблице «начало»). Ес ли ответ отрицательный, продолжение анализа невозможно. Если ответ положительный, то эта конструкция определена и дальше можно делать одно из двух:
а) в предположении, что начатая конструкция продолжается, выбирается любое другое синтаксическое состояние из состояния рабочего терминала, и помещается в верхнюю часть стэка, после чего осуществляется переход к следующему шагу (т. е. к следую щему терминалу);
б) в предположении, что начатая конструкция заканчивается этим рабочим терминалом, в общей таблице отыскивается соответ ствующее состояние и тем самым проверяется, может ли данный терминал заканчивать эту конструкцию. Если нет, продолжение анализа невозможно, если да, то это означает конец конструкции, и соответствующее состояние убирается из стэка. Эту операцию можно повторить любое количество раз в зависимости от началь ных вариантов.
Далее следует переход к очередному шагу анализа. Анализ счи тается законченным, а результат его правильным, если после обра ботки последнего терминала фразы стэк оказывается простым.
В некоторых вариантах возможна ситуация, когда на некото ром шаге не оказывается ни одного допустимого продолжения, а обработка фразы еще не окончена. Это означает, что либо анали-
142
зируемая фраза синтаксически неправильна, либо, если она пра вильна, на одном из предыдущих шагов было выбрано «нежела тельное» продолжение, что завело в тупик. Таким образом, пра вильность варианта анализа сигнализируется достижением конца фразы, неправильность — невозможностью дойти до конца фразы.
Все рассмотренные методы грамматического разбора (синтак сического анализа) зависят от конкретных особенностей языков.
Была высказана идея построения универсальных алгоритмов синтаксического анализа и контроля не зависящих от конкретных
особенностей языков, а на их основе — построение |
универсальных |
так называемых синтаксических трансляторов. |
|
Один из вариантов универсального алгоритма |
синтаксического |
анализа и контроля ТС-М (ориентированного на класс алгоритми ческих языков, задаваемых рекурсивно полными грамматиками) разработан в Академии наук Молдавской ССР и реализован на ЭВМ «Минск-22».
Упражнения:
1. Организовать грамматический разбор приведенных ниже тер минальных цепочек, если грамматики, порождающие языки, заданы схемами правил Р.
а) |
терминальные цепочки: AED, |
ADE, |
|
|
|
||||
|
P={S-+AB, |
В -> CD, |
B-+DC, |
С - • £ ) ; |
|
|
|||
б) терминальные цепочки: ССВ, ССССВ, |
ССССССВ, |
|
|||||||
|
|
P = {S-+A, |
А^В, |
|
А^СА}; |
|
|
||
в) терминальные цепочки: СВС, ССВСС, |
ССССВСССС, |
|
|||||||
|
|
Р = { 5 - > Л , |
А-+В, |
А->САС\; |
|
|
|||
г) терминальные цепочки: xzzy, yyzxx, |
ух, |
xzzzzy, |
|
|
|||||
|
|
Р = {А-*хВ, |
В^у, |
B^zB); |
|
|
|||
д) терминальные цепочки: хххххху, хххху, |
ххххху, |
xxxz, |
xxxxxz, |
||||||
xxxxxxz, ххуху, |
|
|
|
|
|
|
|
|
|
Р={А-*Ву, |
А —> Сг, |
В^х, |
В->Вх, |
С->х, С -> хС); |
|||||
е) терминальные цепочки: |
wxyz, |
wxyu, wxxyz, xwuy, uxyz, |
|||||||
P= |
[C^Bz, |
C^wD, |
B^ |
Ay, |
A —> wx, D^xE, |
E-> |
yu\; |
||
ж) |
терминальные цепочки: |
(xx, |
(((x, |
(((x |
{xx(x{xx, |
(((x(xx |
|||
(x(xx((xx((xx, |
(((xx((xx((xx((xx, |
|
|
|
|
|
|||
P={T-+PB, |
/> - »(, B-+xx,.B-*xT, |
B^Tx, |
B~>TT}. |
||||||
2. Определить, имеют ли смысл терминальные цепочки |
|
||||||||
|
|
(((хх((хх |
((хх[х,(хх, |
|
({{хх(х(х({х |
|
|
||
в языке, порождаемом КС-грамматикой |
со схемой правил |
вывода |
|||||||
Р={Т->РВ, |
Р->(, |
В->хх, В^хТ, |
В^Тх, |
В^ТТ). |
методом Эйкеля, Паула, Бауэра, Замелзона.
143
3. Используя метод грамматического разбора Эйкеля, Паула, Бауэра и Замелзона, проконтролировать грамматическую правиль ность следующих терминальных цепочек, определяя способ чтения цепочки в процессе построения алгоритма:
а) ххху, хххг при
|
Р = { Л ^ В г / , |
A~>Cz, |
|
В - > * , |
В^Вх, |
С->х, |
С -> хС}; |
|
|||||||||
б) xxzy, |
xzzzzy |
при |
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
р={А-+хВ, |
|
В~*у, |
B^zB); |
|
|
|
|
|||||
в) |
(х-х |
+ х |
+ |
х)-х-х-(х), |
|
X + х + X + X, |
х-х |
+ |
(х |
+ (х |
+ |
х)) • |
|||||
•х + х |
при |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Р= |
|
{Е->Т, Е->Т |
+ Е, |
T->F, |
T~^F .Т, |
F-*x, |
|
|
|
F^{E)}. |
|||||||
4. |
Организовать |
грамматический |
разбор |
цепочек |
любым |
воз |
|||||||||||
можным методом: |
|
|
|
|
|
|
|
|
|
|
|
|
|||||
а) - 1 < н а ч а л о > |
|
< н а ч а л о > " |
J. |
|
|
|
|
|
|
||||||||
|
L'x'xx1"!. |
|
|
|
|
при |
|
|
|
|
|
|
|
|
|||
Р = |
{<целая |
|
строка> |
: : = J_ < с т р о к а > ± < с т р о к а > |
: : = |
||||||||||||
= < н а ч а л о > ' |
|
< н а ч а л о > : : = '| < н а ч а л о > х\ < н а ч а л о > |
|
||||||||||||||
< с т р о к а > } ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
б) х : = х + х-х |
|
при |
|
|
|
|
|
|
|
|
' |
- |
|||||
Р = [S: |
:=х:=Е,Е: |
|
|
: = |
Т\Е + Т,Т: |
: = |
F\T |
• F,F: |
: = |
|
|||||||
в) |
начало D; D; D; S конец, |
|
|
|
|
|
|
|
|
||||||||
|
начало D; D; D; S; S конец при |
|
|
|
|
|
|
|
|||||||||
Р = |
{П : : = |
начало D; S |
конец |
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
Ог: : = D | Dx ; D |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
S11 |
* = S | S^) |
s |
|
|
|
|
|
|
||
5. Реализовать алгоритм синтаксического контроля следующих |
|||||||||||||||||
предложений: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
а) А X В + С; |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
б) А + В X C — D; |
|
|
|
|
|
|
|
|
|
|
|
||||||
в) А X В + С — D; |
|
|
|
|
|
|
|
|
|
|
|
||||||
г) Л X (В + C ) / D f £ ; |
|
|
|
|
|
|
|
|
|
|
|||||||
д) Л + В — С X |
|
D/F\F\ |
|
|
|
|
|
|
|
|
|
|
|||||
е) |
((А X В + С) |
X D + Е) |
X F + G; |
|
|
|
|
|
|
||||||||
ж) |
Л + |
(В + |
( С + |
(Я + (Е |
+ |
F)))); |
|
|
|
|
|
|
если схема правил вывода P2G — грамматики, порождающей приве- , денные выше предложения, имеет вид:
Р = {<выражение> : : = < т е р м > | < в ы р а ж е н и е > + + < т е р м > | < в ы р а ж е н и е > — < т е р м >
< т е р м > : : = <множитель> | < т е р м > X < м н о ж и т е л ь > / < т е р м > / < м н о ж и т е л ь > ,
144