Одномерный массив

Способ представления грамматики в ОП

Предшествование m,n

Предшествование более высокого порядка

E


E + T


T * F

(E)

E + T

Для этого дерева: +≐T и +⋖T; (≐E и (⋖E.

Чтобы решить проблему, введём новые правила:

E: = E1;

E1: = E1+T1|T1;

T1: = T.

Учитывая эти правила, можно нарисовать дерево:

E

|

E1

E1 + T1

|

T


T * F

|

(E)

|

E1

E1 + T1

Для этого дерева имеем следующие отношения: +≐T1 и +⋖T; (≐E и (⋖E1. Этот путь решения проблемы называется стратификация.

R, S, TÎ VN∪VT.

RS>∘ T – S является хвостом основы.(2.1 предшествование).

RS =>∘ T – T принадлежит основе. (2.1 предшествование).

R∘< ST – S является головой основы. (1.2 предшествование).

R∘<= ST – R принадлежит основе. (1.2 предшествование).

1) RS>∘ T тогда и только тогда, когда Z=>+…[R]UTx… =>+…RSTx….

Чтобы получился этот вывод, нужно: U=>+…S или U=>+…RS.

2) RS =>∘ T тогда и только тогда, когда Z=>+…yUx => yRSTx.

Чтобы получился этот вывод, нужно: U: = RST.

3) R∘< ST тогда и только тогда, когда Z=>+…RUx =>+…RSTx….

Чтобы получился этот вывод, нужно: U: = ST.

4) R∘<= ST тогда и только тогда, когда Z=>+…yUx =>…yRSTx….

Чтобы получился этот вывод, нужно: U: = RST.

Если # S1 S2 … Si Sj … Sn # – сентенциальная форма, то основа этой сентенциальной формы будет цепочка Si … Sj, если для неё выполняется условие: Si-1∘< Si Si+1= >∘ Si+2 … Sj-1Sj >∘ Sj+1.

W = xy |x| = m; |y| = n.

x ∘<y, если первый символ цепочки y является головой основы.

x >∘ y, если последний символ цепочки x является хвостом основы.

x ≗ y,, если последний символ цепочки x и первый символ цепочки y принадлежат основе.

Грамматика m,n предшествования это такая грамматика, которая удовлетворяет условиям:

1. Все правые части правил единственны.

2. Для любой пары цепочек xy таких, что |x| = m; |y| = n, выполняется не более одного из трех рассмотренных выше отношений.

EE+T|T$TT*F|F$F(E)|а#, где

$ – символ, не принадлежащий грамматике, - разделитель между правилами;

# – конец массива;

| – промежуточный мета-символ.

Построение легкое, но работать с ним неудобно.

Имеет более удобную структуру двумерный массив.

Каждая вершина – это символ из правой части и содержит 4 компоненты:

1. Имя в некоторой внутренней форме.

2. Определение: 0, если терминал; в противном случае указывает на первый символ правой части первого правила. Предположение, что рассматриваемый находится в левой.

3. Альтернатива: указывает на первый символ правой части правила, который может быть использован вместо правила, где стоит рассматриваемый символ; 0 в противном случае.

4. Приемник: указывает на символ, который следует непосредственно за рассматриваемым, а если такового нет, то 0. Рассматриваются все символы для правой части.

Е
Определение Альтернатива Приёмник

E:=E<АОП>T|T;

T:=T<МОП>F|F;

F:=(E)|а;

АОП - аддитивный оператор: <АОП>:=+|-;

МОП - мультипликативный оператор: <МОП>:=*|/.

 
а
     
)
     
E
     
(
     
F
     
/
     
*
     
F
     
<МОП>
     
Т
     
Т
     
-
     
+
     
Т
     
<АОП>
     

E
     


Этим графом пользуется машина.

В итеративной форме: E:=T{+T}.

В НФБ: E:=E+T|E-T, в итеративной форме: E:=T{+T}.

Каждый нетерминальный выглядит как Е:

1) имя в некоторой внутренней форме;

2)

Для правой части
определение;

3) альтернатива Т;

4) приёмник F;

5) каждому нетерминальному символу ставится в соответствие вершина графа, указывая на (первый символ), правую часть правила.

E
     
<АОП> *
     
Т **
     


E:={<АОП>T}.

Для повторения АОП введём символ *- начало, **- конец цепочки.

G(z).

E:=E+T|T.

T:=T*F|F.

F:=(E)|а.

E
   
T
   
F
   
(E)
   
E+T

E
T
T
F
*
1)
E
2)

3.3.7. Предшествование более высокого порядка

Рассмотрим следующее дерево:

E
T
F
(E)
*
E
T
+
E+T


Для этого дерева существует следующие неоднозначности: +≐T и +⋖T; (≐E и (⋖E.

Для простого предшествования это не пригодно, поэтому для нашего случая необходимо ввести символ, чтобы Т не совпадали, то есть введем стратификацию.

Для решения проблемы введём новые правила:

1. E: = E1;

2. E1: = E1+T1|T1;

3. T1: = T.

Теперь, учитывая эти новые правила, можно нарисовать следующее дерево:

E1


F
*
Т
T
+
T1
E

(E)

E1


E1+T

В итоге для этого дерева имеем следующие отношения:

­ +≐T1 и +⋖T;

­ (≐E и (⋖E1.

Для первого дерева без замены Т и ввода новых правил получим

E+T*F;

+⋖T*;

(⋖E+.

Для того чтобы отличать предшествование 2.1 от операторного, внесём символ «∘» за знак <. Пусть у нас есть три символа R, S, T, которые принадлежат словарю алфавита.

Этот путь решения проблемы называется стратификация.

RS>∘ T – S является хвостом основы.(2.1 предшествование).

RS =>∘ T – T принадлежит основе. (2.1 предшествование).

R∘<ST – S является головой основы. (1.2 предшествование).

R∘<= ST – R принадлежит основе. (1.2 предшествование).

R, S, TÎ VN∪VT.

Выводы к определениям:

1) RS>∘T тогда и только тогда, когда имеется вывод Z=>+…[R]UTx…=> =>+…RSTx…

Для этого необходимы следующие выводы: U=>+…S или U=>+…RS.

2) RS =>∘T тогда и только тогда, когда Z=>+…[R]Ux =>...RSTx.

Чтобы получился этот вывод, нужно: U: = ST.

3) R∘< ST тогда и только тогда, когда Z=>+…RUТx =>+…RSTx….

Чтобы получился этот вывод, нужно: U: = S.

4) R∘<= ST тогда и только тогда, когда Z=>+…UТx =>…RSTx….

Чтобы получился этот вывод, нужно: U: = RS.

Если цепочка # S1 S2 … Si Sj … Sn # – сентенциальная форма, то основа этой сентенциальной формы будет цепочка Si … Sj, если для неё выполняется условие

Si-1∘< Si Si+1=>∘ Si+2 … Sj-1Sj >∘ Sj+1.

=>∘ этот символ означает, что мы ищем хвост основы.

∘<= этот символ означает, что ищем голову основы.

Si … Sj –основа.

# ∘<S # -условие, когда заканчивается поиск.

Может быть ситуация:

# Sj >∘ Sj+1 #;

# ∘<SiSj #;

# ∘<S #.

Если найден хвост, то можно просмотреть правила и сравнить правые части.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: