Автор: Пользователь скрыл имя, 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
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
Ишакова Е.Н. Теория языков
программирования и методов
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){}
//============================
//символ считываемый
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,
enum typeCS2 {l0,l1,l2,l3,l4,l5,l6,l7,ERR,
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'||
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+=')'
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!='.')
else if ((ogran.find(next)>=0 || next=='\n' || next==' ' || next=='\t')&&(CH=='b'||CH=='B'
else if (CH=='.'&& syscount<=10)
if (CS2==V || CS2==ERR || CS2==l4 ) continue;
if (hexdigit()) while(hexdigit()) {S.push(CH);gc();}
if (CH=='h'||CH=='H')