Язык постфиксного промежуточного представления.
К А З А Н С К И Й Г О С У Д А Р С Т В Е Н Н Ы Й
У Н И В Е Р С И Т Е Т
Кафедра теоретической кибернетики
К У Р С " Языки и методы программирования "
( для студентов 2 куpса )
Семестровое задание №1.
Цель: Отработка техники построения программ лексического и синтаксического
анализа на основе языка программирования ПАСКАЛЬ(DELPHI). Изложение
дальнейшего материала дается в терминах ПАСКАЛЯ, однако задания можно выполнять также на С++.
Предусматривается программирование отдельных алгоритмов синтаксического анализа и компиляции на основе рекурсивных определений, являющихся наиболее адекватными для упомянутого класса задач. В качестве исходного текста , являющегося объектом обработки, используются язык арифметических выражений и язык функционального программирования на основе ЛИСПа.
Срок выполнения: 2-месяца.
Пояснения к заданию:
Язык арифметических выражений.
Выражения строятся из простых переменных , констант (типа integer или real) ,
знаков операций (+ , - , * , / , DIV , MOD) и функций.
Например : (a1+a2)*(b1-b2 DIV b3)-15+F(x,y,z).
Язык фукционального программирования.
Программы строятся в виде суперпозиции функций. Например :
F1(G1(x,y),G2(a,b,c)). Каждая функция представляется в виде
полноскобочного представления вида (F , p1, p2, … , pn) , где
F-наименование функции , p1, p2, … , pn – аргументы (параметры) ,
каждый из которых является простой переменной , константой
(типа integer , real , boolean) или в свою очередь полноскобочным выражением.
Например (F1,(G1,x,y),(G2,a,b,c)) .
Язык префиксного промежуточного представления.
Промежуточное представление программы получается в результате полного синтаксического разложения программы и затем используется для
дальнейшей генерации кода или интерпретации. Промежуточное представление является структурным списком , который описывается
динамическим типом языка ПАСКАЛЬ.
KOD | NAME | LL | RL |
type list=^element;
element=record
KOD:0..4;
NAME:string;
LL:list;
RL:list
end;
{ 1- если поле NAME определяет имя функции (или знак операции)
KOD= { 2- если поле NAME определяет имя переменной
{ 3- если поле NAME определяет константу
{ 4- поле NAME – пустая строка , поле LL ссылается на другой
{ список (нижний уровень иерархии)
LL-ссылка на нижний уровень иерархии , RL ссылка на следующий элемент данного уровня иерархии.
LL=> NIL , если KOD= 1 | 2 | 3
Пример:( F , x ,(G,z,15))
|
NIL NIL
|
|
NIL
Язык постфиксного промежуточного представления.
В постфиксном представлении знак операции (функции) указывается после аргументов.
Вид представления:
В дальнейшем префиксное промежуточное представлении будем называть просто промежуточным представлением, специально выделяя постфиксное представление.
Пример: ((15,z,G),x,F) (префиксное представление ( F , x ,(G,z,15)))
NIL
NIL NIL
NIL
NIL NIL NIL
Примерные задания.
1. Преобразовать арифметическое выражение, не содержащее скобок (и соответственно функциональных символов) в промежуточное представление.
Например , A1+B1-X/15.5 .
2. Получить из промежуточного представления арифметическое выражение.
3. Преобразовать полноскобочное представление функциональной программы в промежуточное представление.
5. Получить из промежуточного представления функциональной программы
полноскобочное представление.
6.Запрограммировать процесс интерпретации промежуточного представления арифметического выражения, ограничившись только знаками операций + , - ,* , / .
В качестве исходных данных кроме промежуточного представления использовать
таблицу значений переменных, организованную в виде массива.
7. Преобразовать арифметическое выражение, не содержащее скобок ( и соответственно функциональных символов) в полноскобочное представление.
Например , A1+B1-X/15.5 => ( - , (+ , A1, B1) , ( / , X , 15.5 ))
8. Преобразовать полноскобочное представление арифметического выражения в обычное арифметическое выражение.
Например , ( - , (+ , A1, B1) , ( / , X , 15.5 )) => A1+B1-X/15.5
9. Выполнить проверку парности открывающих и закрывающих скобок в
обычном арифметическом выражении.
10. Выполнить проверку парности открывающих и закрывающих скобок в
полноскобочном представлении.
11. Выполнить проверку соответствия типов в операциях (функциях) на
основе промежуточного представления. Тип переменной определяется
первой буквой ее наименования (I – Integer , R-real , B-Boolean). Если
на каком этапе обнаруживается ошибка несоответствия типов , процесс проверки завершается с выдачей сообщения об ошибке (далее не проверять). В качестве исходных данных кроме промежуточного представления использовать
таблицу схем операций (функций). Например , (+,Integer ,integer) => integer .
12. На основе промежуточного представления создать линейный список, содержащий
список наименований используемых операций (функций).
13. Преобразовать префиксное промежуточное представление в постфиксное.
14. Преобразовать постфиксное промежуточное представление в префиксное.
15.Запрограммировать процесс интерпретации постфиксного промежуточного представления арифметического выражения, ограничившись только знаками операций + , - ,* , / .
В качестве исходных данных кроме промежуточного представления использовать
таблицу значений переменных, организованную в виде массива.
16. Выполнить лексический анализ полноскобочного представления , ограничившись только знаками операций + , - ,* , / (не используя функциональные символы). Суть лексического анализа сводится к проверке правильности написания переменных , констант и знаков операций . Например :
(+,(-,a1,b1),(*,c1,15)) – выражение корректное ; (+,(-,a,b),(*,c1,1d1)) – в выражении допущена ошибка (1d1- не является идентификатором) .
17.Для заданного промежуточного представления получить списки наименований операций , функций , переменных и констант. Например , если промежуточное представление получено из выражения F(X1,255)+G(X1*Y1/16,Y2) , то в результате мы должны получить (+,*) –список операций , (F,G) –список функций , (X1,Y1,Y2) – список переменных , (255,16) – список констант.
18.Для заданного полноскобочного представления получить списки наименований операций , функций , переменных и констант. Например , если промежуточное представление получено из выражения F(X1,255)+G(X1*Y1/16,Y2) , то в результате мы должны получить (+,*) –список операций , (F,G) –список функций , (X1,Y1,Y2) – список переменных , (255,16) – список констант.