Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа3 / Курсовик.doc
Скачиваний:
18
Добавлен:
01.05.2014
Размер:
1.6 Mб
Скачать

3.3 Постоение таблиц переменных, меток, констант и векторов

Для работы синтаксического анализатора недостаточно таблицы идентификаторов, заполненной на этапе лексического анализа. Необходимо составить и заполнить отдельные таблицы для переменных, констант, меток, векторов и пользовательских типов для более эффективного использования памяти.

Таблица для переменных и таблица для констант будут иметь следующие поля:

Идентификатор

Тип

Значение

В поле «идентификатор» будет храниться указатель на строку в таблице идентификаторов, построенную на этапе лексического анализа.

Возможные значения поля «Тип»: integer, real, bool

В таблице переменных будут также храниться промежуточные результаты вычислений, для которых поле «идентификатор» будет пусто. Для получения свободной строки будет служить функция GetNew.

Для проверки совместимости типов хранимых в таблице значений, сравниваются значения полей «Тип». Если эти значения (имена типов) одинаковые, то значения имеют один тип, если нет, то типы все равно могут быть совместимыми (при преобразовании типов).

Таблица меток будет иметь только поле «идентификатор».

Таблица пользовательских типов будет иметь поля «идентификатор», «тип», «n». Поле «тип» необходимо для описания типа, которому соответствует новое имя. В этом поле могут быть значения integer, real, bool, vector. Для значения «vector» необходимо в поле «n» иметь размерность вектора.

При построении таблицы векторов для n-мерного вектора будет выделяться n+1 строк. Так как все элементы векторов – вещественные числа, то необходимости в пле «тип» нет. Например, для вектора а[3]=[2.0, 3.0, 4.1] (элементы вектора хранятся в таблице вещественных констант), получим:

Идентификатор

Значение

Ук-ль на «a» в таблице идент-ров

Ук-ль на 2.0 в таблице вещ. констант

Ук-ль на 3.0 в таблице вещ. констант

Ук-ль на 4.1 в таблице вещ. констант

3.4 Описание промежуточного языка.

Тип промежуточного языка, используемого для представления программы после синтаксического анализа – тетрады.

Формат тетрады:

Код операции

Операнд1

Операнд2

Результат

+

a

b

r1

, где <операнд1>, <операнд2> специфицируют аргументы, а <результат> -временное имя для хранения результата выполнения операции.

Операнды одной тетрады должны быть одинаково типа, так как соответствие типов структурное, то неодинаковые типы преобразуются к одинаковому автоматически (отсутствуют тетрады для приведения типов).

Описание промежуточного языка тетрад:

Синтаксис тетрады

Семантика тетрады

КОП

Оп1

Оп2

Рез

DEFL

L

Определение метки L

BRL

L

Безусловный переход к тетраде с меткой L

BFL

L

E

Переход к тетраде с меткой L, если значение выражения E равно “ложь”

NVar

id

t

Добавить переменную id c типом t в таблицу переменных

NLab

id

Добавить метку id в таблицу меток

NVec

id

n

Добавить вектор id с количеством элементов n в таблицу векторов

NConst

id

t

Добавить константу id с типом t в таблицу констант

NType

id

t

n

Добавить пользовательский тип id, обозн. тип t, если вектор с числом элементов n, в таблицу типов

+

a

b

E

Сложение E = a + b

-

a

b

E

Вычитание E = a – b

*

a

b

Е

Умножение Е = a * b

/

a

b

Е

Деление Е = a / b

=

b

a

a:=b

+=

a

b

a

Составное сложение a += b

*=

a

b

a

Составное умножение a *= b

/=

a

b

a

Составное деление a /= b

-=

a

b

a

Составное вычитание a -= b

<

a

b

Е

Меньше E = (a < b)

<=

a

b

Е

Не больше E = (a <= b)

>

a

b

Е

Больше Е = (a > b)

>=

a

b

Е

Не меньше Е = (a >= b)

==

a

b

Е

Равно Е = (a == b)

!=

a

b

Е

Не равно Е = (a != b)

REl

a

i

Е

Чтение элемента вектора Е = a[i]

PEl

b

i

a

Запись значения в элемент a[i]=b

~~

a

Е

В Е помещается длина вектора a

++

a

a

Инкремент а

--

a

a

Декремент а

Scanf

a

Ввод из потока значения а

Printf

a

Вывод в поток значения переменной а