Описание синтаксиса языка с помощью формальных грамматик

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 05.04.2016
Размер файла 251,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

СОДЕРЖАНИЕ

Введение

1. Теоретическая часть

1.1 Приведение КС-грамматики к нормальному виду

1.2 Преобразования грамматик

1.3 Алгоритм удаления недостижимых символов

2. Описание кода программы

2.1 Анализ

2.2 Удаление бесплодных символов

2.3 Устранение недостижимых символов

2.4 Выход из программы

3. Руководство пользователя

Заключение

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

Приложение. Полный код программы

ВВЕДЕНИЕ

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

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

Описание синтаксиса языка дается исключительно средствами формальных грамматик.

Формальный метод синтаксического анализа устанавливает свойства формальных грамматик, которые определяются исходя из правил, составляющих формальные грамматики.

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

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

Распознаватель, используя данные извлеченные из формальной грамматики, выполняет действия, которые соответствуют синтаксической структуре самого текста.

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

Описание синтаксиса в виде формальных грамматик является ее исходным текстом.

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

Одна и та же программа может быть написана разными способами, т.е. идея воплощенная и реализованная на формальном языке можно реализовать множеством способов. Программа пишется содержательно, не существует формальных методов разработки программ. Невозможно определить формальными методами - эквивалентны ли две программы с точки зрения результата программы. Один и тот же синтаксис можно реализовать в виде множества формальных грамматик. Синтаксис преобразуется в формальную грамматику содержательно. Общим недостатком формальных языков является отрыв формальных грамматик от синтаксиса. Обычно формальная грамматика изучается как некоторая данность, а не результат программирования определенного синтаксиса.

Из всех классов формальных грамматик только КС грамматики продуктивно используются в синтаксическом анализе. Они дают дополнительный смысл понятию нетерминальный смысл.

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

Основные понятия и определения.

Алфавит - это конечное множество символов.

Например, алфавит

A = {a, b, c, +,!}

содержит 5 букв, а алфавит

B = {00, 01, 10, 11}

содержит 4 буквы, каждая из которых состоит из двух символов.

Цепочкой символов в алфавите V называется любая конечная последовательность символов этого алфавита.

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

Более формально цепочка символов в алфавите V определяется следующим образом:

1) - цепочка в алфавите V;

2) если б - цепочка в алфавите V и a - символ этого алфавита, то бa или а - цепочка в алфавите V;

3) в - цепочка в алфавите V тогда и только тогда, когда она является таковой в силу (1) и (2).

Если б и в - цепочки, то цепочка бв называется конкатенацией (или сцеплением) цепочек б и в.

Например, если

б = ab

в = cd,

то

бв = abcd.

Для любой цепочки б всегда

б = б = б.

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

Обращение цепочки б будем обозначать бR.

Например, если

б = abcdef,

то

бR = fedcba.

Для пустой цепочки:

= R.

n-ой степенью цепочки б (будем обозначать бn) называется конкатенация n цепочек б

б0 = ; бn = ббn-1 = бn-1б.

Длина цепочки - это число составляющих ее символов.

Например, если

б = abcdefg,

то длина б равна 7.

Длину цепочки б будем обозначать |б|. Длина равна 0.

Язык в алфавите V - это подмножество цепочек конечной длины в этом алфавите.

Обозначим через V* множество, содержащее все цепочки в алфавите V, включая пустую цепочку .

Например, если V={0,1}, то

V* = {, 0, 1, 00, 11, 01, 10, 000, 001, 011,. }.

Обозначим через V+ множество, содержащее все цепочки в алфавите V, исключая пустую цепочку .

Следовательно,

V* = V+ U {}.

Ясно, что каждый язык в алфавите V является подмножеством множества V*.

Известно несколько различных способов описания языков. Один из них использует порождающие грамматики. Именно этот способ описания языков используется чаще всего.

1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

1.1 Приведение КС-грамматики к нормальному виду

Приведенные грамматики - это КС-грамматики, которые не содержат недостижимых и бесплодных символов, циклов и -правил («пустых» правил). Приведенные грамматики называют также КС-грамматиками в каноническом виде.

Для того, чтобы преобразовать произвольную КС-грамматику к приведенному виду, необходимо выполнить следующие действия:

- удалить все бесплодные символы;

- удалить все недостижимые символы;

- удалить -правила;

- удалить цепные правила.

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

1.2 Преобразования грамматик

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

Определение: символ A є VN называется бесплодным в грамматике

G = (VT, VN, P, S),

если множество { | є VT*, A => } пусто.

Определение: символ x є (VT U VN) называется недостижимым в грамматике

G = (VT, VN, P, S),

если он не появляется ни в одной сентенциальной форме этой грамматики.

Алгоритм удаления бесплодных символов

Вход: КС-грамматика

G = (VT, VN, P, S).

Выход: КС-грамматика

G' = (VT, VN', P', S),

не содержащая бесплодных символов, для которо

L (G) = L (G').

Метод:

Рекурсивно строим множества N0, N1,.

N0 = , i = 1.

Ni = {A | (A > ) є P и є (Ni-1 U VT) *} U Ni-1.

Если Ni ? Ni-1, то

i = i+1

и переходим к шагу 2, иначе

VN' = Ni; P'

состоит из правил множества P, содержащих только символы из

VN' VT; G' = (VT, VN', P', S).

1.3 Алгоритм удаления недостижимых символов

Вход: КС-грамматика

G = (VT, VN, P, S)

Выход: КС-грамматика

G' = (VT', VN', P', S),

не содержащая недостижимых символов, для которой

L (G) = L (G').

Метод:

V0 = {S}; i = 1.

Vi = {x | x є (VT U VN), (A > x) P и A є Vi-1} U Vi-1.

Если

Vi ? Vi-1,

То

i = i+1

и переходим к шагу 2, иначе

VN' = Vi VN;

VT' = Vi VT; P'

состоит из правил множества P, содержащих только символы из Vi;

G' = (VT', VN', P', S).

Удаление символов сопровождается удалением правил вывода, содержащих эти символы.

Если в этом алгоритме переставить шаги (1) и (2), то не всегда результатом будет правильным.

В качестве примера рассмотрим контекстно-свободную грамматику G с правилами

S > U, S > VZ, T > aa, T > bb, U > aUa, U > bUb, V > aTb, V > bTa, W > YZY, W > aab, X > Xa, X > Xb, X > е, Y > YY, Y > aU, Y > е, Z > W, Z > b.

Удалив четыре правила, содержащие бесплодный символ U, получим грамматику G1:

S > VZ, T > aa, T > bb, V > aTb, V > bTa, W > YZY, W > aab, X > Xa, X > Xb, X > е, Y > YY, Y > е, Z > W, Z > b.

В ней символ X является недостижимым. Удалив три правила, содержащие X, получим грамматику G2 с правилами:

S > VZ, T > aa, T > bb, V > aT b, V > bT a, W > YZY, W > aab, Y > YY, Y > е, Z > W, Z > b.

Очевидно,

L (G) = L (G2)

и грамматика G2 не содержит бесплодных и недостижимых символов.

Преобразование не укорачивающих грамматик

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

Определение. Правило вида A > называется "пустым" (аннулирующим) правилом.

Определение. Грамматика называется не укорачивающей или грамматикой без "пустых" правил, если либо

1) схема грамматики не содержит аннулирующих правил,

2) либо схема грамматики содержит только одно правило вида S > , где S - начальный символ грамматики, и символ S не встречается в правых частях остальных правил грамматики.

Для грамматик, содержащих аннулирующие правила, справедливо следующее утверждение.

Утверждение. Для каждой КС-грамматики G', содержащей аннулирующие правила, можно построить эквивалентную ей не укорачивающую грамматику G, такую что L (G') =L (G).

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

Если же в грамматике есть правило вида S > , где S - начальный символ грамматики, и символ S входит в правые части других правил грамматики, то следует ввести новый начальный символ S' и заменить правило S > двумя новыми правилами: S' > и S'> S.

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

G ({a,b}, {S}, P = { S > aSbS, S > bSaS, S > }, S).

Выполняя все возможные замены символа S в первом правиле грамматики, получаем четыре правила вида:

S > aSbS, S > abS, S > aSb, S > ab.

Поступая аналогично со вторым правилом, имеем:

S > bSaS, S >baS, S > bSa, S > ba.

Учитывая, что начальный символ, образующий аннулирующее правило, входит в правые части других правил грамматики, заменим правило S > правилами вида S' > и S' > S.

Построенная совокупность правил образует множество правил искомой не укорачивающей грамматики.

S' > S | , S > aSbS | abS | aSb | ab | bSaS | baS | bSa | ba

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

2. ОПИСАНИЕ КОДА ПРОГРАММЫ

2.1 Анализ

Полный код программы можно посмотреть в Приложении А. Рассмотрим наиболее важные части кода.

Интерфейс программы прост и интуитивно понятен

type

TForm1 = class(TForm)

Memo1: TMemo;

Memo2: TMemo;

Button1: TButton;

XPManifest1: TXPManifest;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Из выше приведенной части кода программы понятно, что интерфейс программы состоит в основном из двух окон и четырех кнопок.

Для хранения правил используется массив из строк. В программе этот массив носит глобальное имя P. Массив Р может вместить максимум 40 строк.

p: array [0..40] of string;

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

В программе предусмотрено множество mn для хранения нетерминальных (вспомогательных) символов.

if p[i,j] in ['A'..'Z'] then mn[i]:=mn[i]+[P[i,j]];

Для выделения множества нетерминалов просматривается каждое правило и заглавные буквы латинского алфавита, встречающиеся в правилах, автоматически относятся к нетерминалам. Т.к. тип «множество» содержит неповторяющиеся элементы, то в mn соберутся элементы только по одному разу.

Правила видимо записываются так «символ»>«слово». Таким образом, правая часть правила начинается с 3 символа, поэтому и всю работу с правилом начинаем с третьего символа.

2.2 Удаление бесплодных символов

Запуск выполнения программой алгоритма удаления бесплодных символов осуществляется нажатием кнопки Button2. При нажатии кнопки запускается процедура procedure Button2Click(Sender: TObject). При выполнении процедуры данные подгружаются из окна Memo2. Именно в это же окно и выгружается результат алгоритма удаления бесплодных символов. Сам алгоритм удаления бесплодных символов реализован в следующей процедуре:

procedure TForm1.Button2Click(Sender: TObject);

var vn2: set of Char;

begin

begin

v:=Memo2. Lines. Count;

for i:=0 to v do p[i]:='';

for i:=0 to v do begin p[i]:=Memo2. Lines[i];

mn [i]:=[];

for j:=3 to Length (p[i]) do

if p[i,j] in ['A'..'Z'] then mn [i]:=mn [i] + [P[i,j]];

end;

Memo2. Clear;

vn:=[];

for i:=0 to v-1 do if mn[i]=[] then vn:=vn+[p[i,1]];

vn2:=[];

j:=0;

while vn<>vn2 do begin

vn:=vn2;

for i:=0 to V-1 do

if (mn[i]-vn=[])

then vn2:=vn2+vn+[p[i,1]];

end;

for i:=0 to v do

for j:=1 to Length (p[i]) do

if Length (p[i])>2 then if (not (p[i,j] in vn)) and (p[i,j] in ['A'.. 'Z']) then p[i]:='';

for i:=0 to v do begin mn[i]:=[];

for j:=3 to Length (p[i]) do if p[i,j] in ['A'..'Z'] then mn[i]:=mn[i]+[p[i,j]];

if Length (p [i])>2 then Memo2. Lines. Add (p[i]);

end;

for i:=0 to v do p[i]:='';

for i:=0 to Memo2. Lines. Count do begin p[i]:=Memo2. Lines[i];

mn[i]:=[];

for j:=3 to Length (p[i]) do

if p[i,j] in ['A'..'Z'] then mn[i]:=mn[i]+[P[i,j]];

end;

end;

end;

2.3 Устранение недостижимых символов

В связи с тем, что программа обязательно должна выполняться последовательно, невозможно приступить к удалению недостижимых символов без удаления бесплодных. Запуск алгоритма устранения недостижимых символов осуществляется кнопкой Button3. Нажатием этой кнопки мы осуществляем запуск процедуры procedure Button3Click(Sender: TObject). При выполнении процедуры алгоритма устранения недостижимых символов данные подгружаются из окна Memo2 без бесплодных символов. Результаты выгружаются так же в окно Memo2 только уже и без бесплодных и без недостижимых символов. Сам алгоритм удаления недостижимых символов описан в этом блоке:

procedure TForm1.Button3Click(Sender: TObject);

begin

v:=Memo2. Lines. Count;

for i:=0 to v do p[i]:='';

for i:=0 to v do begin p[i]:=Memo2. Lines[i];

mn[i]:=[];

for j:=3 to Length(p[i]) do

if p[i,j] in ['A'..'Z'] then mn[i]:=mn[i]+[P[i,j]];

end;

Memo2. Clear;

vn:=[];

for i:=0 to 3 do

if Length (p[i])>1 then begin vn:=vn+[p[i,1]]+mn[0];Break;end;

m:=0;

while m<4 do begin

for i:=0 to v do

if Length(p[i])>2 then

if p[i,1] in vn then vn:=vn+mn[i];

Inc(m);

end;

for i:=0 to v do

for j:=0 to Length(p[i]) do

if Length(p[i])>2 then if (not(p[i,j]in vn)) and (p[i,j] in ['A'..'Z']) then p[i]:='';

for i:=0 to v do

if Length(p[i])>2 then Memo2. Lines. Add(p[i]);

for i:=0 to v do p[i]:='';

for i:=0 to Memo2. Lines. Count do begin p[i]:=Memo2. Lines[i];

mn[i]:=[];

for j:=3 to Length(p[i]) do

if p[i,j] in ['A'..'Z'] then mn[i]:=mn[i]+[P[i,j]];

end;

end;

2.4 Выход из программы

Для корректного завершения программы в программе присутствует кнопка Button4. Этой кнопкой запускается процедура закрытия программы.

procedure TForm1.Button4Click(Sender: TObject);

begin

close;

end;

3. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

1. Запускаем программу Грамматика.exe. На экране появится окно, показанное на рисунке 1.

Рисунок 1. - Начальное окно программы «Грамматика»

2. В левое окно программы вводим какие-нибудь правила. После каждого введенного правила необходимо нажимать клавишу «Ввод». В результате окно программы примет вид как на рисунке 2.

Рисунок 2. - Ввод правил

3. Для анализа грамматики необходимо нажать кнопку с № 1. После нажатия данной кнопки в правом окне программы появятся результаты проверки грамматики. Итог проделанных действий представлен на рисунке 3.

Рисунок 3. - Вывод результатов проверки грамматики

4. Теперь для того, чтобы из полученных результатов удалить бесплодные символы необходимо нажать кнопку № 2. Данная кнопка на рисунке 4 «подсвечена» голубым цветом.

Рисунок 4. - Устранение бесплодных символов

5. Для устранения недостижимых символов нажмите кнопку № 3. На рисунке 5 указанная кнопка обозначена голубой рамкой.

Рисунок 5. - Устранение недостижимых символов

6. Завершение программы «Грамматика» осуществляется одним нажатием кнопки «Выход».

ЗАКЛЮЧЕНИЕ

грамматика символ программный продукт

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

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

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

- преобразования, связанные с исключением из грамматики избыточных правил и символов, без которых она может существовать (именно эти преобразования позволяют выполнить упрощения правил);

- преобразования, в результате которых изменяется вид и состав правил грамматики, при этом грамматика может дополняться новыми правилами, а ее словарь нетерминальных символов - новыми символами (преобразования не связаны с упрощениями).

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

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

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Джек Креншоу. Давайте создадим компилятор! - М.: Самиздат, 1995. - 135 с.

2. Мозговой М.В. Классика программирования: алгоритмы, языки, автоматы, компиляторы. Практический подход. - СПб.: Наука и Техника, 2006. - 320 с.

3. Теория и реализация языков программирования: Учебное пособие. / В.А. Серебряков, М.П. Галочкин, Д.Р. Гончар, М.Г. Фуругян. - М.: МЗ Пресс, 2006. - 352 с.

ПРИЛОЖЕНИЕ. ПОЛНЫЙ КОД ПРОГРАММЫ

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, XPMan;

type

TForm1 = class(TForm)

Memo1: TMemo;

Memo2: TMemo;

Button1: TButton;

XPManifest1: TXPManifest;

Button2: TButton;

Button3: TButton;

Button4: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

i,m,n,j,v,k,l: Integer;

s,s1: string;

p: array [0..40] of string;

vn,vt,k1,k2,mm: set of Char;

mn: array [0..25] of set of Char;

c: Char;

r: array [1..5] of Char;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

label l;

begin

Memo2. Clear;

for i:=0 to Memo1. Lines. Count do

if Length (Memo1. Lines [i]) >2 then begin

mm:=[]; s:=Memo1. Lines [i];

for j:=0 to Length (s) do begin

if (s [j] in ['А'.. 'Я']) or (s [j] in ['а'.. 'я']) then Memo1. Lines. Delete (i);

mm:=mm+ [s [j]]; end;

if (not (s [1] in ['A'.. 'Z'])) or (s [2] <>'-') or (' ' in mm) then Memo1. Lines. Delete (i);

end else Memo1. Lines. Delete (i);

for i:=0 to Memo1. Lines. Count do begin

s:=Memo1. Lines [i];

n:=Pos ('/',s); Delete (s,n,1);

m:=Pos ('/',s); Delete (s,m,1);

if (n>0) and (m>0) and (n<m) then begin

Memo2. Lines. Add (Copy (s,1,n-1));

Memo2. Lines. Add (Copy (s,1,2) +Copy (s,n,m-n));

Memo2. Lines. Add (Copy (s,1,2) +Copy (s,m,Length (s) - m+1));

goto l;

end;

IF n>0 then begin

Memo2. Lines. Add (Copy (s,1,n-1));

Memo2. Lines. Add (Copy (s,1,2) +Copy (s,n,Length (s) - n+1));

goto l;

end;

IF (n=0) and (Length (s) >2) then Memo2. Lines. Add (s);

l:

end;

for i:=0 to Memo2. Lines. Count do begin p [i]:=Memo2. Lines [i];

mn [i]:= [];

for j:=3 to Length (p [i]) do if p [i,j] in ['A'.. 'Z'] then mn [i]:=mn [i] + [P [i,j]];

end;

END;

procedure TForm1.Button2Click(Sender: TObject);

var vn2: set of Char;

begin

begin

v:=Memo2. Lines. Count;

for i:=0 to v do p[i]:='';

for i:=0 to v do begin p[i]:=Memo2. Lines[i];

mn [i]:=[];

for j:=3 to Length (p[i]) do

if p[i,j] in ['A'..'Z'] then mn [i]:=mn [i] + [P[i,j]];

end;

Memo2. Clear;

vn:=[];

for i:=0 to v-1 do if mn[i]=[] then vn:=vn+[p[i,1]];

vn2:=[];

j:=0;

while vn<>vn2 do begin

vn:=vn2;

for i:=0 to V-1 do

if (mn[i]-vn=[])

then vn2:=vn2+vn+[p[i,1]];

end;

for i:=0 to v do

for j:=1 to Length (p[i]) do

if Length (p[i])>2 then if (not (p[i,j] in vn)) and (p[i,j] in ['A'.. 'Z']) then p[i]:='';

for i:=0 to v do begin mn[i]:=[];

for j:=3 to Length (p[i]) do if p[i,j] in ['A'..'Z'] then mn[i]:=mn[i]+[p[i,j]];

if Length (p [i])>2 then Memo2. Lines. Add (p[i]);

end;

for i:=0 to v do p[i]:='';

for i:=0 to Memo2. Lines. Count do begin p[i]:=Memo2. Lines[i];

mn[i]:=[];

for j:=3 to Length (p[i]) do

if p[i,j] in ['A'..'Z'] then mn[i]:=mn[i]+[P[i,j]];

end;

end;

end;

procedure TForm1.Button3Click(Sender: TObject);

begin

v:=Memo2. Lines. Count;

for i:=0 to v do p[i]:='';

for i:=0 to v do begin p[i]:=Memo2. Lines[i];

mn[i]:=[];

for j:=3 to Length(p[i]) do

if p[i,j] in ['A'..'Z'] then mn[i]:=mn[i]+[P[i,j]];

end;

Memo2. Clear;

vn:=[];

for i:=0 to 3 do

if Length (p[i])>1 then begin vn:=vn+[p[i,1]]+mn[0];Break;end;

m:=0;

while m<4 do begin

for i:=0 to v do

if Length(p[i])>2 then

if p[i,1] in vn then vn:=vn+mn[i];

Inc(m);

end;

for i:=0 to v do

for j:=0 to Length(p[i]) do

if Length(p[i])>2 then if (not(p[i,j]in vn)) and (p[i,j] in ['A'..'Z']) then p[i]:='';

for i:=0 to v do

if Length(p[i])>2 then Memo2. Lines. Add(p[i]);

for i:=0 to v do p[i]:='';

for i:=0 to Memo2. Lines. Count do begin p[i]:=Memo2. Lines[i];

mn[i]:=[];

for j:=3 to Length(p[i]) do

if p[i,j] in ['A'..'Z'] then mn[i]:=mn[i]+[P[i,j]];

end;

end;

procedure TForm1.Button4Click(Sender: TObject);

begin

close;

end;

end.

Размещено на Allbest.ru

...

Подобные документы

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

    курсовая работа [1,5 M], добавлен 06.01.2012

  • Теоретические и практические основы грамматик, теория конечных автоматов-распознавателей. Эквивалентные и недостижимые состояния конечных автоматов. Классификация грамматик и порождаемых ими языков. Разработка программного комплекса построения грамматик.

    курсовая работа [654,2 K], добавлен 14.11.2010

  • Основные понятия теории грамматик простого и операторного предшествования, алгоритмы синтаксического разбора предложения для классов КС-грамматик; разработка дерева вывода для грамматики входного языка в форме Бэкуса-Наура с указанием шагов построения.

    лабораторная работа [28,0 K], добавлен 24.07.2012

  • Применение правил грамматики. Синтаксический анализатор, нис- и восходящий разбор, полный перебор правил подстановки. Классификация грамматик по Хомскому. Определение языков с помощью автоматов. Форма Бекуса-Наура описания синтаксиса формальных языков.

    лекция [270,1 K], добавлен 19.10.2014

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

    контрольная работа [45,8 K], добавлен 24.09.2010

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

    курсовая работа [129,4 K], добавлен 15.06.2009

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

    курсовая работа [231,5 K], добавлен 23.06.2011

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

    дипломная работа [3,6 M], добавлен 24.07.2014

  • Описание синтаксиса и семантики входного языка. Описание типов лексем, определение их синтаксиса. Построение диаграммы лексического анализатора, а также его таблицы, тестирование. Построение КС-грамматики входного языка. Описание промежуточного языка.

    курсовая работа [83,0 K], добавлен 23.01.2014

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

    дипломная работа [2,8 M], добавлен 21.07.2013

  • Особенности языка "Си шарп". Содержательная постановка программы. Описание классов и структур. Алгоритм и логики работы программы, переменные. Тестирование, инструкция пользователю. Пример удаления записи о читателе. Общий вид листинга программы.

    курсовая работа [360,3 K], добавлен 21.11.2013

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

    курсовая работа [579,7 K], добавлен 03.07.2011

  • Проектирование программного комплекса на языке С++ с использованием принципов объектно-ориентированного программирования. Разработка разных меню, помогающих пользователю работать с программой. Описание процесса формирования статистики по памятникам.

    курсовая работа [799,9 K], добавлен 01.12.2016

  • Обоснование выбора языка программирования. Анализ входных и выходных документов. Логическая структура базы данных. Разработка алгоритма работы программы. Написание программного кода. Тестирование программного продукта. Стоимость программного продукта.

    дипломная работа [1008,9 K], добавлен 13.10.2013

  • Разработка программного модуля "органайзер", позволяющего вести телефонную книгу, книгу записей, а так же работать с фильтрами и отчетами по данным. Характеристика используемой ЭВМ, ОС и языка программирования. Описание переменных, процедур и функций.

    курсовая работа [1,5 M], добавлен 25.12.2012

  • Разработка плана здания с помощью графического редактора AutoCAD. Описание предметной области и схемы модели данных. Разработка приложения, позволяющего работать с базой с помощью диалогового окна Windows. Программный код формы, прописывание кодов.

    курсовая работа [2,2 M], добавлен 30.07.2010

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

    дипломная работа [1,9 M], добавлен 26.03.2013

  • Требования к создаваемому программному модулю. Разработка необходимых алгоритмов и интерфейсов. Описание протокола SPA-BUS. Выбор языка программирования. Тестирование и документирование программного продукта. Оценка экономической эффективности программы.

    дипломная работа [722,4 K], добавлен 06.07.2012

  • Требования к интерфейсу программного продукта, характеристика операционной системы Windows XP и языка программирования разветвляющихся и циклических процессов Pascal. Структура условного оператора. Описание алгоритма работы с помощью блок-схемы, листинг.

    курсовая работа [268,0 K], добавлен 25.12.2010

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

    дипломная работа [1,7 M], добавлен 07.04.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.