Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Классификация грамматик по Хомскому.




 

1) Грамматика типа 0 или общего вида

φ à ψ, φ ≠ e (e – символ конца)

φ может содержать не только терминальные символы

| ώ | - длина цепочки – число символов цепочки.

| φ | < | ψ |

Могут быть правила, которые укорачивают цепочки. Эта грамматика не имеет практического использования.

2) Грамматика типа 1 или непосредственных составляющих.

       Это контекстно-зависимая грамматика и неукорачивает длину цепочки.

       ξ1 φ ξ2 à ξ1 ψ ξ2

       ξ1 ξ2 φ ψ? V*

       Грамматика контекстно-зависимая и неукорачивающая.

             G8

       Vт = {a, b, с, d}

       I

       Vn = {I, A, B}

       R = {IàaAI, AIàAA, AAAàABA, aBA à bcdA, bI à ba}

3) Грамматика типа 2 или контекстно-свободная

A? Vn, ώ? V*

             G9

       Vт = {a, b}

       I

       Vn = {I }

       R = {IàcIa, IàbIb, Iàaa, I à bb}

             I à aIa à abIba à abaIaba à ababbaba

             L(G9) = {xx1; x? Vт*}

4) Грамматика типа 3 или автоматная

a)левосторонняя

       A à a, A à Ba

b) правосторонняя

       A à a, A à aB

A, B? Vn, a? Vт

 В грамматике либо левосторонняя, либо правосторонняя.

A à aA; A à Aa – рекурсивное

Для каждой автоматной грамматики может быть построена, реализуя ей конечный автомат.

G10

Vт = {a, b}

I

Vn = {I  , A}

R = {IàaI, IàaA, AàbA, A à b}

L(G10) = {anbm, a,b? Vт, n>0, m>0 }

L0<=LI<=LII<=LIII

Язык LIII более узок, чем язык LII и так далее.

 

Примеры построения грамматик.

 

Предположим, что необходимо построить грамматику, содержащую 2 символа *, / при этом каждая цепочка начинается с одной * а заканчивается **, внутри содержит последовательность ////, разделенных *, т.е. допустимы */**, *///**, *//*/*///**

Vт = {/,*}

Vn = {A,I} A будет обозначать любую непустую последовательность наклонных

R = {I à *B**, A à A/, Aà/}

B – произвольное количество черточек, разделенное *

B à A, B à B * A (!)

Чтобы получить произвольное количество цепочек из наклонных, введем нетерминальный символ B, который означает цепочку из наклонных, разделенная *, при этом надо добавить два правила (!) и изменить первоначальное правило:

I à *B** à *B*A** à *A*A** à*A/*A** à *//*A** à*//*/**

Примеры грамматик, используемых при определении языков программирования. Терминальные слова – множество основных символов языка, нетерминальные – синтаксические понятия языка. Для описание правил языка будем использовать язык Бекуса.

Пример: <целое без знака>

<>::= <> это есть

В левой части пишется определенное понятие, в правой цепочка символов и синтаксических понятий. В правой части могут быть символы.

Пример:

<целое без знака>::=<цифра>

<цифра>::=0| 1|2 … | 9.

Vт  = {0,1,2…9}

Vn = {I,A}

I

R = {IàIA, IàA, Aà0, Aà1…Aà9}

Пример грамматика для идентификатора:

<идентификатор>::=<буква>|<идентификатор><буква>|<идентификатор><цифра>

<цифра>::=0| 1| 2…|9

<буква>::=a|b|c…|z

Vт = {0,1,2…9,a,b,…,z}

Vn = {I,B,C}

R = {IàB, IàIB, IàIc, Bàa, Bà…z, Cà0…Cà9}

Контекстно-свободные грамматики типа 2

<идентификатор>::=<буква><конец идентификатора>

<буква>::=a|b…|z

<конец идентификатора>::=<буква><идентификатор>|<цифра><идентификатор>| BK

Предполагается что идентификатор заканчивается символом BK.

Vт = {0,1…9,a,b,c…,z,BK}

Vn ={I, B, C, E}

R = {IàBE, EàBE, EàCE, EàBK, Aàa..z, Cà0..9}

пример определения десятичное число с точкой и знаком.

<десятичное число с(.)>::=+<десятичное число с (.)>|<десятичное число с (.)>|-<десятичное число с (.)>

< десятичное число с (.)>::=<целое число>, <целое число> |. <целое число>.

<целое число>::= <цифра>|<целое число><цифра>

<цифра>::=0|1…|9

Vт ={0,1…9, +, -,.}

Vn = {P, Q, N, D}

R = {Pà+Q, PàQ, Pà-Q, QàN, QàN, NàD, NàND, Dà0, Dà1…Dà9}

 

Грамматика для выполнения арифметических операций.

 

Пример грамматики, определяющей множество правил построения арифметических выражений, использующих правила сложения и умножения.

Vт = {I, X, +, (,)}

Vn ={ E }

E

R = {Eài+E;EàI;Eài*E;Eà{E}}

E=>i+E=>i+E=>i+(E)=>i+(i*E)=>i+(i*i)

Набор данных правил не обеспечивает скобки для первых операндов.

Vт = {I, X, +, (,)}

Vn ={ E }

E

R = {EàE+E;EàE*E;Eà(E);Eài}

E=>E+E=>E+E*E=>i+i*I (1244)

E=>E*E=>E*i=>E+E*i=>i+i*i(24144)

 

Для одной и той же цепочки получили два синтаксического разбора, следовательно грамматика не однозначна.

Грамматика не обеспечивает приоритет операций сложение и умножение. Чтобы обеспечить приоритеты операций мы можем операции суммирования сделать в скобках, тогда:

R = (Eà9E+E);EàE*E,Eài)

E => (E+E) => (E+(E*E)) => (i+(i*i))

E => (E*E) => ((E+E)*E) => ((i+i)*i)

Грамматика получилась неоднозначной, однако каждая операция оказалась в своей скобке.

Приоритетность операции умножить по отношению к операции сложить обеспечивается благодаря скобкам.

Vт = {I, *, +, (,)}

Vn ={ E,T, P}

E – арифметическое выражение

Т – слагаемое (или терм)

Р – произведение или сам множитель

R={EàT,EàPPàP*P,Pà(T)*P,PàP*(T)*P,PàP*P,PàI,TàT+P,TàP+T,TàP+T,TàT+T,Tài}

Нужно получить: i + i * i

8,8 i+P*P

5     i+P

12   T+P

9     T

3     E

E=>T=>T + P => либоT+(T)*P=>T+(T)*I либо i+P=>i+(I)*P=>i+(T+T)*P либо i+(T+T)*i=>i+(i+i)*I либо T+(T+T)*i=>i+(i+i)*i

Данная грамматика полностью удовлетворяет требованиям арифметической операции для умножения и суммирования, однако она не однозначна. Если в правилах в правой части существует два разных нетерминальных символа, то грамматика будет неоднозначна.

 

Соответствие конечных автоматов и автоматных грамматик.

 

Цепочка символов входного алфавита автомата называется допустимой, если в результате действий этой цепочки автомат из начального состояния переходит в конечное.

Множество допустимых цепочек автомата называется языком, который допустим данным автоматом.

Утверждение:

Для каждой автоматной грамматики может быть построен конечный автомат допускающий язык, который порождается заданной грамматикой.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...