Главная страница
Навигация по странице:

  • Преобразование грамматики

  • ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ Отлаженную в л/р №1 грамматику открыть в “Режиме поиска направляющих символов

  • Поиск направляющих символов ». При наличии ошибок выполнить преобразование правил грамма- тики в «Редакторе

  • Проверка», «Вывод действий», «Поиск направляющих символов».

  • Приведение грамматики к виду LL(1). Лабораторнаяработа 2


    Скачать 79.5 Kb.
    НазваниеЛабораторнаяработа 2
    АнкорПриведение грамматики к виду LL(1).doc
    Дата02.04.2018
    Размер79.5 Kb.
    Формат файлаdoc
    Имя файлаПриведение грамматики к виду LL(1).doc
    ТипЛабораторная работа
    #17518
    КатегорияИнформатика. Вычислительная техника



    Л А Б О Р А Т О Р Н А Я Р А Б О Т А № 2



    Приведение грамматики к виду LL(1)
    Цель – поиск направляющих символов сконструированной КС-грамматики языка и преобразование ее к виду LL(1).


    1. ОСНОВНЫЕ СВЕДЕНИЯ



    Рассмотрим более подробно группу КС-грамматик, так как они являются наиболее универсальными и поэтому более пригодны в качестве основы для описания языков программирования, а, следовательно, и для фазы синтаксического анализа ( разбора ) компиляции.
    КС-грамматики, в свою очередь, делятся на три класса:

    1. s-грамматики;

    2. Q-грамматики;

    3. LL(1)-грамматики.


    Появление данной классификации КС-грамматик связано со следующей проблемой.

    Попытаемся на основе грамматики
    -

    - +

    - id

    -  id
    осуществить вывод (разбор) предложения аb + cd + e (рис.1).

    Разбирать это предложение, в принципе, можно в любом порядке. Это может быть как левый вывод, т.е. последовательная подстановка самых левых НТ-символов правила. Это может быть правый вывод, т.е. последовательная подстановка самых правых НТ-символов правила на каждом шаге вывода. Также вывод может осуществляться и в смешанном порядке. Стратегия вывода ощутимо влияет на эффективность процесса. Каким бы ни был порядок вывода, отдельные шаги состоят из попыток подыскать правило подстановки, подходящее для рассматриваемого участка строки.

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





    Рис. 1. Вывод (разбор) предложения аb + cd + e
    Таким образом, чем сложнее грамматика, тем более долгим и запутанным становится алгоритм разбора предложения.

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

    Именно такими свойствами обладают S, Q, LL(1)-грамматики.
    S-грамматика
    КС-грамматика называется S-грамматикой (разделенной или простой) тогда и только тогда, когда выполняются следующие два условия:

    1. Правая часть правила начинается терминальным символом.

    2. Различные альтернативны одного правила начинаются разными Т-символами.


    Грамматика :
    1. - a b

    1. 2. - b b

    3. - a

    1. 4. - b


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

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


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

    Для s-грамматик это множество составляет множество непосредственно первых терминальных символов:
    НАПР(i) = НПерв (i)
    Q-грамматики
    КС-грамматика называется Q-грамматикой тогда и только тогда, когда выполняются следующие два условия:

    1. Правая часть каждого правила представляет собой  (пустую) -строку, либо начинается с Т-символами.

    2. Множества выбора разных альтернатив правила не пересекаются.

    Приведенная ниже грамматика отвечает поставленным условиям. От S-грамматики она отличается только наличием пустой строки (-строки).


    1. - a

    2. - b

    3. - c

    4. - 


    -строка может использоваться при разборе предложения в двух случаях:

    1. Либо для завершения циклической структуры вывода.

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


    Множества направляющих символов для Q-грамматики:
    НАПР(i) = НПерв(i) , для непустых правил,

    След(i) , для -правил.
    Таким образом, для пустой строки тоже существует множество символов выбора, так называемых символов-следователей, на основании которого возможно применение -правила в двух описанных выше условиях.

    Например, выведем из приведенной Q-грамматики цепочку aacbb,
    которая принадлежит языку, определяемому данной грамматикой (рис.2).

    Для данной КС-грамматики с начальным символом и нетерминала ( - НТ-символ, одной из альтернатив которого является -строка ) определим СЛЕД () как множество Т-символов, которые могут следовать за в какой-либо промежуточной цепочке, выводимый из . Это множество называется множеством следующих за терминалов.


    Рис. 2. Вывод цепочки, принадлежащей языку

    Анализируя пример, можно установить, что после нетерминала могут идти только Т-символы a и b, т.е.

    СЛЕД (
    ) = {a,b}.
    LL(1)-грамматика
    LL(1)-грамматика обобщает классы Q и S-грамматик. LL(1)-грамматика обеспечивает нисходящий детерминированный анализ предложений слева направо, получает L-вывод и использует один предварительно просматриваемый символ анализируемой строки для выбора правила на очередном шаге вывода.

    LL(1)-грамматика включает в себя свойства Q и S-грамматик. Новым же ее элементом является то, что правая часть правил может начинаться как с Т- и НТ-символов. Направляющими символами LL(1)-грамматик являются

    НАПР(i) = ПЕРВТ(i), для непустых правил,

    СЛЕД(i), для пустых правил.
    КС-грамматика называется LL(1)-грамматикой тогда и только тогда, когда множества выбора различных альтернатив одного и того же правила не пересекаются.

    Первыми терминальными символами считаются такие Т-символы, которые являются первыми (левыми), во
    всех возможных предложениях, выводимых из данного правила с использованием любых правил грамматики.
    Пример:
    Грамматика Направ. символы

    1. - ( id

    2. - + +

    3. -  )

    4. -
      (
      id

    5. - 
      *

    6. -  + -


    7. - ( ) (

    8. - id id



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

    Идеология поиска СЛЕД(i) для LL(1)-грамматики остается такой же, как и для Q-грамматики: символы, следующие за НТ-символом, включающим -строку на любом шаге вывода, являются символами-следователями для -строки.

    Определим СЛЕД(3): правило 3 является альтернативой для НТ-символа ; в свою очередь, включается в , но после в пр.1 ничего не следует. Поэтому следует искать теперь все включения в другие правила грамматики. участвует в пр.7. За в нем расположен символ « ) », который и является для символом-следователем, а, значит, символом-следователем для , и для , и для -строки.

    Таким же образом ищется символ-следователь для -строки НТ-символа <ТSP>.

    На основании определения LL(1)-грамматик можно также вывести три необходимых ( но недостаточных ) условия принадлежности грамматики к классу LL(1):


    1. Отсутствие леворекурсивных правил ( вида - ...);

    2. Отсутствие леворекурсивных циклов ( вида <А> - <В>...

    <В> -
    ...);

    3. Отсутствие альтернативных правил, начинающихся НТ- или Т- символами.
    Нарушение этих условий приведет к пересечению направляющих символов альтернативных правил грамматики.

    Преобразование грамматики
    Обычно для языка программирования дается формальное описание синтаксиса языка с использованием БНФ и ее модификаций или синтаксических диаграмм. Такое описание, ориентированное на прикладного программиста, в принципе, определяет КС-грамматику языка, но весьма далекую от LL(1) грамматики. Поэтому при разработке компилятора
    приходится готовить эквивалентную грамматику, обладающую нужными свойствами. Это можно сделать неформальным преобразованием правил, т.е. исходя из общей структуры конструкции, записать новые порождающие правила. Однако такой путь при недостаточном понимании структуры языка может привести к ситуации, когда новая грамматика порождает язык, отличающийся от исходного. Другой способ преобразования – формальный, гарантирующий эквивалентность грамматик.
    Правила преобразования грамматик к виду LL(1)


    1. Грамматика списочной структуры.

    Если правило грамматики имеет вид
    - e

    - , e,

    где - список,

    е - элемент списка,

    , - разделитель,

    то его необходимо преобразовать с помощью введения дополнительного НТ-символа и -строки к виду
    - e

    - , e

    - ,

    где - продолжение списка.


    1. Исключение левой рекурсии и леворекурсивных циклов.

    Как правило, левые рекурсии и леворекурсивные циклы встречаются при описании арифметических выражений:
    -

    - +

    - - ,

    т.е. в том случае, когда необходимо получить цепочку любой длины. К примеру, a + a – a + a ...

    Правило преобразования таких структур схоже с п.1: в начальной структуре ( ) остается размножаемый элемент ( в данном случае - ) и добавляется НТ-символ «продолжения»:

    -

    Правая часть же для начинается разделителем (+ или - ), затем вновь повторяется структура для . В качестве последней альтернативы добавляется -строка:

    - +


    - -


    - 

    1. Левая факторизация ( грамматика конструкций, имеющих общее начало).

    Если несколько альтернатив для одного НТ-символа имеют одинаковое начало, то преобразование правила выглядит следующим образом:

    - aSb - aS

    <S1> - b

    - aSc - c

    1. Замена НТ-символов их представлениями ( правой частью соответствующего правила ).

    Такая замена не изменяет LL(1)-свойств грамматики и может проводиться для всех вхождений НТ-символа в правые части правил или только для некоторых.
    4.1. Исключение одиночного правила
    Если в грамматике имеется одиночное правило

    -..., то оно может быть исключено, если все вхождения <Р> в правые части правил заменить правой частью одиночного правила. Исключение целесообразно при единственном вхождении

    в правые части правил грамматики ( лишний НТ-символ грамматики ).


    4.2. Замена нетерминального края
    Если выявлено пересечение направляющих символов правил при описании в грамматике операторов с метками или массивов в качестве множителя, то выполняется следующее преобразование: заменяется самый левый НТ-символ правила, причем, если этот НТ-символ имеет К альтернативных правил, то, чтобы не изменить язык, правило должно быть скопировано в К экземплярах и в каждой копии должна быть выполнена замена края соответствующим альтернативным правилом. К примеру, данная грамматика не является LL(1)-грамматикой за счет пересечения множеств направляющих символов:
    10. - id :


    1. -

    12. - id :=


    13. - FOR id :=
    TO
    DO

    14. - PRINT ( )

    Необходимо выполнить следующие действия для ее преобразования:

    1. Разделить <ОР1> на оператор присваивания и другие операторы:


    10. - id :

    11. -

    1. 12. - id :=


    2. 13. -

    14. - FOR ...

    1. - PRINT ( )


    2. Провести замену края в пр.11:



    1. 10. - id :

    11. - id :=


    12. -

    13. - id :=


    14. -

    15. - FOR...

    1. - PRINT ( )




    1. 3. Выполнить левую факторизацию для пр.10 и пр.11:



    2. 10. - id


    11. -

    12.
    - :

    13. - :=


    14. - id :=


    15. -

    16. - FOR ...

    1. - PRINT ( )




    1. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ




    1. Отлаженную в л/р №1 грамматику открыть в “Режиме поиска направляющих символов”.

    2. Записать таблицу направляющих символов в случае успешного прохождения этапа.




    1. ИСПОЛЬЗОВАНИЕ «УЧЕБНОГО КОМПИЛЯТОРА» В Л/Р №2




    1. Войти в режим «Поиск направляющих символов».

    2. При наличии ошибок выполнить преобразование правил грамма-

    тики в «Редакторе» «Учебного компилятора».

    1. Обработать новый вариант грамматики в режимах «Проверка», «Вывод действий», «Поиск направляющих символов».

    2. При необходимости продолжить преобразование правил грамматики.




    1. СОДЕРЖАНИЕ ОТЧЕТА


    Отчет по лабораторной работе должен содержать следующие сведения:

    1. цель работы;

    2. вариант задания;

    3. листинг грамматики и таблицы направляющих символов.




    1. КОНТРОЛЬНЫЕ ВОПРОСЫ




    1. S-грамматика и поиск направляющих символов.

    2. Q-грамматика и поиск направляющих символов.

    3. LL(1)-грамматика и поиск направляющих символов.

    4. Как избавиться от левой рекурсии в грамматике?

    5. Как построить грамматику списковой структуры?

    6. Каким образом можно произвести замену нетерминального края?

    7. Что такое левая факторизация?

    ЛИТЕРАТУРА



    1. Грис Д. Конструирование компиляторов для цифровых вычислительных машин.:Пер. с англ.-М.:Мир, 1975.-544с.

    2. Фостер Дж. Автоматический синтаксический анализ.:Пер. с англ.-

    М.:Мир,1975.-70с.

    1. Хантер Р. Проектирование и конструирование компиляторов.:Пер. с англ.-М.:Финансы и статистика, 1984. – 232с.



    Составители: Ирина Юрьевна Королева

    Сергей Олегович Деревенсков




    ТЕОРИЯ ПОСТРОЕНИЯ ТРАНСЛЯТОРОВ. ПРИВЕДЕНИЕ ГРАММАТИКИ ЯЗЫКА К ВИДУ LL(1). Методические указания к лабораторным работам по курсу «Основы трансляции» , часть II
    Редактор Е.И. Кагальницкая
    Темплан 2001 г. , поз. №
    Подписано в печать _______. Формат 60  84 1/16.

    Бумага газетная. Печать офсетная. Усл. печ. л. 0,69.

    Уч.-изд.л. 0,72. Тираж 300 экз. Заказ ____. Бесплатно.


    Волгоградский государственный технический университет.

    400131 Волгоград , пр. Ленина , 28.

    РПК «Политехник» Волгоградского государственного технического

    университета.

    400131 Волгоград , ул. Советская , 35.



    написать администратору сайта