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

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО

ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

ФАКУЛЬТЕТ АВТОМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ

КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ


Курсовая работа

по дисциплине «Системное программное обеспечение»

Лексика и синтаксис языков программирования.

Студент:

Группа: АМ-610

Вариант: 4334223

Преподаватель:

Новосибирск 2010

Содержание

1. Задание................................................................................................................................................................................ 3

1.1 Содержание работы.................................................................................................................................................. 3

1.2 Краткое описание языка........................................................................................................................................ 3

1.3 Вариант задания........................................................................................................................................................ 4

2. Цель работы....................................................................................................................................................................... 5

3. Словесное описание..................................................................................................................................................... 5

НЕ нашли? Не то? Что вы ищете?

3.1 Типы данных, различаемые языком.................................................................................................................... 5

3.2 Идентификаторы и константы, различаемые языком................................................................................. 5

3.3 Арифметические операции........................................................................................................................................ 5

3.4 Логические операции................................................................................................................................................... 5

3.5 Операторы сравнения.................................................................................................................................................. 5

3.6 Основные конструкции языка................................................................................................................................. 6

3.7 Дополнительные сведения об языке..................................................................................................................... 6

4. Разработка системы регулярных выражений.................................................................................................. 6

5. Разработка лексического анализатора.............................................................................................................. 8

6. Разработка формальной грамматики языка............................................................................................... 10

7. Разработка синтаксического анализатора................................................................................................... 12

7.1 Краткое описание классов расширения синтаксического акцептора для получения ПФЗ.... 12

7.2 Правила перевода в ПФЗ........................................................................................................................................... 13

8. Пример правильной программы......................................................................................................................... 14

9. Результаты работы автомата................................................................................................................................. 17

10. Выводы.............................................................................................................................................................................. 19

11. Использованная литература.................................................................................................................................. 19

1.  Задание

1.1 Содержание работы

·  Разработать словесное описание лексики, синтаксиса и семантики заданного варианта языка. Написать простую тестовую программу (программы), содержащую все заданные элементы и конструкции языка. Вручную выполнить интерпретацию программы. Эту программу (программы) использовать впоследствии для проверки элементов разрабатываемого транслятора.

·  Разработать систему регулярных выражений, определяющую лексику заданного варианта языка. Используя пакет WebTransLab, построить автоматную реализацию лексического акцептора. Убедиться в работоспособности акцептора.

·  Разработать совокупность действий, т. е. расширение системы регулярных выражений, реализующую:

Ø  поиск в таблицах идентификаторов / констант и пополнение таблиц;

Ø  формирование лексем,

и построить лексический анализатор. Проверить его работоспособность.

·  Разработать формальную грамматику класса LL(1), определяющую синтаксис заданного языка. Используя пакет WebTransLab, построить автоматную реализацию нисходящего синтаксического акцептора, проверить его работоспособность.

·  Разработать расширение синтаксического акцептора (нисходящего) для преобразования последовательности лексем в постфиксную запись

·  Оформить расчетно-пояснительную записку.

1.2 Краткое описание языка

Разрабатываемый язык – процедурный, относится к разделу Си-подобных языков, код регистрозависим. Правильная программа на данном языке представляет собой непустой список, который содержит определения и объявления функций и объявления глобальных переменных. Функция состоит из имени функции, списка параметров и тела. При определении функции указывается тип возвращаемого результата, имя, список параметров и тело; при объявлении – тип возвращаемого результата, имя, список параметров (для каждого параметра указывается тип и идентификатор). Тело функции может содержать блок объявления локальных переменных и блок операторов. Операторы разграничиваются с помощью разделителя “;”. Операторы объединяются в блоки с помощью фигурных скобок. Для локальных и глобальных переменных допускается объявление нескольких переменных одного типа через разделитель “,” и использование оператора присваивания при объявлении. Реализована возможность использования однострочных комментариев.

1.3 Вариант задания

Обозначения:

[ ] – необязательная часть

– часть, повторяющаяся произвольное количество раз

< > – описание конструкции

<Б>|<Ц>|<пБ>|<пЦ>|<пБЦ> – буква | цифра | последовательность букв | последовательность цифр | последовательность букв и/или цифр или пусто

<И> – <имя объекта>

<В> – <выражение>

<ЛВ> – <ЛогическоеВыражение>

<ОБ> – <ОператорИлиБлок> (<О> - одиночный оператор)

<К> – <константа>

II.1  Идентификаторы и константы

Вариант:

4

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

<Б><Ц><пБЦ>

Константы

целые

вещественные

символьные

7-ричные

L_T / L_F

II.2  Объявления примитивных типов (целое, вещественное, символьное, булево):

Вариант:

3

long

doub[l[e]]

litera

bool[e[a[n]]]

II.3  Оператор присваивания:

Вариант:

4

<И> = <В>;

II.4  Условный оператор:

В-т:

2

when <ЛВ> then <ОБ> [else <ОБ>]

II.5  Переключатель

В-т:

2

switch <В> { by <К>:<ОБ> …}

II.6  Оператор цикла:

В-т:

3

for<И>from<К> to<К> [step <К>] <ОБ>

2.  Цель работы

·  Практическое применение теоретических основ проектирования трансляторов с языков программирования

·  Освоение средств автоматизации построения трансляторов (WebTransLab)

·  Разработка элементов транслятора для учебного языка

3.  Словесное описание

3.1 Типы данных, различаемые языком

Название

Псевдонимы

long

double

doub, doubl

litera

bool

boole, boolea, boolean

void

3.2 Идентификаторы и константы, различаемые языком

Тип

Примеры

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

a7xfd, b9f, g0dgfafssaf

Целые константы

0, 1, 100, 30137

Вещественные константы

0.34, 0.0, 8., 143.65, .87

Символьные константы

b, z, i, \g, \\, \<

7-ричные константы

0s6, 0s1, 0s0

Логические константы

L_T, L_F

3.3 Арифметические операции

+

сложение

-

вычитание

/

деление

*

умножение

%

остаток от деления

3.4 Логические операции

||

Логическое ИЛИ (Дизъюнкция)

&&

Логическое И (Конъюнкция)

3.5 Операторы сравнения

==

равенство

меньше

больше

<=

меньше-равно

>=

больше-равно

!=

неравенство

3.6 Основные конструкции языка

Определение функции

<тип> <И>(<cписок параметров>){<тело>}

Объявление функции

<тип> <И>(<cписок параметров>);

Объявление переменной

<тип> <И>;

<тип> <И>,...,<И>;

<тип> <И> = <К>;

Оператор присваивания

<И> = <В>;

Условный оператор

when <В> then <ОБ> [else <ОБ>];

Оператор переключения

switch <В> { by <К>:<ОБ> …}

Оператор цикла

for<И>from<К> to<К> [step <К>] <ОБ>

Вызов функции

<И>(<список факт. параметров> );

<И1> = <И>(<список факт. параметров>);

Возвращение результата функции

return <В>;

3.7 Дополнительные сведения об языке

При определении и объявлении функции для каждого параметра указывается тип и идентификатор, параметры перечисляются через запятую.

Локальные переменные могут быть объявлены только в начале тела функции, до блока операторов.

Допускается пустое тело функции и пустой оператор “;”.

Операторы условия, цикла и переключения могут быть вложенными.

В условном операторе часть else всегда относится к последнему when.

Вызов функции, возвращающей результат типа void, производится самостоятельно (как процедура), в остальных случаях вызов функции является частью выражения.

В списке фактических параметров при вызове функции разрешено использовать только константы и идентификаторы, параметры перечисляются через запятую.

Допускается возможность использования однострочных комментариев.

Определены следующие незначащие символы (символы языка, разбивающие текст программы на лексемы): символ пробела, перевода строки, табуляции и возврата каретки.

4.  Разработка системы регулярных выражений

В ходе выполнения работы была разработана система регулярных выражений, а также классы и действия для расширения лексического акцептора до лексического анализатора.

Система регулярных выражений со встроенными действиями и комментариями приведена на рис. 1.

Рис.1. ЛА

5.  Разработка лексического анализатора

Краткое описание классов расширения лексического акцептора до анализатора:

class universalTable

{

private Vector<lexemData> tableData;

private HashMap hashMap;

public universalTable();

public int search(lexem Img);

public void add(lexemData Item);

public int size();

public String getTable(String caption);

}

Класс предназначен для хранения ключевых слов и их атрибутов. В векторе tableData хранятся ключевые слова и информация о них. С помощью hashMap осуществляется быстрый поиск по вектору: в качестве ключа используется ключевое слово, а значение — это индекс этого слова в векторе tableData.

public universalTable();

Конструктор. Создает пустой вектор и HashMap.

public int search(lexem Img);

Поиск лексемы по таблице. Возвращает индекс лексемы в таблице, если она есть, в противном случае возвращает -1.

public void add(lexemData Item);

Добавление новой лексемы в таблицу.

public int size();

Возвращает текущей размер таблицы.

public String getTable(String caption);

Возвращает таблицу в виде html-кода. Необходимо для визуального вывода таблицы.

class myTable

{

private String debugGroupWord;

private universalTable tableKeyWords;

private universalTable tableIdent;

private universalTable tableConst;

public myTable();

public void initTableKeyWords(int groupIndex);

public int processIdent(lexem Lex);

public int processConst(lexem Lex);

public boolean isBool(String str);

public boolean isDouble(String str)

public int processKeyWords(lexem Lex);

public int processOperator(lexem Lex);

public int processBracket(lexem Lex);

public int processOperation(lexem Lex);

public int processDelimiter(lexem Lex);

public String getTable(int h);

public void debugGroupWordFill(lexem Lex);

public void debugGroupWordEndln(lexem Lex);

public String debugGroupWordGet();

}

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

public myTable();

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

public void initTableKeyWords(int groupIndex);

Инициализация таблицы ключевых слов. Вызов данной функции осуществляется в правилах для регулярных выражений группы слов keyWord для первого слова этой группы, т. к. заранее индекс группы ключевых слов неизвестен.

public int processIdent(lexem Lex);

Функция обработки идентификаторов и занесения их в таблицу при необходимости.

public int processConst(lexem Lex);

Функция обработки констант и занесения их в таблицу при необходимости.

public boolean isBool(String str);

Функции проверяет, является ли входная строка синонимом типа bool.

public boolean isDouble(String str);

Функции проверяет, является ли входная строка синонимом типа double.

public int processKeyWords(lexem Lex);

Функция обработки ключевых слов и занесения их в таблицу при необходимости.

public int processOperator(lexem Lex);

Функция обработки операторов сравнения и оператора присваивания.

public int processBracket(lexem Lex);

Функция обработки скобок.

public int processOperation(lexem Lex);

Функция обработки арифметических и логических операций.

public int processDelimiter(lexem Lex);

Функция обработки разделителей.

public String getTable(int h);

Возвращает запрашиваемую таблицу в виде html-кода.

public void debugGroupWordFill(lexem Lex);

public void debugGroupWordEndln(lexem Lex);

public String debugGroupWordGet();

Служебные функции для построения отладочного представления программы в виде <индекс_группы, строка_в_таблице>. (т. е. в виде списка лексем).

6.  Разработка формальной грамматики языка

В ходе выполнения работы была разработана формальная грамматика языка, принадлежащая классу LL(1) (значит, по ней может быть построен нисходящий синтаксический акцептор), а также классы и действия для расширения синтаксического акцептора до синтаксического анализатора и получения постфиксной записи (ПФЗ).

Таблицу формальной грамматики ввиду ее сильной громоздкости приведем без встроенных действий перевода в ПФЗ. (рис 2.)

Рис.2 а. Формальная грамматика ч.1

Рис.2 б. Формальная грамматика ч.2

7.  Разработка синтаксического анализатора

7.1 Краткое описание классов расширения синтаксического акцептора для получения ПФЗ

class pfz

{

private Vector<lexem> RPN_array;

private Stack RPN_stack;

public int countIF;

public int countREPEAT;

public int countSELECT;

public pfz();

public int getPrior(lexem Lex);

public void addUseStack(lexem Lex);

public void popStack();

public void addSimple(lexem Lex);

public void addSimpleLexem(StringBuffer Lex);

public void insertElementInEnd(lexem Lex, int index);

public void addSimpleLexemInEndByIndex(StringBuffer Lex, int index);

public String printPfz();

}

private Vector<lexem> RPN_array;

Выходной массив данных.

private Stack RPN_stack;

Необходим для учета приоритета операций.

public int countIF;

public int countREPEAT;

public int countSELECT;

Счетчики для учета вложенности конструкций.

public pfz();

Конструктор класса.

public int getPrior(lexem Lex);

Функция определения приоритета операции.

public void addUseStack(lexem Lex);

Функция добавляет лексему в выходной массив с учетом приоритета операций.

public void popStack();

Функция извлечения из стека всего его содержимого.

public void addSimple(lexem Lex);

public void addSimpleLexem(StringBuffer Lex);

Добавляют новую запись в выходной массив.

public void insertElementInEnd(lexem Lex, int index);

public void addSimpleLexemInEndByIndex(StringBuffer Lex, int index);

Добавляют новую запись в выходной массив в позицию «размер массива - index».

public String printPfz();

Возвращает массив в виде строки, для распечатки.

7.2 Правила перевода в ПФЗ

Конструкция

Прямая запись

ПФЗ

Определение функции

<тип> <И>(<cписок
параметров>){<тело>}

<Иарг1> <тип_арг1>… <ИаргN> <тип_аргN> N <тип> <И> func { <тело> }

Объявление функции

<тип> <И>(<cписок
параметров>);

<Иарг1> <тип_арг1>… <ИаргN> <тип_аргN> N <тип> <И> func definition

Объявление переменной

<тип> <И>;

<тип> <И>,...,<И>;

<тип> <И> = <К>;

<тип> <И> init

<тип> <И> init ...<тип> <И> init

<тип> <И> init <К> =

Оператор присваивания

<И> = <В>;

<И> <В> =

Условный оператор

when <В> then <ОБ1> [else <ОБ2>];

<В> ! LabelElse1 JmpF

<ОБ1>

LabelEndIf1 Jmp

LabelElse1:

<ОБ2>

LabelEndIf1:

Оператор переключения

switch <В> { by <К>:<ОБ> …}

SwitchResult1 <В> initSwitch

<К> SwitchResult1 != LabelEndCase1_0 JmpF

<ОБ>

LabelEndCase1_0:

Оператор цикла*

for<И>from<К1> to<К2> [step <К3>] <ОБ>

*если необязательная часть отсутствует, К3=1

<И> <К1> =

LabelCycle1:

<ОБ>

<И> <И> <К3> + =

<И> <К2> <= LabelCycle1 JmpF

Вызов функции

<И>(<список факт.
параметров> );

<И1> = <И>(<список факт. параметров>);

<арг1 > … <аргN> N <И> call

<И1> <арг1 > … <аргN> N <И> call =

Возвращение результата функции

return <В>;

<В> ret


8.  Пример правильной программы

Рассмотрим пример правильной программы на разрабатываемом языке:

long a7x;

boolean b8sd=L_F;

double a7f, a0f;

litera c8s='\c';

void m2proc(long a7xn, doub a7fn) { a7x=a7xn; a7f=a7fn;}

bool t5rue() {return L_T;}

void a9gfdsdfsd(){}

void b8fsd(boolea f8f){;}

long a5func(boole a8fd, litera a9ccc);

doubl m8func(long a2d, long b2d);

void f8func()

{

doub g8d, g7d, g6d;

long a1cd=0;

g6d=.5;

g7d=0.12;

g8d=8.;

m2proc(0,g6d);

a1cd=a5func(b8sd, c8s);

switch a1cd%5

{

by 0:

a0f=m8func(a7x, a1cd);

by 1:

{m2proc(a1cd, g7d); a0f=g8d;}

}

}

long a5func(boole a8fd, litera a9ccc)

{

long n3n=25;

when ((a9ccc >= 'a') && (a9ccc <= 'z' ) || a8fd)

then return n3n%10+1;

return n3n;

}

double m8func(long a2d, long b2d)

{

return a2d/b2d*100;

}

void m0mainfunc()

{

long s7a=0s6;

long i1i, k2k;

doubl d8result;

m2proc(s7a,1.0);

k2k=0;

for i1i from 0 to 10 step 1

{

when ( a7x > i1i || a7x == 7 )

then {a7x=a7x-1; d8result=m8func(i1i, a7x);}

when ( k2k!=0 && k2k < 10)

then d8result=m8func(k2k, a7x);

else

d8result=m8func(k2k, 100);

k2k=k2k+1;

}

}

В постфиксной записи программа будет иметь следующий вид:

long a7x init

bool b8sd init L_F =

double a7f init double a0f init

litera c8s init \c =

a7xn long a7fn double 2 void m2proc func { a7x a7xn = a7f a7fn = }

0 bool t5rue func { L_T ret }

0 void a9gfdsdfsd func { }

f8f bool 1 void b8fsd func { }

a8fd bool a9ccc litera 2 long a5func func definition

a2d long b2d long 2 double m8func func definition

0 void f8func func

{

double g8d init double g7d init double g6d init

long a1cd init 0 =

g6d.5 =

g7d 0.12 =

g8d 8. =

0 g6d 2 m2proc call

a1cd b8sd c8s 2 a5func call =

SwitchResult1 a1cd 5 % initSwitch

0 SwitchResult1 != LabelEndCase1_0 JmpF

a0f a7x a1cd 2 m8func call =

LabelEndCase1_0:

1 SwitchResult1 != LabelEndCase1_1 JmpF

{ a1cd g7d 2 m2proc call a0f g8d = }

LabelEndCase1_1:

}

a8fd bool a9ccc litera 2 long a5func func

{

long n3n init 25 =

a9ccc a >= a9ccc z <= && a8fd || ! LabelElse1 JmpF

n3n 10 % 1 + ret

LabelEndIf1 Jmp

LabelElse1:

LabelEndIf1:

n3n ret

}

a2d long b2d long 2 double m8func func

{

a2d b2d / 100 * ret

}

0 void m0mainfunc func

{

long s7a init 0s6 =

long i1i init long k2k init

double d8result init

s7a 1.0 2 m2proc call

k2k 0 =

i1i 0 =

LabelCycle1:

{

a7x i1i > a7x 7 == || ! LabelElse1 JmpF

{ a7x a7x 1 - = d8result i1i a7x 2 m8func call = }

LabelEndIf1 Jmp

LabelElse1:

LabelEndIf1:

k2k 0 != k2k 10 < && ! LabelElse1 JmpF

d8result k2k a7x 2 m8func call =

LabelEndIf1 Jmp

LabelElse1:

d8result k2k 100 2 m8func call =

LabelEndIf1:

k2k k2k 1 + =

}

i1i i1i 1 + =

i1i 10 <= LabelCycle1 JmpF

}

9.  Результаты работы автомата

Проверим работу автомата на примере правильной программы, приведенной выше.

Последовательность лексем

<-7, 0><1, 0><-6, 1>

<-7, 3><1, 1><-10, 6><8, 0><-6, 1>

<-7, 1><1, 2><-6, 2><1, 3><-6, 1>

<-7, 2><1, 4><-10, 6><10, 1><-6, 1>

<-7, 14><1, 5><-5, 2><-7, 0><1, 6><-6, 2><-7, 1><1, 7><-5, 3><-5, 0><1, 0><-10, 6><1, 6><-6, 1><1, 2><-10, 6><1, 7><-6, 1><-5, 1>

<-7, 3><1, 8><-5, 2><-5, 3><-5, 0><-7, 13><8, 2><-6, 1><-5, 1>

<-7, 14><1, 9><-5, 2><-5, 3><-5, 0><-5, 1>

<-7, 14><1, 10><-5, 2><-7, 3><1, 11><-5, 3><-5, 0><-6, 1><-5, 1>

<-7, 0><1, 12><-5, 2><-7, 3><1, 13><-6, 2><-7, 2><1, 14><-5, 3><-6, 1>

<-7, 1><1, 15><-5, 2><-7, 0><1, 16><-6, 2><-7, 0><1, 17><-5, 3><-6, 1>

<-7, 14><1, 18><-5, 2><-5, 3>

<-5, 0>

<-7, 1><1, 19><-6, 2><1, 20><-6, 2><1, 21><-6, 1>

<-7, 0><1, 22><-10, 6><5, 3><-6, 1>

<1, 21><-10, 6><6, 4><-6, 1>

<1, 20><-10, 6><6, 5><-6, 1>

<1, 19><-10, 6><6, 6><-6, 1>

<1, 5><-5, 2><5, 3><-6, 2><1, 21><-5, 3><-6, 1>

<1, 22><-10, 6><1, 12><-5, 2><1, 1><-6, 2><1, 4><-5, 3><-6, 1>

<-7, 7><1, 22><2, 4><5, 7>

<-5, 0>

<-7, 8><5, 3><-6, 0>

<1, 3><-10, 6><1, 15><-5, 2><1, 0><-6, 2><1, 22><-5, 3><-6, 1>

<-7, 8><5, 8><-6, 0>

<-5, 0><1, 5><-5, 2><1, 22><-6, 2><1, 20><-5, 3><-6, 1><1, 3><-10, 6><1, 19><-6, 1><-5, 1>

<-5, 1>

<-5, 1>

<-7, 0><1, 12><-5, 2><-7, 3><1, 13><-6, 2><-7, 2><1, 14><-5, 3>

<-5, 0>

<-7, 0><1, 23><-10, 6><5, 9><-6, 1>

<-7, 4><-5, 2><-5, 2><1, 14><4, 4><9, 10><-5, 3><3, 5><-5, 2><1, 14><4, 2><9, 11><-5, 3><3, 6><1, 13><-5, 3>

<-7, 5><-7, 13><1, 23><2, 4><5, 12><2, 1><5, 8><-6, 1>

<-7, 13><1, 23><-6, 1>

<-5, 1>

<-7, 1><1, 15><-5, 2><-7, 0><1, 16><-6, 2><-7, 0><1, 17><-5, 3>

<-5, 0>

<-7, 13><1, 16><2, 3><1, 17><2, 2><5, 13><-6, 1>

<-5, 1>

<-7, 14><1, 24><-5, 2><-5, 3>

<-5, 0>

<-7, 0><1, 25><-10, 6><7, 14><-6, 1>

<-7, 0><1, 26><-6, 2><1, 27><-6, 1>

<-7, 1><1, 28><-6, 1>

<1, 5><-5, 2><1, 25><-6, 2><6, 15><-5, 3><-6, 1>

<1, 27><-10, 6><5, 3><-6, 1>

<-7, 9><1, 26><-7, 10><5, 3><-7, 11><5, 12><-7, 12><5, 8>

<-5, 0>

<-7, 4><-5, 2><1, 0><4, 3><1, 26><3, 6><1, 0><4, 0><5, 16><-5, 3>

<-7, 5><-5, 0><1, 0><-10, 6><1, 0><2, 0><5, 8><-6, 1><1, 28><-10, 6><1, 15><-5, 2><1, 26><-6, 2><1, 0><-5, 3><-6, 1><-5, 1>

<-7, 4><-5, 2><1, 27><4, 5><5, 3><3, 5><1, 27><4, 1><5, 12><-5, 3>

<-7, 5><1, 28><-10, 6><1, 15><-5, 2><1, 27><-6, 2><1, 0><-5, 3><-6, 1>

<-7, 6>

<1, 28><-10, 6><1, 15><-5, 2><1, 27><-6, 2><5, 13><-5, 3><-6, 1>

<1, 27><-10, 6><1, 27><2, 1><5, 8><-6, 1>

<-5, 1>

<-5, 1>

ПФЗ

long a7x init bool b8sd init L_F = double a7f init double a0f init litera c8s init \c = a7xn long a7fn double 2 void m2proc func { a7x a7xn = a7f a7fn = } 0 bool t5rue func { L_T ret } 0 void a9gfdsdfsd func { } f8f bool 1 void b8fsd func { } a8fd bool a9ccc litera 2 long a5func func definition a2d long b2d long 2 double m8func func definition 0 void f8func func { double g8d init double g7d init double g6d init long a1cd init 0 = g6d.5 = g7d 0.12 = g8d 8. = 0 g6d 2 m2proc call a1cd b8sd c8s 2 a5func call = SwitchResult1 a1cd 5 % initSwitch 0 SwitchResult1 != LabelEndCase1_0 JmpF a0f a7x a1cd 2 m8func call = LabelEndCase1_0: 1 SwitchResult1 != LabelEndCase1_1 JmpF { a1cd g7d 2 m2proc call a0f g8d = } LabelEndCase1_1: } a8fd bool a9ccc litera 2 long a5func func { long n3n init 25 = a9ccc a >= a9ccc z <= && a8fd || ! LabelElse1 JmpF n3n 10 % 1 + ret LabelEndIf1 Jmp LabelElse1: LabelEndIf1: n3n ret } a2d long b2d long 2 double m8func func { a2d b2d / 100 * ret } 0 void m0mainfunc func { long s7a init 0s6 = long i1i init long k2k init double d8result init s7a 1.0 2 m2proc call k2k 0 = i1i 0 = LabelCycle1: { a7x i1i > a7x 7 == || ! LabelElse1 JmpF { a7x a7x 1 - = d8result i1i a7x 2 m8func call = } LabelEndIf1 Jmp LabelElse1: LabelEndIf1: k2k 0 != k2k 10 < && ! LabelElse1 JmpF d8result k2k a7x 2 m8func call = LabelEndIf1 Jmp LabelElse1: d8result k2k 100 2 m8func call = LabelEndIf1: k2k k2k 1 + = } i1i i1i 1 + = i1i 10 <= LabelCycle1 JmpF }

10.  Выводы

В результате выполнения курсовой работы был разработан учебный си-подобный язык, разработана система регулярных выражений, определяющая лексику заданного языка, разработана совокупность действий, реализующая: поиск в таблицах идентификаторов/констант и пополнение таблиц и формирование лексем, построен лексический анализатор.

Разработана формальная грамматика языка класса LL(1), определяющая синтаксис заданного языка, разработано расширение синтаксического акцептора для преобразования последовательности лексем в постфиксную запись.

Выполнение данной работы позволило применить на практике теоретические основы проектирования трансляторов с языков программирования и освоить средства автоматизации построения трансляторов.

11.  Использованная литература

1.  Малявко формальных языков / Учебное пособие, Ч.1,2,3. – Новосибирск: Изд-во НГТУ, .

2.  Малявко программное обеспечение ЭВМ. Трансляторы. / Методические указания. – Новосибирск: Изд-во НГТУ, 2006.