
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Омский государственный технический университет
Кафедра Информатики и вычислительной техники
Специальность 230100 «Информатика и вычислительная техника»
Курсовой проект
на тему: « Разработка компилятора »
по дисциплине « СПО »
Пояснительная записка
Руководитель проекта
Доц., канд. наук
Флоренсов А.Н.
Разработал студент
Группы ИВТ – 418
Литвинов М.А.
Омск 2012
Оглавление
Задание на курсовое проектирование 3
Код компилятора компиляторов BISON 4
Код лексического анализатора 6
Код таблицы символических имен 8
Код генератора ассемблерного кода 10
Пример работы компилятора 13
Список используемой литературы 16
Задание на курсовое проектирование
Используя компилятор компиляторов BISONилиBYACC, разработать компилятор с языка программирования, который описательно задается следующими определениями:
язык обеспечивает вычисления только в целых числах, директивы определения типа отсутствуют;
арифметические выражения могут состоять только из одного, двух или трех операндов, разделенных операцией сложения, вычитания, умножения, причем сами операнды задаются числовой константой или идентификатором;
язык содержит операторы цикла, задаваемые ключевыми словами repeat-urjtil, и условные операторыif, причем возможно использование этого оператора как с частьюelse, так и без нее, концом оператораifдолжно служить служебное словоendif; допускаются операторыbreak;
условия задаются в виде
операнд операцт_сравнения операнд где операндом может служить идентификатор или целочисленная константа;
для выдачи результатов служит оператор
write имя_переменной
а для ввода оператор
read имя_переменной
остальные синтаксические элементы языка выбираются разработчиком самостоятельно (скобки, средства указания конца оператора, блока операторов, символ присваивания, обозначения операций сравнения и т.п.);
Имена программных объектов должны формироваться по общеупотребительному правилу: первым символом должна быть произвольная латинская буква, последующими символами могут быть цифры или латинские буквы.
Промежуточным языком разрабатываемого компилятора должен быть ассемблер nasm, компилятор с которого, в свою очередь, следует вызывать внутри разрабатываемого компилятора, следом за которым вызывать соответствующий компоновщик;
основным результатом работы компилятора должен быть либо исполняемый файл, либо файл объектного кода - в зависимости от опции вызова этого компилятора;
в качестве дополнительных файлов, выдаваемых компилятором при указании опций запроса для них, должны формироваться ассемблерный файл промежуточного представления и файл таблицы символических имен.
Представляемые результаты разработки должны включать пояснительную записку и исходный файл для BISONaилиBYACCa, детально прокомментированный, с текстами подключаемых файлов, созданных разработчиком. Рекомендуется проводить разработку постепенно, реализую до получения результирующего файла сначала первые пункты его задания, затем добавляя к ним группу следующих и т.д.
Код компилятора компиляторов bison
/* Объявления BISON*/
%tokenNUMчисло
%tokenVARпеременная
%tokenFNCфункция
…
%tokenIFELSEENDIFусловный оператор перехода
%token REPEAT UNTIL BREAK цикл с пост условием
/* Далее следует грамматика */
%%
input: /* пустая строка */
| inputline
;
lineотделяет одну операцию с данными от другой, заносит в управляемую памят код конца операции, если это нужно.
line: '\n'
| ';' { PushCnt(EOP);
| asg ';' PushCnt(EOP);}
| func ';' {PushCnt(EOP);}
| ifstmt {}
| while { }
| BREAK ';' { }
;
Expопределяет арифметические выражения над числами, заносит в управляющую память код операции над числами, их значение или адрес переменной вместо значения.
exp: factor '+' factor { PushCnt(ADD); PushCnt($3); PushCnt($1);}
| factor '-' factor { PushCnt(SUBT); PushCnt($3); PushCnt($1);}
…
;
Condопределяет логические операции над числами, такие как больше меньше равно, заносит в управляющую память код логической операции над числами и значение числа или адрес переменной
cond: factor '>' factor { PushCnt(GREAT); PushCnt($3); PushCnt($1); PushCnt(EOP);}
| factor '<' factor { PushCnt(LESS); PushCnt($3); PushCnt($1); PushCnt(EOP);}
…
;
Factorпросто заносит в управзяющую память «тип» значения операнда, он может быть числом или переменной.
factor: '-' factor %prec NEG { $$ = -$2; }
| NUM { $$ = $1; PushCnt(CONST);}
| VAR { $$ = $1; PushCnt(VARBL);}
;
Asgопределяет операцию присваивания и заносит в управляющую память код присваивания и значение или адрес переменной.
asg: VAR '=' factor { PushCnt(VARBL); PushCnt(SETVAL); PushCnt($1); PushCnt($3); }
…
;
Определяет синтаксис для выхова функции, заносит в управляемую память тип функции, адрес функции, тип переменной, адрес переменной.
func: FNC '(' VAR ')' { PushCnt(FUNCT); PushCnt($1); PushCnt(VARBL); PushCnt($3);}
;
Ifstmtопределяет синтаксис для условного перехода, в управляющей памяти нечего не сохраняется, но в лексическом анализаторе при встрече данных конструкций заносится код данных лексем
ifstmt: IF cond input ENDIF { }
| IF cond input ELSE input ENDIF { }
;
Whileопределяет синтаксис дляцикла с пост условием, в управляющей памяти сохраняется только конец операции, но в лексическом анализаторе при встрече данных конструкций заносится код данных лексем
while: REPEAT input UNTIL cond ';' { PushCnt(EOP);}
;