Главная страница
Навигация по странице:

  • 4.3 Спецификация процедур и функций

  • 5 Разработка алгоритма решения задачи 5.1 Укрупненная схема алгоритма программного средства

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

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

  • 7 Пример работы программы Заключение

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

  • Приложение A Текст программы

  • курсовая 2. 1 Постановка задачи 4 2 Формальная модель задачи 5


    Скачать 0.89 Mb.
    Название1 Постановка задачи 4 2 Формальная модель задачи 5
    Дата27.11.2021
    Размер0.89 Mb.
    Формат файлаdoc
    Имя файлакурсовая 2.doc
    ТипРеферат
    #283891
    страница3 из 4
    1   2   3   4

    4 Структурная организация данных
    4.1 Спецификация входной информации

    объявления

    Пояснения

    array text(0);

    Для хранения текста программы

    array slova(0);

    Массив для хранения служебных слов

    array ogran(0);

    Массив для хранения разделителей

    AnsiString FILE_NAME;

    Имя открытого файла


    4.2 Спецификация выходной информации

    объявления

    пояснения

    array chisla(0);

    Массив чисел в текстовом варианте

    array NUM(0);

    Массив чисел (внутреннее представление)

    array ident(0);

    Массив для хранения идентификаторов

    array lec(0);

    Массив лексем

    Form1->Memo3->Lines;

    Поле возвращает коды синтаксических и семантических ошибок, а также ПОЛИЗ

    Form1->Memo4->Lines;

    Поле возвращает обратный диалог при интерпретации ПОЛИЗ


    4.3 Спецификация процедур и функций

    объявления

    пояснения

    AnalizeChislo

    Распознает числа

    LAnalize

    Производит лексический анализ

    ident_to

    Строит и обрабатывает таблицу идентификаторов

    typelec

    Возвращает тип лексемы

    Poliz

    Находит полиз программы

    errt

    Обрабатывает ошибки в коде программы

    SinAnalize

    Производит синтаксический анализ

    INP

    Производит запись значения идентификаторов

    OUTP

    Производи вывод результатов работы программы

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

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

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












    1 – лекс анализ

    2 – Син и Сем анализы

    3 - ПОЛИЗ

    4 - интерпритатор





    1




    2






    3






    4








    Рисунок 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

    #pragma hdrstop

    #include "Unit1.h"

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

    #pragma package(smart_init)

    #pragma resource "*.dfm"

    #include

    #include

    #include

    #include "array.cpp"

    #include

    #include

    #include

    TForm1 *Form1;

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

    __fastcall TForm1::TForm1(TComponent* Owner)

    : TForm(Owner){}

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

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

    char CH;

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

    struct strB{ long m; int p;};

    strB B;

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

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

    array slova(0);

    array ogran(0);

    array chisla(0);

    array NUM(0);

    array 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
    else {CH=' ';return 1;}}

    void retgc(){nomersymbol--;}

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

    void AddTab(int numT){

    AnsiString temp="";

    for (int i=0;i
    switch (numT)

    {

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

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

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

    struct TL{int t;int n;};

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

    array 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
    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
    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
    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
    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')

    {

    for (int i=0;i
    S.push(CH);

    char **q=new char*;

    CS2=V;

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

    }

    else if (CH=='+'||CH=='-')

    {S.push(CH);

    int flag=0;

    for (int j=0;j
    if (S[S.gsize()-2]!='E'&&S[S.gsize()-2]!='e') flag=1;

    if (flag) {CS2=ERR; continue;}

    for (int i=0;i
    B.m=mantisa.ToInt();

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

    if (CH=='-')znak=false;

    CS2=l5;}

    else if (ogran.find(CH)>=0 || CH=='\n' || CH==' ' || CH=='\t')

    {int Ne,flag=0;

    for (Ne=0;Ne
    if (Ne==S.gsize() || Ne==S.gsize()-1 || Ne==0) {CS2=ERR; continue;}

    for (int j=0;j
    for (int j=Ne+1;j
    if (flag) {CS2=ERR; continue;}

    for (int i=0;i
    B.m=mantisa.ToInt();

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

    mantisa="";

    for (int i=Ne+1;i
    B.p+=mantisa.ToInt();

    retgc();

    CS2=V;}

    else CS2=ERR;

    } break;

    case l4:{

    gc();

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

    else if (ogran.find(CH)>=0 || CH=='\n')

    {CS2=V;

    retgc();

    }

    else CS2=ERR;

    } break;

    case l5:

    {

    gc();

    if(digit()) {CS2=l7; S.push(CH); por=atoi(&CH);}

    else if(CH=='+') {CS2=l6; S.push(CH);}

    else if (CH=='-') {znak=false; CS2=l6; S.push(CH);}

    else CS2=ERR;

    } break;

    case l6:

    {

    gc();

    if(digit()) {CS2=l7; S.push(CH); por=atoi(&CH);}

    else CS2=ERR;

    } break;

    case l7:

    {

    gc();

    if(digit()) {por=por*10+atoi(&CH); S.push(CH);}

    else if (ogran.find(CH)>=0 || CH=='\n') {if(znak) B.p+=por; else B.p-=por;

    CS2=V; retgc();}

    else CS2=ERR;

    } break;
    case ERR:

    {

    Form1->Memo1->Lines->Add("Ошибка вo втором автомате");

    return 1;

    } break;
    case V:

    {

    AnsiString a="",b=""; int i;

    for(int i=0;i
    b+=B.m; b+=" "; b+=B.p;

    for (i=0;i
    if (NUM.gsize()==i) NUM.push(B);

    S.erase();

    for(int i=0;i
    int nomer=chisla.find(b);

    if (nomer>=0) outlec(3,nomer+1);

    else {

    outlec(3,chisla.gsize()+1);

    AddTab(3);}

    return 0;

    } break;
    }

    while (CS1!=lEND);

    }
    //---------------------------------------------------------------------------

    void LAnalize()

    {

    CS1=lA;

    do switch (CS1)

    {

    case lA:{

    S.erase();

    if(gc()) {CS1=lEND; continue;}

    if(digit()||CH=='.') CS1=lCHISLO ;

    else if (let()) CS1=lB;

    else CS1=lE;

    S.push(CH);

    break; }

    case lB:{

    gc();

    if(digit()||let()) S.push(CH);

    else {CS1=lC;

    retgc();

    };

    } break;

    case lC:{

    AnsiString slovo="";

    for (int i=0;i
    int nomer=slova.find(slovo); int fl;

    if (slovo=="end") {outlec(1,nomer+1);

    fl=gc();

    if(CH=='.'&& fl==0)

    {S.erase();

    S.push('.');

    outlec(2,ogran.find(".")+1);

    CS1=lEND;}

    else CS1=lERR;

    }

    else if (nomer>=0)

    {outlec(1,nomer+1);

    CS1=lA;

    }

    else CS1=lD;

    } break;

    case lD:{

    AnsiString id="";

    for (int i=0;i
    id+=S[i];

    int nomer=ident.find(id);

    if (nomer>=0)

    {outlec(4,nomer+1);

    CS1=lA;

    }

    else {

    outlec(4,ident.gsize()+1);

    AddTab(4);

    CS1=lA;

    }

    } break;

    case lE:{

    AnsiString o=""; o+=CH;

    if (CH==' ' || CH=='\t') {CS1=lA; continue;}

    else if(CH=='>'||CH=='<')

    {

    gc();

    if(CH=='>'||CH=='=')

    {o+=CH;

    if(ogran.find(o)>=0) {S.push(CH); outlec(2,ogran.find(o)+1); CS1=lA;}

    else CS1=lERR;

    }

    else { retgc();

    if(ogran.find(o)>=0) {outlec(2,ogran.find(o)+1); CS1=lA;}

    else CS1=lERR;

    }

    }

    else if (CH=='{')

    {

    CS1=lERR;

    while (CH!='}'&& gc()==0);

    if(CH=='}') CS1=lA;

    }

    else if (CH=='}'){CS1=lERR;}

    else {if (CH=='\n') o="13";

    if(ogran.find(o)>=0) {outlec(2,ogran.find(o)+1); CS1=lA;}

    else {CS1=lERR;}}

    } break;

    case lCHISLO:

    {if(AnalizeChislo()) CS1=lEND;

    else CS1=lA;} break;

    case lERR:

    {

    CS1=lEND;

    Form1->Memo1->Lines->Add("Ошибка в первом автомате");

    } break;
    }

    while (CS1!=lEND);

    }

    //=================================3.1=======================================

    //---------------структура для хранения расширенной таблицы идентификаторов--

    struct Identificator

    {

    AnsiString id;

    AnsiString type;

    strB zn;

    };

    //---------------таблица идентификаторов расширенная ------------------------

    array
    1   2   3   4


    написать администратору сайта