Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c_compile(флор_курса) / отчет по компилятору.docx
Скачиваний:
28
Добавлен:
15.06.2014
Размер:
36 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Омский государственный технический университет

Кафедра Информатики и вычислительной техники

Специальность 230100 «Информатика и вычислительная техника»

Курсовой проект

на тему: « Разработка компилятора »

по дисциплине « СПО »

Пояснительная записка

Руководитель проекта

Доц., канд. наук

Флоренсов А.Н.

Разработал студент

Группы ИВТ – 418

Литвинов М.А.

Омск 2012

Оглавление

Задание на курсовое проектирование 3

Код компилятора компиляторов BISON 4

Код лексического анализатора 6

Код таблицы символических имен 8

Код генератора ассемблерного кода 10

Пример работы компилятора 13

Список используемой литературы 16

Задание на курсовое проектирование

Используя компилятор компиляторов BISONилиBYACC, разработать компилятор с языка программирования, который описательно задается следующими определениями:

  1. язык обеспечивает вычисления только в целых числах, директивы определения типа отсутствуют;

  2. арифметические выражения могут состоять только из одного, двух или трех операндов, разделенных операцией сложения, вычитания, умножения, причем сами операнды задаются числовой константой или идентификатором;

  3. язык содержит операторы цикла, задаваемые ключевыми словами repeat-urjtil, и условные операторыif, причем возможно использование этого оператора как с частьюelse, так и без нее, концом оператораifдолжно служить служебное словоendif; допускаются операторыbreak;

  4. условия задаются в виде

операнд операцт_сравнения операнд где операндом может служить идентификатор или целочисленная константа;

  1. для выдачи результатов служит оператор

write имя_переменной

а для ввода оператор

read имя_переменной

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

  2. Имена программных объектов должны формироваться по общеупотребительному правилу: первым символом должна быть произвольная латинская буква, последующими символами могут быть цифры или латинские буквы.

  3. Промежуточным языком разрабатываемого компилятора должен быть ассемблер 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);}

;

Соседние файлы в папке c_compile(флор_курса)