Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория языков программирования и методы трансляции..pdf
Скачиваний:
28
Добавлен:
05.02.2023
Размер:
3.41 Mб
Скачать

176

6 ВКЛЮЧЕНИЕ ДЕЙСТВИЙ В СИНТАКСИС

Синтаксический анализ и генерация кода – принципиально различные процессы, но практически во всех компиляторах они выполняются парал-

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

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

Вкачестве примера включения действия в грамматику для генерирова-

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

четверки [2]. Выражения определяются грамматикой со следующими прави-

лами:

S EXP

EXP TERM | EXP + TERM TERM FACT | TERM FACT FACT –FACT | ID | ( EXP )

ID a | b | c | d | e

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

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

(a + b) c a b + c a b + c d e

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

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

QUAD OPER OP1 OPER = INT | OP2 OPER = INT OPER INT | ID

177

INT DIGIT | DIGIT INT

DIGIT 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

ID a | b | c | d | e

OP1 + |

OP2

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

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

a = 4 a + b = 7 6 + 3 = 11

Выражение

(–a + b)(с + d)

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

a = 1 1 + b = 2 c + d = 3 2 3 = 4

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Целые числа с левой стороны от знаков равенства относятся к другим четверкам. Из сформулированных четверок нетрудно генерировать машин-

ный код, а многие компиляторы на основании четверок осуществляют транс-

ляцию в промежуточный код.

Далее для описания общей схемы разбора примем следующие обозна-

чения: действия заключаются в угловые скобки и обозначаются как A1, A2, …

Для реализации алгоритма четверок требуется четыре действия. Алгоритм

178

пользуется стеком, а номера четверок размещаются с помощью целочислен-

ной переменной. Перечислим эти действия:

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

A2 – взять три элемента из стека, напечатать их с последующим зна-

ком «=» и номером следующей размещаемой четверки и поместить полученное целое число в стек;

A3 – взять два элемента из стека, напечатать их с последующим зна-

чением «=» и номером следующей размещаемой четверки и поме-

стить полученное целое в стек;

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

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

S EXP A4

EXP TERM | EXP + A1 TERM A2 TERM FACT | TERM A1 FACT A2 FACT – A1 FACT | A3 ID A1 | ( EXP )

ID a | b | c | d | e

Действие A1 используется для помещения в стек всех идентификаторов и операторов, а действия A2 и A3 – для получения бинарных и унарных четве-

рок соответственно.

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

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

(–a + b)(с + d)

в четверки. Действие A1 выполняется после распознавания каждого иденти-

фикатора и оператора, действие A2 – после второго операнда каждого знака бинарной операции, а действие A3 – после первого (и единственного) опера-

179

тора каждой унарной операции. Действие A4 выполняется только один раз после считывания всего выражения (табл. 6.1).

Таблица 6.1 – Преобразование выражения в четверки

Последняя

Действие

Выход

считанная

 

 

литера

 

 

 

 

 

(

 

A1, поместить в стек «–»

 

a

A1, поместить в стек a

 

 

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

a = 1

 

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

 

+

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

 

b

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

 

 

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

1 + b = 2

 

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

 

)

 

 

A1, поместить в стек « »

 

(

 

c

A1, поместить в стек c

 

+

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

 

d

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

 

 

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

c + d = 3

 

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

 

)

 

 

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

2 3 = 4

 

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

 

 

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

 

 

 

 

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·