Скачиваний:
8
Добавлен:
01.05.2014
Размер:
130.56 Кб
Скачать

Атрибутная грамматика

Атрибуты:

s, R – синтезированный

p, A – унаследованный

Во всех правилах вида A' a B y A'

(где A', B – нетерминалы, a – терминал, y – операционный символ), правила вычисления атрибутов совпадают с приведёнными в пункте 5) и приводятся только в нём.

Аналогичное касается правил вида A B A'(пункт 4) иA' (пункт 6)

  1. Es1  EPs2 EEs3 {присвоить}A1,A2

s1s2, A1s2, A2s3

  1. EEs1  = Ds2 EEs3 {присвоить}A1,A2

s1, A1s2, A2s3

  1. EEs1  = 

s1неопр

  1. Ds1  Ks2 D'p1,s3

p1 s2, s1s3

  1. D'p1,s1  || Ks2 {дизъюнкция}A1,A2,R D'p2,s3

A1p1, A2s2, p2R, s1s3

  1. D'p1,s1  

s1p1

  1. Ks1  RLs2 K'p1,s3

  2. K'p1,s1  && RLs2 {конъюнкция}A1,A2,R K'p2,s3

  3. K'p1,s1  

  1. RLs1  ADs2 RL'p1,s3

  2. RL'p1,s1  < ADs2 {меньше}A1,A2,R RL'p2,s3

  3. RL'p1,s1  > ADs2 {больше}A1,A2,R RL'p2,s3

  4. RL'p1,s1  <= ADs2 {меньше_равно}A1,A2,R RL'p2,s3

  5. RL'p1,s1  >= ADs2 {больше_равно}A1,A2,R RL'p2,s3

  6. RL'p1,s1  == ADs2 {равно}A1,A2,R RL'p2,s3

  7. RL'p1,s1  != ADs2 {неравно}A1,A2,R RL'p2,s3

  8. RL'p1,s1  

  1. ADs1  MLs2 AD'p1,s3

  2. AD'p1,s1  + MLs2 {сложить}A1,A2,R AD'p2,s3

  3. AD'p1,s1  - MLs2 {вычесть}A1,A2,R AD'p2,s3

  4. AD'p1,s1­  

  1. MLs1  UNs2 ML'p1,s3

  2. ML'p1,s1  * UNs2 {умножить}A1,A2,R ML'p2,s3

  3. ML'p1,s1  / UNs2 {разделить}A1,A2,R ML'p2,s3

  4. ML'p1,s1  

  1. UNs1  EPs2

s1s2

  1. UNs1  len ( vip1 ) {норма}A1,R

A1p1, s1R

  1. UNs1  + UNs2 s1  s2

  1. UNs1  - UNs2 {унарный_минус}A1,R

A1s2, s1R

  1. UNs1  ! UNs2 {отрицание}A1,R

A1s2, s1R

  1. EPs1  E1s2 EPPp1,s3

p1s2, s1s3

  1. EPPp1,s1  [ Es2 ] {индекс}A1,A2,R EPPp2,s3

A1p1, A2s2, p2R, s1s3

  1. EPPp1,s1  

s1p1

  1. E1s1  idvp1

s1p1

  1. E1s1  ivcp1

s1p1

  1. E1s1  conp1

s1p1

  1. E1s1  ( Es2 )

s1s2

Семантические процедуры

Ниже везде, где упоминается тип 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.

Соседние файлы в папке Курсовая работа