Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 [ 34 ] 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

дает возможность сократить эту цифру процентов на 90. Так что LL-метод в отношении размера таблицы разбора не представляется лучшим, чем LR-метод.

Коэн и Рот [14] сравнили максимальное, минимальное и среднее время разбора предложений с помощью LL- и LR-анализаторов. Они приводят показатели относительной эффективности этих методов при их использовании на машине DEC PDP-10. Результаты показывают, что LL-метод «быстрее» процентов на 50.

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

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

Упражнения

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

а) LR(0);

б) SLR(l), но не LR(0);

в) LR(1), но не SLR(l).

5.2. Определите, какие из следующих грамматик являются LR(1 (-грамматиками и обоснуйте свой вывод:

а) Е-Е+Е Е-i

б) Z-0S0

- 1S1

в) S -0S0

- 0S1

Там, где грамматика не обладает признаком LR(I), приведите эквивалентную LR(1)-грамматику, если такая существует.

5.3. Постройте таблицу разбора для грамматики, имеющей следующие правила (S - начальный символ):

S -E T-F

Е-Е+Т F- (E)

Е-Т F- x

T-T х F F- y

Является ли эта грамматика SLR(1)-грамматикой?

5.4. Докажите, что следующая грамматика не обладает признаком LR(I) (PROGRAM - начальный символ):



PROGRAM begin DECLIST semi STATELIST end DECLIST d semi DECLIST d

STATELIST- s semi STATELIST s

Преобразуйте эту грамматику в эквивалентную SLR(I)-грамматику и постройте соответствующую таблицу разбора.

5.5. Постройте таблицу разбора для грамматики (S - начальный символ):

a t F F-, ITEM F

ITEM-a t t

5.6. Докажите, что следующая грамматика не обладает признаком LR(I) (S- начальный символ):

S-1S0 S -0S1 S-1 0

S -0 1 -

5.7. Обладает ли а) грамматика из упражнения 5.6 и б) язык, генерируемый этой грамматикой, LR(k)-свойством для любого k?

5.8. Покажите, что следующая грамматика является не LR(I)-грамматикой, а LR(2)-грамматикой:

S -V: = Е S -L S L-1: V-1

Предложите, что можно сделать на стадии лексического анализа в отношении непринадлежности ее к LR(1)?

5.9. Какие преимущества могло бы иметь построение SLR(1)-таблицы разбора на основании LR(0)-гpамматики?

5.10. Требуется ли для метода LR-разбора использование двух стеков (стека символов и стека состояний) или эти два стека можно объединить в один? Обоснуйте свой ответ.

5.11. Докажите, что все регулярные языки обладают LR(I)-свойством.



Г л а в а 6. ВЛЮЧЕНИЕ ДЕЙСТВИЙ В СИНТАКСИС

Анализ и синтез в компиляции, хотя их часто удобно рассматривать как отдельные процессы, во многих случаях происходят параллельно. Это совершенно очевидно для однопроходного компилятора, но и в многопроходнтх компиляторах генерирование объектного или какого-либо промежуточного кода большей частью осуществляется одновременно с синтаксическим анализом. Последнее не должно вызывать удивления: ведь как только синтаксический анализатор распознает, например, присваивание, он, естественно, выдаст код для присваивания в данной точке. В настоящей главе мы покажем, что в грамматике могут содержаться вызовы действий не только для генерирования кода, но и для выполнения других задач компиляции, таких, как построение таблиц символов и обращение к ним и т. п.

6.1. ПОЛУЧЕНИЕ ЧЕТВЕРОК

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

S -EXP EXP-TERM

ЕХР+TERM TERM-FACT

TERM x FACT FACT--FACT

(EXP) ID-abcde где S - начальный символ.

Примеры выражений: (a+b)*c a*b+c a*b+c*d*e

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

Грамматика для четверок имеет следующие правила: QUAD -OPERAND ОР1 OPERAND=INT ОР2 OPERAND=INT OPERAND-INT ID

INT -DIGIT DIGIT INT

DIGIT-0123456789 ID-abcde



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 [ 34 ] 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69