Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЯП, ТВП / ТЯПМТ / Пособие.doc
Скачиваний:
161
Добавлен:
11.05.2015
Размер:
2.37 Mб
Скачать

5.4. Сравнение ll – и lr – методов разбора

Как LL - , так иLR – методы разбора имеют много достоинств. Оба метода – детерминированы и могут обнаруживать синтаксические ошибки на самом раннем этапе.LR – методы обладают тем преимуществом, что они применимы к более широкому классу грамматик и языков и преобразование грамматик в них обычно не требуется. Однако, для хорошо структурированной грамматики сам факт преобразования грамматики не вызывает каких-либо технических трудностей.

Два этих метода можно сравнивать в отношении размеров таблиц разбора и времени разбора. Использование по одному слову на элемент в LL– таблице разбора позволяет свести размер типичной таблицы к минимуму, в то время какLR– разбор этой возможности не предоставляет.

Коэн и Рот сравнивали максимальное и среднее время разбора с помощью LL – иLR– анализаторов. Из данных для машин серииDECрезультаты разбораLL– методом оказались быстрее на 50%.

Оба метода разбора позволяют включать в синтаксис действия для выполнения некоторых аспектов компиляции. Для LR– анализаторов такие действия обычно связаны с приведениями.

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

Контрольные вопросы

  1. Технология разбора снизу вверх.

  2. Построение LR – таблицы разбора.

  3. Метод определения количества состояний грамматики.

  4. Разрешение конфликта сдвиг/приведение.

  5. Сравнение LL - и LR – методов разбора.

6. Включение действий в синтаксис

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

6.1. Получение четверок

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

Таким образом, эти правила позволяют анализировать выражения типа:

Грамматика для четверок имеет следующие правила:

Примеры четверок:

Выражение

будет соответствовать последовательности четверок:

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

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

А1 – поместить элемент в стек;

А2 – взять три элемента из стека, напечатать их с последующим знаком «=» и номером следующей размещаемой четверки и поместить полученное целое число в стек;

А3 –взять два элемента из стека, напечатать их с последующим значением «=» и номером следующей размещаемой четверки и поместить полученное целое в стек;

А4 –взять из стека один элемент.

Грамматика с учетом этих добавлений примет вид

Действие А1используется для помещения в стек всех идентификаторов и операторов, а действияА2 иА3– для получения бинарных и унарных четверок соответственно.

В качестве примера проследим за преобразованием выражения

в четверки. Действие А1 выполняется после распознавания каждого идентификатора и оператора, действиеА2 – после второго операнда каждого знака бинарной операции, а действиеА3– после первого (и единственного) оператора каждой унарной операции. ДействиеА4выполняется только один раз после считывания всего выражения.

Последняя считанная литера

Действие

Выход

(

-

а

+

b

)

(

с

+

d

)

-

А1, поместить в стек «-»

А1, поместить в стека

А3,удалить из стека 2 элемента

Поместить в стек «1»

А1, поместить в стек «+»

А1, поместить в стекb

А2, удалить из стека 3 элемента

Поместить в стек «2»

-

А1, поместить в стек «»

-

А1, поместить в стекс

А1, поместить в стек «+»

А1, поместить в стекd

А2, удалить из стека 3 элемента

Поместить в стек «3»

-

А2, удалить из стека 3 элемента

Поместить в стек «4»

А4, удалить из стека 1 элемент

-а=1

1+b=2

c+d=3

23=4

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