- •0. Оглавление
- •1.2. Соглашения об обозначениях
- •2) Описания
- •1.5. Выражения
- •5) Аддитивные операторы
- •1) Оператор-выражение
- •2) Составной оператор
- •3) Условный оператор
- •Атрибутная грамматика
- •Семантические процедуры
- •2.2. Подграмматика описаний
- •Атрибутная грамматика
- •Семантические процедуры
- •2.3. Основная грамматика
- •Атрибутная грамматика
- •Семантические процедуры
- •Приложение 1. Таблицы лексем
- •Приложение 2. Описания триад
Атрибутная грамматика
Атрибуты:
s, R – синтезированный
p, A – унаследованный
Во всех правилах вида A' a B y A'
(где A', B – нетерминалы, a – терминал, y – операционный символ), правила вычисления атрибутов совпадают с приведёнными в пункте 5) и приводятся только в нём.
Аналогичное касается правил вида A B A'(пункт 4) иA' (пункт 6)
Es1 EPs2 EEs3 {присвоить}A1,A2
s1s2, A1s2, A2s3
EEs1 = Ds2 EEs3 {присвоить}A1,A2
s1, A1s2, A2s3
EEs1 =
s1неопр
Ds1 Ks2 D'p1,s3
p1 s2, s1s3
D'p1,s1 || Ks2 {дизъюнкция}A1,A2,R D'p2,s3
A1p1, A2s2, p2R, s1s3
D'p1,s1
s1p1
Ks1 RLs2 K'p1,s3
K'p1,s1 && RLs2 {конъюнкция}A1,A2,R K'p2,s3
K'p1,s1
RLs1 ADs2 RL'p1,s3
RL'p1,s1 < ADs2 {меньше}A1,A2,R RL'p2,s3
RL'p1,s1 > ADs2 {больше}A1,A2,R RL'p2,s3
RL'p1,s1 <= ADs2 {меньше_равно}A1,A2,R RL'p2,s3
RL'p1,s1 >= ADs2 {больше_равно}A1,A2,R RL'p2,s3
RL'p1,s1 == ADs2 {равно}A1,A2,R RL'p2,s3
RL'p1,s1 != ADs2 {неравно}A1,A2,R RL'p2,s3
RL'p1,s1
ADs1 MLs2 AD'p1,s3
AD'p1,s1 + MLs2 {сложить}A1,A2,R AD'p2,s3
AD'p1,s1 - MLs2 {вычесть}A1,A2,R AD'p2,s3
AD'p1,s1
MLs1 UNs2 ML'p1,s3
ML'p1,s1 * UNs2 {умножить}A1,A2,R ML'p2,s3
ML'p1,s1 / UNs2 {разделить}A1,A2,R ML'p2,s3
ML'p1,s1
UNs1 EPs2
s1s2
UNs1 len ( vip1 ) {норма}A1,R
A1p1, s1R
UNs1 + UNs2 s1 s2
UNs1 - UNs2 {унарный_минус}A1,R
A1s2, s1R
UNs1 ! UNs2 {отрицание}A1,R
A1s2, s1R
EPs1 E1s2 EPPp1,s3
p1s2, s1s3
EPPp1,s1 [ Es2 ] {индекс}A1,A2,R EPPp2,s3
A1p1, A2s2, p2R, s1s3
EPPp1,s1
s1p1
E1s1 idvp1
s1p1
E1s1 ivcp1
s1p1
E1s1 conp1
s1p1
E1s1 ( Es2 )
s1s2
Семантические процедуры
Ниже везде, где упоминается тип int, подразумевается int или ограниченный тип. Атрибуты могут представлять собой указатели или константы. Если входные параметры арифметической процедуры – константы, результат вычисляется непосредственно, и не генерируется никаких триад.
{присвоить} A1,A2
Если первый параметр – ограниченного типа, генерируются триады:
bound A1, A2
mov A1, A2
В противном случае генерируется триада mov A1, A2
Если A2 == неопр, ничего не делать.
Исключительные ситуации:
Типы обоих параметров не равны одновременно int, double или vector[n]
{дизъюнкция} A1,A2,R
Генерируется триада or A1, A2
R = адрес триады.
Исключительная ситуация:
Типы обоих параметров не равны одновременно int.
{конъюнкция} A1,A2,R
Генерируется триада and A1, A2
R = адрес триады.
Исключительная ситуация:
Типы обоих параметров не равны одновременно int.
{меньше} A1,A2,R
Генерируется триада lwr A1, A2
R = адрес триады.
Исключительная ситуация:
Типы обоих параметров не равны одновременно int или double.
{больше} A1,A2,R
Генерируется триада gtr A1, A2
R = адрес триады.
Исключительная ситуация:
Типы обоих параметров не равны одновременно int или double.
{меньше_равно} A1,A2,R
Генерируется триада le A1, A2
R = адрес триады.
Исключительная ситуация:
Типы обоих параметров не равны одновременно int или double.
{больше_равно} A1,A2,R
Генерируется триада ge A1, A2
R = адрес триады.
Исключительная ситуация:
Типы обоих параметров не равны одновременно int или double.
{равно} A1,A2,R
Генерируется триада equ A1, A2
R = адрес триады.
Исключительная ситуация:
Типы обоих параметров не равны одновременно int или double.
{неравно} A1,A2,R
Генерируется триада ne A1, A2
R = адрес триады.
Исключительная ситуация:
Типы обоих параметров не равны одновременно int или double.
{сложить} A1,A2,R
Если типы обоих параметров одновременно равны vector[n], генерируются триады:
add A1+i, A2+i // для всехi от 0 доn-1
R = адрес первой триады.
В противном случае генерируется триада add A1, A2
R = адрес триады.
Исключительная ситуация:
Типы обоих параметров не равны одновременно int, double, или vector[n].
{вычесть} A1,A2,R
Если типы обоих параметров одновременно равны vector[n], генерируются триады:
sub A1+i, A2+i // для всехi от 0 доn-1
R = адрес первой триады.
В противном случае генерируется триада sub A1, A2
R = адрес триады.
Исключительная ситуация:
Типы обоих параметров не равны одновременно int, double или vector[n].
{умножить} A1,A2,R
Если оба параметра имеют тип vector[n], генерируются триады:
mul A1, A2
mul A1+i, A2+i для всехi от1доn-1
add $-2, $-1
R = $
Если один параметр – вектор, а другой - скаляр (например, A1 – вектор), генерируются триады:
mul A1+i, A2 // для всехi от0доn-1
R = адрес первой триады.
Если оба параметра имеют скалярный тип, генерируется триада mul A1, A2
R = адрес триады.
Исключительная ситуация:
Тип хотя бы одного из параметров не равен int, double или vector[n].
{разделить} A1,A2,R
Генерируется триада div A1, A2
R = адрес триады.
Исключительная ситуация:
Типы обоих параметров не равны одновременно int или double.
{норма} A,R
A должен иметь тип vector[n].
Для (n==1) R = A
Для n>1 генерируются триады (арифметика адресная, $ означает номер текущей триады):
mul A,A
mul A+i,A+i
add $-2, $-1 повторяется n-1 раз для i от 1 до n-1
sqrt $-1
R = $
{унарный_минус} A1,R
Генерируется триада neg A1
R = адрес триады.
Исключительная ситуация:
Тип параметра не равен int или double.
{отрицание} A1,R
Генерируется триада not A1
R = адрес триады.
Исключительная ситуация:
Тип параметра не равен int.
{индекс} A1,A2,R
Если второй параметр – константа, то:
R = A1+A1.
Если это переменная типа int, то генерируются триады:
mul A2, sizeof(*A1) // sizeof(*A1) – размер элемента массива A1
add A1, $-1 // Здесь первый параметр триады – адрес переменной выступает в качестве числа
R = $.
Исключительная ситуация:
Тип первого параметра – не массив или вектор, или тип второго – не int.