Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Ll(k)-грамматика




Алгоритм построения множества FIRST

Условия использования метода рекурсивного спуска.

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

Более точно это условие можно формализовать путем определения множества FIRST.

Определение. Для КС-грамматики G и цепочки w, состоящей из терминальных и нетерминальных символов, определим множество FIRSTk(w) следующим образом:

FIRSTk (w) = {x | w =>* xv, |x| = k или w =>* x, |x| < k}

где k – натуральное число.

Иными словами, множество FIRSTk(w) состоит из всех терминальных префиксов длины k терминальных цепочек, выводимых из w.

Например, рассмотрим грамматику, порождающую подмножество типов языка Pascal.

type → simple

type → ^id

type → array [simple] of type

simple → integer

simple → char

simple → num.. num

Для этой грамматики имеем:

FIRST1(simple) = {integer, char, num}

FIRST1(^id) = {^}

FIRST1(array [simple] of type) = {array}

 

Если цепочка w состоит только из терминалов, то FIRSTk(w) – это первые k символов цепочки w, если |w| ≥ k, или это – сама цепочка w, если |w| < k.

1. Определение множества FIRST для всех символов грамматики:

· если X – терминал, то FIRST (X) = X;

· для правила X→ε добавим ε к множеству FIRST (X);

· если X – нетерминал и X → Y1Y2 … Yk – правило грамматики, то добавить терминал а в FIRST (X), если для некоторого i этот терминал a принадлежит FIRST (Yi) и ε принадлежит всем множествам FIRST (Y1), …, FIRST (Yi-1), то есть Y1, …, Yi-1 =>*ε; если ε принадлежит FIRST (Yj) для всех j =1, 2, …, k, то добавить ε в FIRST (Y).

2. Формулировка алгоритма построения множества FIRST(w):

· вход – КС-грамматика G=(N, T, P, S) и цепочка w терминальных и нетерминальных символов;

· выходFIRST (w);

· метод – добавим в FIRST (X1X2…Xk) все непустые символы из FIRST (X1); затем, если ε принадлежит FIRST (X1), то добавим все непустые символы из FIRST (X2), и так далее; если для всех j FIRST (Xj) содержит пустой символ, то добавим ε в множество FIRST (X1X2…Xk).

Рассмотрим грамматику с правилами:

S → B A

A → +B A

A → ε

B → D C

C → * D C

C → ε

D → (S)

D → a

Для этой грамматики множества FIRST определяются следующим образом:

FIRST (D) = {(, a},

FIRST (C) = {*, ε },

FIRST (B) = FIRST (D),

FIRST (A)={+, ε },

FIRST (S) = {(, a}

Грамматика G = (VT, VN, P, S) называется LL(k)-грамматикой, если для любых двух левых выводов

S =>* wAv => wuv =>* wx

S =>* wAv => wu1v =>* wy

для которых FIRSTk (x) = FIRSTk (y) верно, что u=u1.

То есть, если для данной цепочки wAv, состоящей из терминальных и нетерминальных символов и k первых символов (если они есть), выводящихся из Av, существует не более одного правила, которое можно применить к A, чтобы получить вывод какой-нибудь терминальной цепочки, начинающейся с w и продолжающейся упомянутыми k терминалами.

Рассмотрим грамматику с правилами:

S → aAS

S → b

A → a

A → bSA

и два вывода

S =>* wSv => wuv =>* wx

S =>* wSv => wu1v =>* wy

Пусть цепочки x и y начинаются с a. Это означает, что в выводе участвовало правило S→aAS. Следовательно, u = u1 = aAS.

 

 

Пусть цепочки x и y начинаются с b. Это означает, что в выводе участвовало правило S→b. Следовательно, u = u1 = b.

Для выводов

S =>* wAv => wuv =>* wx

S =>* wAv => wu1v =>* wy

рассуждение аналогично. Таким образом, грамматика обладает свойством LL(1).

Для LL(1) -грамматик может быть построен анализатор методом рекурсивного спуска без возвратов.




Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 893; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.