0650e59fe77f2a6024da2ef1ad193e5e.ppt
- Количество слайдов: 60
LL(k)- и LR(k)-грамматики 1
LL(k)-грамматики 2 Расшифровка названия: L – входная цепочка разбирается слева направо; L – используется левосторонний вывод; k – варианты порождающего правила выбираются с помощью предварительного просмотра k символов входной цепочки (k ≥ 1). Проверка корректности грамматики типа LL(1) осуществляется анализом множеств направляющих символов T. Если у альтернатив какого-либо правила множества T пересекаются, то грамматика не является LL(1)-грамматикой.
LL(k)-грамматики 3 Пример 1: Правило Множество T FIXED SIGN MANT {+, –, . , 0 -9} SIGN + {+} SIGN – {–} SIGN e {. , 0 -9} MANT . NUM {. } MANT NUM FRACT {0 -9} NUM 0 -9 NUM 2 {0 -9} NUM 2 NUM {0 -9} NUM 2 e {. , } FRACT . NUM 2 {. } FRACT e { }
LL(k)-грамматики 4 Пример 2: Правило Множество T FIXED SIGN MANT {+, –, . , 0 -9} SIGN + {+} SIGN – {–} SIGN e {. , 0 -9} MANT . NUM {. } MANT NUM {0 -9} MANT NUM {0 -9} NUM 0 -9 NUM 2 {0 -9} NUM 2 NUM {0 -9} NUM 2 e {. , }
5 Пример 3. Проверим, является ли правильной цепочка +12. 5 Используем левосторонний вывод: FIXED SIGN MANT + MANT + NUM FRACT +1 NUM 2 FRACT FIXED SIGN MANT SIGN + | – | e MANT . NUM | NUM FRACT NUM 0 -9 NUM 2 NUM | e FRACT . NUM 2 | e
6 Пример 3. Проверим, является ли правильной цепочка +12. 5 Используем левосторонний вывод: FIXED SIGN MANT + MANT + NUM FRACT +1 NUM 2 FRACT Продолжение вывода невозможно без построения таблицы разбора! FIXED SIGN MANT SIGN + | – | e MANT . NUM | NUM FRACT NUM 0 -9 NUM 2 NUM | e FRACT . NUM 2 | e
7 Пример 3. Проверим, является ли правильной цепочка +12. 5 Используем левосторонний вывод: FIXED SIGN MANT + MANT + NUM FRACT +1 NUM 2 FRACT +1 NUM FRACT +12 FRACT +12. NUM 2 +12. 5 FIXED SIGN MANT SIGN + | – | e MANT . NUM | NUM FRACT NUM 0 -9 NUM 2 NUM | e FRACT . NUM 2 | e
LR(k)-грамматики 8 Расшифровка названия: L – входная цепочка разбирается слева направо; R – используется правосторонний вывод; k – варианты порождающего правила выбираются с помощью предварительного просмотра k символов входной цепочки (k ≥ 0). Проверка корректности грамматики типа LR(0) и LR(1) осуществляется при заполнении таблицы разбора по наличию LR-конфликтов.
LR(k)-грамматики 9 Пример. Проверим, является ли правильной цепочка +12. 5 Для начала преобразуем грамматику из предыдущего примера к виду LR. Для этого используем алгоритм устранения e-правил: FIXED SIGN MANT SIGN + | – | e MANT . NUM | NUM FRACT NUM 0 -9 NUM 2 NUM | e FRACT . NUM 2 | e
LR(k)-грамматики 10 Пример. Проверим, является ли правильной цепочка +12. 5 Для начала преобразуем грамматику из предыдущего примера к виду LR. Для этого используем алгоритм устранения e-правил: FIXED SIGN MANT | MANT SIGN + | – MANT . NUM | NUM FRACT NUM 0 -9 NUM 2 NUM | e FRACT . NUM 2 | e
LR(k)-грамматики 11 Пример. Проверим, является ли правильной цепочка +12. 5 Для начала преобразуем грамматику из предыдущего примера к виду LR. Для этого используем алгоритм устранения e-правил: FIXED SIGN MANT | MANT SIGN + | – MANT . NUM | NUM FRACT NUM 0 -9 NUM | 0 -9 FRACT . NUM |. | e
LR(k)-грамматики 12 Пример. Проверим, является ли правильной цепочка +12. 5 Для начала преобразуем грамматику из предыдущего примера к виду LR. Для этого используем алгоритм устранения e-правил: FIXED SIGN MANT | MANT SIGN + | – MANT . NUM | NUM FRACT | NUM 0 -9 NUM | 0 -9 FRACT . NUM |.
LR(k)-грамматики 13 Пример. Проверим, является ли правильной цепочка +12. 5 Для начала преобразуем грамматику из предыдущего примера к виду LR. Возможны и другие формы записи, например: FIXED + MANT | – MANT | MANT . NUM | NUM 0 -9 NUM | 0 -9
LR(k)-грамматики 14 Пример. Проверим, является ли правильной цепочка +12. 5 Используем правосторонний вывод: +12. 5 SIGN NUM 2. 5 SIGN NUM. 5 SIGN NUM 3 SIGN MANT 3 FIXED SIGN MANT | MANT SIGN + | – MANT . NUM | NUM FRACT | NUM 0 -9 NUM | 0 -9 FRACT . NUM |.
LR(k)-грамматики 15 Пример. Проверим, является ли правильной цепочка +12. 5 Используем правосторонний вывод: +12. 5 SIGN NUM 2. 5 SIGN NUM. 5 SIGN NUM 3 SIGN MANT 3 FIXED Вывод зашёл в тупик. Причина – неправильно выполненные свёртки. Для решения проблемы нужна таблица разбора!
LR(k)-грамматики 16 Пример. Проверим, является ли правильной цепочка +12. 5 Используем правосторонний вывод: +12. 5 SIGN 1 NUM. 5 SIGN NUM. 5 SIGN NUM SIGN NUM FRACT SIGN MANT FIXED SIGN MANT | MANT SIGN + | – MANT . NUM | NUM FRACT | NUM 0 -9 NUM | 0 -9 FRACT . NUM |.
Построение КС-грамматик 17
Построение КС-грамматик 18 КС-грамматика: G = (N, Σ, P, S) Алгоритм построения грамматики: 1. Определяем алфавит языка Σ. 2. Строим множество правил P. 3. Множество нетерминалов N определяется по левым частям правил, т. е. по символам, стоящим слева от знака вывода. 4. Стартовым символом S будет нетерминал, с которого должен начинаться вывод (корень дерева вывода).
Построение КС-грамматик 19 Как строить правила? Вариант 1. Подобно построению функции переходов ДКА или ДМПА, продвигаясь по синтаксису входной цепочки слева направо: 1. Записываем стартовое правило грамматики S <λ>, где <λ> – описание правильного предложения языка L на естественном языке. За стартовый символ грамматики принимаем S. Добавляем S во множество нетерминалов N. 2. В построенном множестве правил выбираем все правила вида X α <λ>, где α – уже составленная часть правила, α (N Σ)*, а <λ> – ещё не формализованная часть правила на естественном языке.
Построение КС-грамматик 20 3. Если предложение <λ> может начинаться с какой-то конструкции Y 1, то производим уточнение правила: X α Y 1 <λ 1> Если таких конструкций может быть несколько (Y 1, Y 2, …), то получим несколько альтернатив уточнённого правила X α Y 1 <λ 1> | α Y 2 <λ 2> | … Здесь <λ 1> – оставшаяся часть входной цепочки, которая может следовать за Y 1, <λ 2> – за Y 2, и т. д. 4. Если предложение <λ> может быть пустым, то также добавляем правило X α. 5. Если конструкции Y 1, Y 2 и т. д. не являются элементами алфавита языка (терминальными символами), то добавляем их во множество нетерминалов N, и для каждого Yi записываем новое правило Yi <μi>
Построение КС-грамматик 21 Примечание. Следует также проверить, возможно, некоторые требуемые конструкции Yi уже описаны в других правилах грамматики Z β. Тогда новый нетерминал Yi не вводится, а в правых частях правил вместо Yi используем Z. Т. е. нетерминал – это некоторый аналог состояния КА, и мы стараемся избегать ввода в грамматику состояний, которые дублируют друга (хотя, по аналогии с КА, позже их можно удалить с помощью специальных алгоритмов). 6. Повторяем шаги 2 -5 до тех пор, пока в грамматике не останется правил вида X α <λ>, т. е. пока все предложения на естественном языке не будут формализованы и удалены из правил. Другими словами, все правила будут иметь вид X α, где цепочка α либо является пустой (α = e), либо состоит только из терминалов и нетерминалов грамматики, α (N Σ)*.
Построение КС-грамматик 22 Как строить правила? Вариант 2. Методом декомпозиции, когда конструкции естественного языка декомпозируются до тех пор, пока не будут представлены в виде цепочек терминалов и нетерминалов: 1. Записываем стартовое правило грамматики S <λ>, где <λ> – описание правильного предложения языка L на естественном языке. За стартовый символ грамматики принимаем S. Добавляем S во множество нетерминалов N. 2. В построенном множестве правил выбираем все правила вида X α <λ>, где α – уже составленная часть правила, α (N Σ)*, а <λ> – ещё не формализованная часть правила на естественном языке.
Построение КС-грамматик 23 3. Анализируем предложение <λ> – из каких конструкций Y 1, Y 2, и т. д. оно состоит, и производим уточнение правила: X α Y 1 Y 2 … Если вариантов таких конструкций может быть несколько, то получим несколько альтернатив уточнённого правила X α Y 11 Y 12 … | α Y 21 Y 22 … | … 4. Если предложение <λ> может быть пустым, то также добавляем правило X α. 5. Если конструкции Y 1, Y 2 и т. д. не являются элементами алфавита языка (терминальными символами), то добавляем их во множество нетерминалов N, и для каждого Yi записываем новое правило Yi <μi> 6. Аналогично предыдущему случаю, повторяем шаги 2 -5 до тех пор, пока в правилах не останется предложений на естественном языке.
Примеры построения грамматик 24 Пример 1. Рассмотрим язык L, описывающий число с плавающей точкой. Такое число может начинаться со знака «+» или «–» , далее следует мантисса числа, затем необязательная экспонента. Как мы уже говорили, разные языки программирования допускают различные формы записи мантиссы, в общем случае они могут быть следующими: «N. M» , «N. » , «. M» , «N» , где N – целая, а M – дробная часть числа. Оба числа N и M имеют одинаковый формат – это последовательность из одной и более цифр в диапазоне от 0 до 9. Т. е. это обычные целые числа, и можно считать, что N = M (имеется в виду формат чисел, а не их значения).
Примеры построения грамматик 25 Экспонента начинается с буквы «E» или «e» , далее может быть указан знак (если не указан – экспонента считается положительной). Далее следует от 1 и более цифр в диапазоне от 0 до 9. Таким образом, общий формат числа с плавающей точкой следующий: [+|–](N. N|N. |. N|N)[(E|e)[+|–]N], где N = (0 -9)+. Примеры: +12. 5. 57 e– 12 1 E+4 – 1. 7 e 8 12. – 1024 . 47 2 E– 5 – 2. 56 e+7 +2 e 2 3. E– 4
Примеры построения грамматик 26 Используем вариант построения правил № 1: FLOAT <число с плавающей точкой>
Примеры построения грамматик 27 Используем вариант построения правил № 1: FLOAT <число без знака> | + <число без знака> | – <число без знака>
Примеры построения грамматик 28 Используем вариант построения правил № 1: FLOAT UNSIGNED | + UNSIGNED | – UNSIGNED <число без знака>
Примеры построения грамматик 29 Используем вариант построения правил № 1: FLOAT + <число без знака> | – <число без знака> | 0 -9 <число с целой частью> | . <число без целой части>
Примеры построения грамматик 30 Используем вариант построения правил № 1: FLOAT + UNSIGNED | – UNSIGNED | 0 -9 INTNUM | . FRACTNUM UNSIGNED <число без знака> INTNUM <число с целой частью> FRACTNUM <число без целой части>
Примеры построения грамматик 31 Используем вариант построения правил № 1: FLOAT <знак> <число без знака> FLOAT
Примеры построения грамматик 32 Используем вариант построения правил № 1: FLOAT SIGN NUMBER SIGN <знак> NUMBER <число без знака> FLOAT SIGN NUMBER
Примеры построения грамматик 33 Используем вариант построения правил № 1: FLOAT SIGN NUMBER SIGN + | – | e NUMBER <мантисса> <экспонента> FLOAT SIGN NUMBER
Примеры построения грамматик 34 Используем вариант построения правил № 1: FLOAT SIGN NUMBER SIGN + | – | e NUMBER MANT EXP | MANT <мантисса> EXP <экспонента> FLOAT SIGN NUMBER MANT EXP
Примеры построения грамматик 35 Используем вариант построения правил № 1: FLOAT SIGN NUMBER SIGN + | – | e NUMBER MANT EXP | MANT . <дробная часть> | 0 -9 <целая и дробная часть> EXP E <знак экспоненты> <значение> | e <знак экспоненты> <значение> FLOAT SIGN NUMBER MANT EXP
Примеры построения грамматик 36 Используем вариант построения правил № 1: FLOAT SIGN NUMBER SIGN + | – | e NUMBER MANT EXP | MANT . DIGITS | 0 -9 <целая и дробная часть> EXP E SIGN <значение> | e SIGN <значение> DIGITS <дробная часть> FLOAT SIGN NUMBER MANT EXP DIGITS
Примеры построения грамматик 37 Используем вариант построения правил № 1: FLOAT SIGN NUMBER SIGN + | – | e NUMBER MANT EXP | MANT . DIGITS | 0 -9 <целая и дробная часть> EXP E SIGN <значение> | e SIGN <значение> DIGITS 0 -9 <оставшиеся цифры> FLOAT SIGN NUMBER MANT EXP DIGITS
Примеры построения грамматик 38 Используем вариант построения правил № 1: FLOAT SIGN NUMBER SIGN + | – | e NUMBER MANT EXP | MANT . DIGITS | 0 -9 <целая и дробная часть> EXP E SIGN <значение> | e SIGN <значение> DIGITS 0 -9 DIGITS 2 DIGITS | e FLOAT SIGN NUMBER MANT EXP DIGITS 2
Примеры построения грамматик 39 Используем вариант построения правил № 1: FLOAT SIGN NUMBER SIGN + | – | e NUMBER MANT EXP | MANT . DIGITS | 0 -9 <целая и дробная часть> EXP E SIGN DIGITS | e SIGN DIGITS 0 -9 DIGITS 2 DIGITS | e FLOAT SIGN NUMBER MANT EXP DIGITS 2
Примеры построения грамматик 40 Используем вариант построения правил № 1: FLOAT SIGN NUMBER SIGN + | – | e NUMBER MANT EXP | MANT . DIGITS | 0 -9 MANT 2 EXP E SIGN DIGITS | e SIGN DIGITS 0 -9 DIGITS 2 DIGITS | e MANT 2 <оставшаяся целая часть> <дробная часть> FLOAT SIGN NUMBER MANT EXP DIGITS 2 MANT 2
Примеры построения грамматик 41 Используем вариант построения правил № 1: FLOAT SIGN NUMBER SIGN + | – | e NUMBER MANT EXP | MANT . DIGITS | 0 -9 MANT 2 EXP E SIGN DIGITS | e SIGN DIGITS 0 -9 DIGITS 2 DIGITS | e MANT 2 DIGITS 2 FRACT <дробная часть> FLOAT SIGN NUMBER MANT EXP DIGITS 2 MANT 2 FRACT
Примеры построения грамматик 42 Используем вариант построения правил № 1: FLOAT SIGN NUMBER SIGN + | – | e NUMBER MANT EXP | MANT . DIGITS | 0 -9 MANT 2 EXP E SIGN DIGITS | e SIGN DIGITS 0 -9 DIGITS 2 DIGITS | e MANT 2 DIGITS 2 FRACT e |. |. <цифры> FLOAT SIGN NUMBER MANT EXP DIGITS 2 MANT 2 FRACT
Примеры построения грамматик 43 Используем вариант построения правил № 1: FLOAT SIGN NUMBER SIGN + | – | e NUMBER MANT EXP | MANT . DIGITS | 0 -9 MANT 2 EXP E SIGN DIGITS | e SIGN DIGITS 0 -9 DIGITS 2 DIGITS | e MANT 2 DIGITS 2 FRACT e |. |. DIGITS или FRACT e |. DIGITS 2 FLOAT SIGN NUMBER MANT EXP DIGITS 2 MANT 2 FRACT
Примеры построения грамматик 44 Используем вариант построения правил № 2: FLOAT <знак> <мантисса> <экспонента> FLOAT
Примеры построения грамматик 45 Используем вариант построения правил № 2: FLOAT SIGN MANT EXP SIGN <знак> MANT <мантисса> EXP <экспонента> FLOAT SIGN MANT EXP
Примеры построения грамматик 46 Используем вариант построения правил № 2: FLOAT SIGN MANT EXP SIGN + | – | e MANT NUM | NUM. |. NUM | NUM EXP <символ экспоненты> <знак экспоненты> <значение экспоненты>| e NUM <цифры> FLOAT SIGN MANT EXP NUM
Примеры построения грамматик 47 Используем вариант построения правил № 2: FLOAT SIGN MANT EXP SIGN + | – | e MANT NUM | NUM. |. NUM | NUM EXP ESIGN NUM | e NUM 0 -9 NUM 2 | e или NUM 2 NUM | e ESIGN E | e FLOAT SIGN MANT EXP NUM 2 ESIGN
Примеры построения грамматик 48 Получили грамматику G = (N, Σ, P, S), где: N = {FLOAT, SIGN, MANT, EXP, NUM 2, ESIGN}; Σ = {+, –, 0 -9, . , E, e}; P = {FLOAT SIGN MANT EXP, SIGN + | – | e, MANT NUM | NUM. |. NUM | NUM, EXP ESIGN NUM | e, NUM 0 -9 NUM 2, NUM 2 NUM | e, ESIGN E | e}; S = FLOAT. Данная грамматика не является ни LL(1)-грамматикой, ни не LR(k)-грамматикой.
Примеры построения грамматик 49 Правило Множество T FLOAT SIGN MANT EXP {+, –, . , 0 -9} SIGN + {+} SIGN – {–} SIGN e {. , 0 -9} MANT NUM {0 -9} MANT NUM. {0 -9} MANT . NUM {. } MANT NUM {0 -9} EXP ESIGN NUM {E, e} EXP e { } NUM 0 -9 NUM 2 {0 -9} NUM 2 NUM {0 -9} NUM 2 e {. , E, e, } ESIGN E | e {E, e}
Примеры построения грамматик 50 Приведём грамматику к виду LL(1): FLOAT SIGN MANT EXP SIGN + | – | e MANT NUM |. NUM EXP ESIGN NUM | e NUM 0 -9 NUM 2 NUM | e ESIGN E | e
Примеры построения грамматик 51 Приведём грамматику к виду LL(1): FLOAT SIGN MANT EXP SIGN + | – | e MANT NUM 2 | NUM |. NUM EXP ESIGN NUM | e NUM 0 -9 NUM 2 NUM | e ESIGN E | e
Примеры построения грамматик 52 Приведём грамматику к виду LL(1): FLOAT SIGN MANT EXP SIGN + | – | e MANT NUM FRACT |. NUM FRACT . NUM 2 | e EXP ESIGN NUM | e NUM 0 -9 NUM 2 NUM | e ESIGN E | e
Примеры построения грамматик 53 Правило Множество T FLOAT SIGN MANT EXP {+, –, . , 0 -9} SIGN + {+} SIGN – {–} SIGN e {. , 0 -9} MANT NUM FRACT {0 -9} MANT . NUM {. } FRACT . NUM 2 {. } FRACT e {E, e, } EXP ESIGN NUM {E, e} EXP e { } NUM 0 -9 NUM 2 {0 -9} NUM 2 NUM {0 -9} NUM 2 e {. , E, e, } ESIGN E | e {E, e}
Примеры построения грамматик 54 Приведём грамматику к праволинейному виду: FLOAT + UNSIGNED | – UNSIGNED | 0 -9 INT | . FRACT UNSIGNED 0 -9 INT |. FRACT INT 0 -9 INT |. FRACT 2 | e EXP | E EXP | e FRACT 0 -9 FRACT 2 | e EXP | E EXP | e EXP + NUM | – NUM | 0 -9 NUM 2 0 -9 NUM 2 | e
Примеры построения грамматик 55 Приведём грамматику к виду LR(k): FLOAT SIGN MANT EXP SIGN + | – | e MANT NUM | NUM. |. NUM | NUM EXP ESIGN NUM | e NUM 0 -9 NUM 2 NUM | e ESIGN E | e
Примеры построения грамматик 56 Приведём грамматику к виду LR(k): FLOAT SIGN MANT EXP | MANT EXP SIGN + | – MANT NUM | NUM. |. NUM | NUM EXP ESIGN NUM | e NUM 0 -9 NUM 2 NUM | e ESIGN E | e
Примеры построения грамматик 57 Приведём грамматику к виду LR(k): FLOAT SIGN MANT EXP | SIGN MANT | MANT SIGN + | – MANT NUM | NUM. |. NUM | NUM EXP ESIGN NUM 0 -9 NUM 2 NUM | e ESIGN E | e
Примеры построения грамматик 58 Приведём грамматику к виду LR(k): FLOAT SIGN MANT EXP | SIGN MANT | MANT SIGN + | – MANT NUM | NUM. |. NUM | NUM EXP ESIGN NUM 0 -9 NUM | 0 -9 или NUM NUM | 0 -9 ESIGN E | e
Примеры построения грамматик 59 Приведём грамматику к нормальной форме Хомского: FLOAT SIGN UNSIGNED | MANT EXP | NUM EXP | SIGN MANT | SIGN NUM | NUM FRACT | DOT NUM | 0 -9 SIGN + | – UNSIGNED MANT EXP | NUM EXP MANT NUM FRACT | DOT NUM NUM | 0 -9 FRACT DOT NUM |. EXP ESIGN EXP 2 | ESIGN NUM EXP 2 SIGN NUM ESIGN E | e
Примеры построения грамматик 60 Приведём грамматику к нормальной форме Грейбаха: FLOAT + MANT EXP | – MANT EXP | + MANT | – MANT | 0 -9 NUM FRACT EXP | 0 -9 FRACT EXP | 0 -9 NUM EXP | 0 -9 EXP | . NUM EXP | 0 -9 NUM FRACT | 0 -9 FRACT | 0 -9 NUM | 0 -9 |. NUM MANT 0 -9 NUM FRACT | 0 -9 NUM | 0 -9 | . NUM FRACT . NUM |. NUM 0 -9 NUM | 0 -9 EXP E SIGN NUM | e SIGN NUM SIGN + | –


