- •Пояснительная записка к курсовой работе (вар16)
- •2008 Оглавление
- •Задание
- •Описание синтаксиса языка в форме Бэкуса-Наура Teрминальные символы:
- •Программа
- •Оператор ввода
- •Оператор вывода
- •Оператор безусловного перехода
- •Оператор условного перехода
- •Оператор Цикла
- •Арифметические выражения
- •Переменная
- •Оператор присваивания
- •Объявления переменных, констант и типов
- •Операции входного языка и их приоритет
- •Перечисление лексем
- •Синтаксический анализ и перевод во внутреннюю форму
- •Кс-грамматика входного языка
- •Основная грамматика
- •Подграмматика составного оператора
- •Подграмматика оператора
- •Подграмматика оператора_вывода
- •Подграмматика для операторов
- •Подграмматика объявлений
- •Подграмматика объявления констант
- •Подграмматика арифметических выражений
- •Подграмматика переменной
- •Описание промежуточного языка.
- •Спецификация тетрад
- •Описание перевода (постфиксная s – атрибутная транслирующая грамматика) каждой конструкции входного языка
- •Основная грамматика
- •Подграмматика для операторов
- •Подграмматика объявления констант
- •Связь между дмп-процессорами и подграмматиками
- •Пример перехода от основной грамматики к подграмматике составного оператора Управляющая таблица основной грамматики
- •Управляющая таблица подграмматики составного оператора
- •S– атрибутный дмп процессор
- •Пример атрибутного перевода для арифметических выражений
- •Управляющая таблица подграмматики оператора
- •Управляющая таблица подграмматики оператора вывода
- •Реализация компилятора
- •Генерация ассемблерного кода
Подграмматика объявления констант
DC -> con int LC ;
DC -> con flt LC1 ;
LC -> LC , idp = numq {ЦЕЛ_КОНСТ}p1,q1
p1p
q1q
LC -> idp = numq {ЦЕЛ_КОНСТ}p1,q1
q1q
p1p
LC1 -> LC1 , idq = fnmr {ВЕЩ_КОНСТ}q1,r1
q1q
r1r
LC1 -> idq = fnmr {ВЕЩ_КОНСТ}q1,r1
q1q
r1r
Операционные символы:
|
{ВЕЩ_КОНСТ}A1,A2 |
Если идентификатор A1не объявлен, то в таблицу идентификаторов записывается ссылка на таблицу вещественных константA2и задается класс – константа, иначе ошибка. |
|
{ЦЕЛ_КОНСТ}A1,A2 |
Если идентификатор A1не объявлен, то в таблицу идентификаторов записывается ссылка на таблицу целых константA2и задается класс – константа, иначе ошибка. |
В объявлении констант, необходимо явно указывать типы intиfloat. Т.е. вещественная лексема обязательно должна содержать точку.
Подграмматика арифметических выражений
AEXp1 -> AEXq1 + Tr1 {+}p2,q2,r2
p1r2
r2НОВЭЛТ
p2q1
q2r1
AEXp1 -> AEXq1 - Tr1 {-}p2,q2,r2
p1r2
r2НОВЭЛТ
p2q1
q2r1
AEXp -> Tq
pq
Tp -> Pq
pq
Tp1 -> Tq1 * Pr1 {*}p2,q2,r2
r2НОВЭЛТ
q2r1
p1r2
p2q1
Tp1 -> Tq1 / Pr1 {/}p2,q2,r2
r2НОВЭЛТ
q2r1
p1r2
p2q1
Pp -> ( AEXq )
pq
Pp -> det ( AEXq ) {det}p1,r
rНОВЭЛТ
p1q
pr
Pp -> trn ( AEXq ) {ТРАНСПОНИР}p1,r
rНОВЭЛТ
p1q
pr
Pp -> numq
pq
Pp -> fnmq
pq
Pp -> VARq
pq
Операционные символы:
|
{+}A1,A2,R |
Взависимости от типов операндов A1иA2генерируется тетрады:ADDIA1A2R;ADDFA1A2R;ADDMA1A2R; соответственно для целого типа, вещественного и матричного. |
|
{-}A1,A2,R |
Взависимости от типов операндов A1иA2генерируется тетрады:SUBIA1A2R;SUBFA1A2R;SUBMA1A2R; соответственно для целого типа, вещественного и матричного. |
|
{*}A1,A2,R |
Взависимости от типов операндов A1иA2генерируется тетрады:MULIA1A2R;MULFA1A2R;MULMA1A2R; соответственно для целого типа, вещественного и матричного. |
|
{/}A1,A2,R |
Взависимости от типов операндов A1иA2генерируется тетрады:DIVIA1A2R;DIVFA1A2R; соответственно для целого и вещественного типов. |
|
{det}A1,A2 |
Если тип A1– тип матрица, то генерируется тетрада:DETMA1-A2, |
|
{ТРАНСПОНИР}A1,R |
Если тип A1– тип матрица, то генерируется тетрада:TRANSPA1-A2 |
Операционные символы арифметических операций вызывают функцию проверки совпадения типов операндов. Если тип одного операнда int, а другогоfloat, то генерируется тетрада преобразования типаintкfloat:FTYPE A _ R, гдеA– элемент типаint.
Подграмматика переменных
VARp -> idq
pq
VARp -> idq [ AEXi1 , AEXj2 ] {ЭЛ_МАТР}q1,r1,r2
r1i1
r2i2
q1q
VARp -> idq IMr {ЭМ}q1,r1,r2
p, r2НОВЭЛТ
q1q
r1r
IMp -> [ AEXi ] {ДОБ_АТРИБ}i1,r
i1i
p,rНОВ_СПИСОК_АТРИБ
IMp -> IMp1 [ AEXi ] {ДОБ_АТРИБ}i1,r
r,pp1
i1i
Операционные символы:
|
{ЭЛ_МАТР}A1,А2,А3 |
Генерируется последовательность тетрад для вычисления смещения в области данных матрицы. В таблицу переменных добавляется строка, содержащая адрес матрицы и смещение – ссылка на переменную, содержащая относительный адрес элемента матрицы. |
|
{ДОБ_АТРИБ}A1,A2 |
Добавляется атрибут A1в списокA2 |
|
{ЭМ}A1,A2,A3 |
Генерируется последовательность тетрад для вычисления смещения в области данных массива. В таблицу переменных добавляется строка, содержащая адрес массива и смещение – ссылка на переменную, содержащая относительный адрес элемента массива. |
НОВ_СПИСОК_АТРИБ– создает список атрибутов, и возвращает указатель на него.
Вычисление относительного адреса для доступа к элементу матрицы/массива:
Матрица с размером [x,y]: $addr=A3*y* 4 +A2* 4;
Массив [x][y][z], элемент [i][j][k]:
$addr = i * (y * z * sizeof(type)) + j * (z * sizeof(type)) + k * sizeof(type);
