Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет по курсовой ТЯП группа.doc
Скачиваний:
0
Добавлен:
27.09.2019
Размер:
219.14 Кб
Скачать

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

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

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

«ЮЖНО-РОССИЙСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

(НОВОЧЕРКАССКИЙ ПОЛИТЕХНИЧЕСКИЙ ИНСТИТУТ)»

ФАКУЛЬТЕТ открытого дистанционного образования

КАФЕДРА программное обеспечение вычислительной техники

СПЕЦИАЛЬНОСТЬ программное обеспечение вычислительной техники и автоматизированных систем

ОТЧЕТ

ПО КУРСОВОЙ РАБОТЕ ПО ПРЕДМЕТУ

«ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ»

НА ТЕМУ

«ЛЕКСИЧЕСКИЙ АНАЛИЗАТОР ПОДМНОЖЕСТВА ЯЗЫКА ПАСКАЛЬ»

Студента 5 курса, группы ПОВТ _______________________________

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

Отчет принят «___» ____________ 2012 г. _________________________

Подпись

НОВОЧЕРКАССК, 2012 г.

ОГЛАВЛЕНИЕ

1. Краткая теория 3

2. Алгоритм распознавания лексем 4

3. Блок-схема алгоритма 4

4

4. Листинг программы 5

5. Результаты работы программы 9

9

6. Заключение 10

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

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

  1. Краткая теория

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

  • замена в программе идентификаторов и констант лексемами делает представление программы удобнее для дальнейшей обработки;

  • уменьшается длина программы, так как из нее устраняются несущественные пробелы и комментарии.

С точки зрения реализации процесса сканирования различают два подхода – прямой и непрямой лексический анализ. При прямом лексическом анализе требуется найти одну из многих лексем, которые заданы в описании данного языка.

Моделью прямого лексического анализатора служит множество работающих параллельно конечных автоматов (КА), каждый из которых распознает лексемы заданного типа. Эти КА можно представить и реализовать как один конечный преобразователь, моделирующий работу всех КА и выдающий сигнал о том, какой из них распознал очередную лексему.

При непрямом лексическом анализе требуется, прочитав цепочку символов, определить, образует ли эта цепочка лексему некоторого конкретного типа. В этом случае сканер работает вместе с синтаксическим анализатором, как некоторая программная процедура.

Распознавание лексем выполняется следующим образом:

  • входная цепочка считывается до тех пор, пока КА не достигнет заключительного состояния;

  • по достижению заключительного состояния КА сигнализирует о нахождению лексемы данного типа и сканер заносит информацию о ней в таблицу имен (символов).

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

  1. Алгоритм распознавания лексем

В данной программе реализовано распознавание пяти типов лексем:

  • зарезервированные слова (var, begin, end, integer, sin, cos, tg),

  • идентификаторы (последовательность буквенных символов, в конце которых могут идти цифры),

  • арифметические операции (+, –, *, /),

  • спецсимволы("(",")"),

  • числа

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

  1. Блок-схема алгоритма

  1. Листинг программы

#include <vcl.h>

#include <stdlib.h>

#pragma hdrstop

#include "Unitl.h"

#pragma package(smartjnit)

#pragma resource "*.dfm"

TF1 *F1;

void Var_ (AnsiString &, bool &);

void Begin_ (AnsiString &, bool &);

void End_ (AnsiString &, bool &);

void Integer_ (AnsiString &, bool &);

void Id_ (AnsiString &, bool &);

void Pr_ (AnsiString &, bool &);

void Dv_ (AnsiString &, bool &);

void Mat_ (AnsiString &, bool &);

void Cos_ (AnsiString &., bool &);

void Sin_ (AnsiString &, bool &);

void Tg_ (AnsiString &, bool &);

void Sk_ (AnsiString &, bool &);

void Ch_ (AnsiString &, bool &);

__fastcall TF1::TFl(TComponent* Owner)

: TForm(Owner) {

}

void VarJAnsiString &s, bool &b1) {

AnsiString s1;

s1 = s.SubString(l, 3);

if (s1 == "var") {

F1 ->Memo2->Lines->Add(" 1 var");

s.Delete(l, 3);

b1 = true;

}

}

void Begin_(AnsiString &s, bool &b2) {

AnsiString s1;

s1 = s.SubString(l, 5);

if (s1 == "begin") {

Fl->Memo2->Lines->Add(" 1 begin");

s.Delete(l, 5);

b2 - true;

}

}

void End_(AnsiString &s, bool &b3) {

AnsiString s1;

s1 = s.SubString(l, 3);

if (s1 =="end") {

F1 ->Memo2->Lines->Add(" 1 end");

s.Delete(l, 3);

b3 = true;

}

}

void Integer_(AnsiString &s, bool &b4) {

AnsiString s1;

s1 = s.SubString(l, 7);

if (s1 == "integer") {

Fl->Memo2->Lines->Add(" 1 integer");

s.Delete(l, 7);

b4 = true;

}

}

void Pr_(AnsiString &s, bool &b5) {

AnsiString s1;

s1 = s.SubString(l, 2);

if (s1 ==":=") {

Fl->Memo2->Lines->Add(" 3 :=");

s.Delete(l, 2);

b5 = true;

}

}

void Dv_(AnsiString &s, bool &b6) {

AnsiString s1;

s1 = s.SubString(l, 1);

if (s1 ==":") {

(Fl->Memo2->Lines->Add(" 3 :");

s.Delete(l, 1);

b6 = true;

}

}

void Mat_(AnsiString &s, bool &b7) {

AnsiString s1, name;

s1 = s.SubString(l, 1);

name = " 4 " + sl;

if ((s1 == "+")||(sl == "-")||(sl == 7")||(sl == "*")) {

F1 ->Memo2->Lines->Add(name); s.Delete(l, 1);

b7 = true;

}

}

void Cos_(AnsiString &s, bool &b8) {

AnsiString s1;

s1 = s.SubString(l, 3);

if (s1 == "cos") {

Fl->Memo2->Lines->Add(" 1 cos");

s.Delete(1, 3);

b8 = true;

}

}

void Sin_(AnsiString &s, bool &b9) {

AnsiString s1;

s1 = s.SubString(l, 3);

if (si == "sin") {

Fl->Memo2->Lines->Add(" 1 sin");

s.Delete(l, 3);

b9 = true;

}

}

void Tg_(AnsiString &s, bool &b10) {

AnsiString s1;

s1 = s.SubString(l, 2);

if (si == "tg") {

Fl->Memo2->Lines->Add(" 1 tg");

s.Delete(l, 2);

b10 = true;

}

}

void Sk_(AnsiString&s, bool &b11) {

AnsiString s1, name;

s1 = s.SubString(l, 1);

name = " 3 " + s1;

if ((s1 == "(")||(s1 == ")")) {

F1 ->Memo2->Lines->Add(name);

s.Delete(l, 1);

b11 = true;

}

}

void Id_(AnsiString &s, bool &b12) {

AnsiString s1, name;

s1 = s.SubString(l, 1);

if ((s1 == "q")||(s1 == "w")||(s1 == "e")||(s1 == "r")||(s1 == "t")||(s1 == "y")||(s1 == "u")||(s1 == "i")||(s1 == "o") ||(s1 == "p")||(s1 == "a")||(s1 == "s")||(s1 == "d")||(s1 == "f )||(s1 == "g")||(s1 ==== "h")||(s1 == "j")||(s1 == "k")

||(s1 == "l")||(s1 == "z")||(s1 == "x")||(s1 == "c")||(s1 == "v")||(s1 == "b")||(s1 == "n")||(s1 == "m")) {

name = s1;

s.Delete(l, 1);

bool b = true;

while ((b)&&(s.Length()>0)) {

s1 = s.SubString(l, 1);

if ((s1 == "q")||(s1 == "w")||(s1 == "e")||(s1 == V)||(s1 == "t")||(s1 == "y")||(s1 == "u")||(s1 == "i")||(s1 ==" ||(s1 == "p")||(s1 == "a")||(s1 == "s")||(s1 == "d")||(s1 == "DIKsl == "g")||(s1 == "h")||(s1 — "j")ll(s1 == "k") ||(s1 == "l")||(s1 == "z")||(s1 == "x")||(s1 == "c")||(s1 == "v")||(s1 == "b")||(s1 == "n")||(s1 == "m")||(s1 == "0") ||(s1 == "l")||(s1 == "2")||(s1 == "3")||(s1 == "4")||(s1 == "5")||(s1 == "6")||(s1 == "7")||(s1 == "8")||(s1 == "9")) {

name = name.Insert(s1,name.Length()+l); s.Delete(l, 1);}

else b = false;

};

name =" 2 " + name;

b12 = true;

F1->Memo2->Lines->Add(name);

}

}

void Ch_(AnsiString &s, bool &b13) {

AnsiString s1, name;

s1 = s.SubString(l, 1);

if ((s1 == "0")||(s1 == "l")||(s1 == "2")||(s1 == "3")||(s1 == "4")||(s1 == "5")||(s1 == "6")||(s1 == "7")||(s1 == "8")

||(s1 == "9")) {

name = s1;

s.Delete(l, 1);

bool b = true;

while ((b)&&(s.Length()>0)) {

s1 =s.SubString(l, 1);

if ((s1 == "0")||(s1 == "l")||(s1 == "2")||(s1 == "3")||(s1 == "4")||(s1 == "5")||(s1 == "6")||(9l == "7")||(s1 == "8")||(s1 == "9")) {

name = name.Insert(s1,name.Length()+l);

s.Delete(l, 1);

}

else b = false;

}

name = " 5 " + name;

b13 = true;

F1->Memo2->Lines->Add(name);

}

}

void __fastcall TFl::AnalizClick(TObject *Sender) {

int n;

n = F1->Memo1->Lines->Count;

// ShowMessage(IntToStr(n));

for (int i = 0; i<n; i++) {

AnsiString st;

bool bo1 = false,

bo2 = false,

bo3 = false,

bo4 = false,

bo5 = false,

bo6 = false,

bo7 = false,

bo8 = false,

bo9 = false,

bo10 = false,

bo11 = false,

bo12 = false,

bo13 = false;

st = Fl->Memol->Lines->Strings[i];

while (st.Length()>0) {

Var_(st,bo1); "

if (st.SubString(l, 1) == " ") {st = st.Delete(l, 1);};

Begin_(st,bo2);

if (st.SubString(l, 1) == " ") {st = st.Delete(l, 1);};

End_(st,bo3);

if (st.SubString(l, 1) == " ") {st = st.Delete(l, 1);};

Integer_(st,bo4);

if (st.SubString(l, 1) == " ") {st = st.Delete(l, 1);};

Pr_(st,bo5);

if (st.SubString(l, 1) == " ") {st = st.Delete(l, 1);};

Dv_(st,bo6);

if (st.SubString(l, 1) == " ") {st = st.Delete(l, 1);};

Cos_(st,bo7);

if (st.SubString(l, 1) == " ") {st = st.Delete(l, 1);};

Sin_(st,bo8);

if (st.SubString(l, 1) == " ") {st = st.Delete(l, 1);};

Tg_(st,bo9);

if (st.SubString(l, 1) == " ") {st = st.Delete(l, 1);};

Sk_(st,bo10);

if (st.SubString(l, 1) == " ") {st = st.Delete(l, 1);};

Id_(st,bo11);

if (st.SubString(l, 1) == " ") {st = st.Delete(l, 1);};

Mat_(st,bo12);

if (st.SubString(l, 1) == " ") {st = st.Delete(l, 1);};

Ch_(st,bo13);

if (st.SubString(l, 1) == " ") {st = st.Delete(l, 1);};

if((!bol)&&(!bo2)&&(!bo3)&&(!bo4)&&(!bo5)&&(!bo6)&&(!bo7)&&(!bo8)&&(!bo9)&&(!bo10)&&(!bo11)&&(!bo12)&&(!bol3)) {

st = st.Delete(l, 1);

}

}

}

}

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

void __fastcall TF1::FormActivate(TObject *Sender) {

Fl->Memo2->Lines->Add("Тип лексемы Значение");

}