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

Автор: Пользователь скрыл имя, 19 Мая 2012 в 17:24, курсовая работа

Краткое описание

Теория формальных языков, грамматик и автоматов составляет фундамент синтаксических методов. Основы этой теории были заложены Н. Хомским в 40–50-е годы XX столетия в связи с его лингвистическими работами, посвященными изучению естественных языков. Но уже в следующем десятилетии синтаксические методы нашли широкое практическое применение в области разработки и реализации языков программирования.

Оглавление

Введение 3
1 Постановка задачи 4
2 Формальная модель задачи 5
3 Структура программы………………………………………………….....16
3.1 Лексический анализатор 16
3.2 Синтаксический анализатор 18
3.3 Семантический анализатор 20
3.4 Генерация ПОЛИЗа программы 22
3.5 Интерпритация ПОЛИЗа программы 24
4 Структурная организация данных 31
4.1 Спецификация входной информации 31
4.2 Спецификация выходной информации 31
4.3 Спецификация процедур и функций 31
5 Разработка алгоритма решения задачи 32
5.1 Укрупненная схема алгоритма программного средства 32
5.2 Детальная разработка алгоритмов отдельных подзадач 33
6 Установка и эксплуатация программного средства 34
7 Работа с программным средством 35
Заключение 36
Список использованных источников 37
Приложение А – Текст программы 38

Файлы: 1 файл

отчет3.doc

— 910.50 Кб (Скачать)

 

      

      5 Разработка алгоритма  решения задачи

      5.1 Укрупненная схема  алгоритма программного  средства

          Укрупненная схема алгоритма программного средства представлена на рисунке 5.1.

      

      

      

        
 

        

        

      

        

      

        

      

        

      

        
 
 
 

        
 
 
 
 
 
 
 
 
 
 
 
 
 

Рисунок 5.1 – Укрупненная схема алгоритма программного средства

 

       5.2 Детальная разработка алгоритмов отдельных подзадач

      Схема алгоритма интерпретатора программы:

      Рисунок 5.2 – Схема алгоритма интерпретатора программы

      6 Установка и эксплуатация  программного средства

      Программное средство занимает 2,63 МБ памяти на жестком диске, для работы необходимо 12 000 000 байт оперативной памяти. Чтобы начать работу с программным средством, необходимо запустить приложение «Project1.exe».

      Программное средство находится в папке prog вместе с используемыми файлами, которую достаточно скопировать в нужный каталог. Работает на Windows 95/98/NT/Me/XP/Vista. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

      7 Пример работы программы 
 

 
 
 

 

Заключение

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

      Разработали на языке программирования С++ в системе  Borland С++ Builder 6.0 программное средство «Компилятор модельного языка». В процессе работы над данным программным средством выработал навыки самостоятельного решения инженерных задач. Программное средство способно выполнять следующие функции:

      - ввод и редактирование текста  программ, написанных на определенном  модельном языке;

      - производить лексический анализ программ;

      - выполнять синтаксическую и семантическую  проверку программ;

      - переводить программы в обратную  польскую запись;

      - интерпретировать программы на модельном языке, записанных в форме ПОЛИЗа.

      Программное средство протестировано на различных программах, написанных на модельном языке. Программное средство безошибочно производить лексический анализ программ, выполняет синтаксическую и семантическую проверку программ, переводить программы в обратную польскую запись, интерпретирует программы на модельном языке, записанных в форме ПОЛИЗа.

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

 

Список  использованных источников 

      1 Ахо, А.В. Компиляторы: принципы, технологии и инструменты [Текст]: / А. Ахо, Р. Сети, Д. Ульман; перевод с англ. И.В. Красикова и др. - М.: Вильямс, 2001. - 767 с.: ил.; 24 см. - Библиогр.: с. 742-763. - Предм. указ.: 764-767. - 5000 экз. - ISBN 5-8459-0189-8 (в пер.).

      2 Власенко, А.В. Теория языков программирования и методы трансляции [Текст]: учеб. пособие / А.В. Власенко, В.И. Ключко; М-во образования и науки РФ, ГОУ ВПО «Кубан. гос. технол. ун-т». - Краснодар: Изд-во КубГТУ, 2004. - 119 с.: ил.; 21 см. - Библиогр.: с. 118. - 75 экз. - ISBN 5-8333-0176-9.

      3 Гордеев, А.В. Системное программное обеспечение [Текст]: учеб. для вузов / А. В. Гордеев, А.Ю. Молчанов; под. общ. ред. А.В. Гордеева. – СПб.: Питер, 2001. - 734 с.: ил.; 24 см. - Библиогр.: с. 719-724. – 5000 экз. – ISBN 5-272-00341-1 (в пер.).

      4 Ишакова Е.Н. Теория языков  программирования и методов трансляции: учебное пособие / Е.Н. Ишакова. – Оренбург: ИПК ГОУ ОГУ, 2007. – 137 с.-300 экз.- ISBN978-57410-0712-9.

      5 Калинин, А.Г. Универсальные языки программирования: Семантический подход [Текст] / А.Г. Калинин, И.В. Мацкевич. – М.: Радио и связь, 1991. - 398, [1] с.: ил.; 21 см. - Библиогр.: с. 395-398. – 10000 экз. – ISBN 5-256-00638-X (в пер.). 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

    Приложение  A

    Текст программы

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

#include <fstream.h>

#include <string.h>

#include <ctype.h>

#include "array.cpp"

#include <string.h>

#include <stdlib.h>

#include <math.h>

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner){}

//=================================1=========================================

//символ считываемый

char CH;

//структура мантиса  и порядок

struct strB{ long m;   int p;};

strB B;

array <char> S(0); // для  накапливания символов определяемого  слова

array <char> text(0); //для  хранения текста программы

array <AnsiString> slova(0);

array <AnsiString> ogran(0);

array <AnsiString> chisla(0);

array <strB> NUM(0);

array <AnsiString> ident(0);

enum typeCS1 {lA,lB,lC,lD,lE,lF,lJ,lO,lCHISLO,lERR,lEND}; //состояния автомата

enum typeCS2 {l0,l1,l2,l3,l4,l5,l6,l7,ERR,V}; //состояние автомата определения чисел

typeCS1 CS1;typeCS2 CS2;

int finstr=0;

//---------------------------------------------------------------------------

int let() {return isalpha(CH);}

int digit() {return isdigit(CH);}

int hexdigit() {return (digit()||CH=='A'||CH=='B'||CH=='C'||CH=='D'||CH=='E'||CH=='F'||CH=='a'||CH=='b'||CH=='c'||CH=='d'||CH=='e'||CH=='f');}

int nomersymbol=0;

int gc() {if(nomersymbol<text.gsize()) {CH=text[nomersymbol]; nomersymbol++; return 0;}

          else {CH=' ';return 1;}}

void retgc(){nomersymbol--;}

//---------------------------------------------------------------------------

void AddTab(int numT){

AnsiString temp="";

for (int i=0;i<S.gsize();i++) temp+=S[i];

switch (numT)

        {

        case 3: {chisla.push(temp);}break;

        case 4: {ident.push(temp);}break; }}

//---------------------------------------------------------------------------

struct TL{int t;int n;};

//---------------------------------------------------------------------------

array <TL> lec(0);

//---------------------------------------------------------------------------

void outlec(int numT,int numL){

TL l;  t=numT; l.n=numL; lec.push(l);

AnsiString temp="(";

temp+=numT; temp+=',';temp+=numL;temp+=')';temp+=' ';

for (int i=0;i<S.gsize();i++) temp+=S[i];

Form1->Memo1->Lines->Add(temp);

finstr++;}

//---------------------------------------------------------------------------

int AnalizeChislo(){

CS2=l0;

int syscount=10;

S.erase(); bool znak=true;

int por=0;

do switch (CS2)

        {case l0:{B.m=0; B.p=0;

                if(digit()) CS2=l3; if(CH=='.') {CS2=l1; S.push(CH);}}break;

        case l1:{gc(); if(digit()) {B.p--; B.m=B.m*10+atoi(&CH); CS2=l2; S.push(CH);}

                else CS2=ERR;} break;

        case l2:{gc();

                AnsiString og=""; og+=CH;

                if(digit()) {B.p--; B.m=B.m*10+atoi(&CH); S.push(CH);}

                else if (CH=='E'||CH=='e') {CS2=l5; S.push(CH);}

                else if (ogran.find(og)>=0||CH=='\n') {CS2=V;  retgc();}

                else CS2=ERR;

                if (!digit()) while(B.m%10==0 && B.m!=0) {B.m=B.m/10; B.p++;}

                } break;

        case l3:{AnsiString mantisa="";

                if (CH=='1'||CH=='0') {while(CH=='1'||CH=='0') {S.push(CH);gc();} syscount=2;}

                if (CH<'8'&&CH>='0') {while (CH<'8'&&CH>='0') {S.push(CH);gc();} syscount=8;}

                if (digit()) {while(digit()) {S.push(CH);gc();} syscount=10;}

                gc(); char next=CH; retgc(); retgc(); gc();

                if ((ogran.find(CH)>=0 || CH=='\n' || CH==' ' || CH=='\t')&&syscount<=10 && CH!='.')

                                        {

                                        for (int i=0;i<S.gsize();i++) mantisa+=S[i];

                                        char **q=new char*;

                                        B.m=(long)strtol(mantisa.c_str(),q,10) ;

                                        retgc();

                                        CS2=V;

                                        }

                else if ((ogran.find(next)>=0 || next=='\n' || next==' ' || next=='\t')&&(CH=='b'||CH=='B'||CH=='d'||CH=='D'||CH=='o'||CH=='O'))

                                                {

                                                S.push(CH);

                                                for (int i=0;i<S.gsize()-1;i++) mantisa+=S[i];

                                                char **q=new char*;

                                                CS2=V;

                                                if ((CH=='b'||CH=='B')&&syscount==2) B.m=(long)strtol(mantisa.c_str(),q,2) ;

                                                else if ((CH=='o'||CH=='O')&&syscount<=8) B.m=(long)strtol(mantisa.c_str(),q,8) ;

                                                else if ((CH=='d'||CH=='D')&&syscount<=10) B.m=(long)strtol(mantisa.c_str(),q,10) ;

                                                else CS2=ERR;

                                                }

                else if (CH=='.'&& syscount<=10)

                                {S.push(CH);

                                 for (int i=0;i<S.gsize()-1;i++) mantisa+=S[i];

                                 B.m=mantisa.ToInt();

                                 CS2=l4;} 

                if (CS2==V || CS2==ERR || CS2==l4 ) continue; 

                if (hexdigit()) while(hexdigit()) {S.push(CH);gc();}

                if (CH=='h'||CH=='H')

Информация о работе По теории языков программирования и методов трансляции Разработка компилятора модельного языка