Конструирование моделей лексического и синтаксического анализа

Характеристика процесса конструирования модели синтаксического анализа. Описание предметной области. Регулярная грамматика для лексического анализа. КС-грамматика. Нисходящий синтаксический анализатор. Логическое проектирование. Проектирование интерфейса.

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

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

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

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

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение высшего образования

«ЧЕРЕПОВЕЦКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»

Институт (факультет) Информационных технологий

Кафедра Математического и программного обеспечения ЭВМ

КУРСОВАЯ РАБОТА

по дисциплине Теория автоматов и формальных языков

на тему Конструирование моделей лексического и синтаксического анализа

Выполнил студент группы

ИСб-00-21оп

Дьяков Максим Сергеевич

Руководитель

Ганичева Оксана Георгиевна

Череповец, 2017год

Аннотация

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

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

Введение

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

Лексема - это структурная единица языка, которая состоит из элементарных символов языка и не содержит в своем составе других структурных единиц языка.

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

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

Лексический анализатор только позволяет избавить сложный по структуре синтаксический анализатор от решения примитивных задач по выявлению и запоминанию лексем входной программы. Выходом лексического анализатора является таблица лексем (или цепочка лексем). Эта таблица образует вход синтаксического анализатора, который исследует только один компонент каждой лексемы -- ее тип. Остальная информация о лексемах используется на более поздних фазах компиляции при семантическом анализе, подготовке к генерации и генерации кода результирующей программы. Синтаксический анализ -- процесс, в котором исследуется таблица лексем и устанавливается, удовлетворяет ли она структурным условиям, явно сформулированным в определении синтаксиса языка.

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

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

Изучение и описание предметной области

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

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

Основные функции:

1)исключение из текста исходной программы комментариев

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

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

Лексический анализатор имеет дело с такими объектами, как различного рода константы и идентификаторы (к последним относятся и ключевые слова). Язык констант и идентификаторов в большинстве случаев является регулярным, т. е. может быть описан с помощью регулярных грамматик. Распознавателями для регулярных языков являются конечные автоматы. Существуют правила, с помощью которых для любой регулярной грамматики может быть построен недетерминированный конечный автомат, распознающий цепочки языка, заданного этой грамматикой. Конечный автомат для каждой входной цепочки языка дает ответ на вопрос о том, принадлежит или нет цепочка языку, заданному автоматом.

Анализатор должен выполнить следующие действия:

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

- выполнить действия для сохранения информации об обнаруженной лексеме

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

Лексические анализаторы действуют по следующему принципу:

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

2)если символ не может быть отнесен к лексемам, то он является границей лексемы и началом следующей.

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

Постановка задачи

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

II.Постройте лексический анализатор, который решает следующие задачи: выделяет из текста входной программы все лексемы, входящие в заданную языковую конструкцию операторов for и do-while, удаляет лишние пробелы и комментарии из входной строки. Построение лексического анализатора выполнить на основе конечного автомата. По конечному автомату построить соответствующую ему регулярную грамматику.

III. Постройте КС-грамматику, описывающую синтаксис инструкции языка программирования для оператора операторов for и do-while.

IV. Докажите возможность вывода заданной синтаксической конструкции с помощью грамматики разработанной в п.III. на основе заданного варианта распознавателя. Результатом работы синтаксического анализатора должно быть дерево вывода и соответствующее ему порождение рассматриваемой цепочки.

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

Примечание 1:

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

2. В задании I заданную грамматику представить в виде: правил КС-грамматики, в форме БНФ и регулярной грамматики.

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

Примечание 2:

1. Выход лексического анализатора - дескрипторый код и псевдокод, таблица классов лексем, сообщения об ошибках: тип ошибки и в какой строке.

2. В ходе работы ЛА должны удаляться лишние пробелы и комментарии

Описание конечного автомата

other-любая цифра и буква английского алфавита

б- английская буква (любого регистра), ц- цифра

M=(Q, V, R, q0, P) ), где:

Q - конечное множество состояний автомата; V - конечное множество допустимых входных символов; P - функция переходов автомата; S0 - начальное состояние автомата; R - непустое множество конечных состояний автомата

V={a..z, A..Z, 0..9, -, +, /, *, =, ;,:, , , , #, &, !, (, ), {, }, <, >, [, ], |}

Q={S0, S1, ..S89}

R={ S3, S8, S15, S19, S24, S30, S34, S39, S44S47, S50, S54, S60, S65, S70, S71, S76, S78, S82, S85, S89} P:

(S0, i)>S1

(S1, n)>S2

(S7, e)>S8

(S13, other)>S85

(S21, o)>S22

(S27, other)>S85

(S0, v)>S86

(S1, o)>S9

(S7, other)>S85

(S14, m)>S15

(S21, other)>S85

(S28, l)>S29

(S0, s)>S48

(S1, other)>S85

(S8, other)>S85

(S15, other)>S85

(S22, a)>S23

(S28, other)>S85

(S0, f)>S20

(S2, t)>S3

(S9, s)>S10

(S16, a)>S17

(S22, other)>S85

(S29, e)>S30

(S0, n)>S66

(S2, c)>S4

(S9, other)>S85

(S16, other)>S85

(S23, t)>S24

(S29, other)>S85

(S0, u)>S61

(S2, other)>S85

(S10, t)>S11

(S17, i)>S18

(S23, other)>S85

(S30, other)>S85

(S0, r)>S55

(S3, other)>S85

(S10, other)>S85

(S17, other)>S85

(S24, other)>S85

(S31, h)>S32

(S0, w)>S40

(S4, l)>S5

(S11, r)>S12

(S18, n)>S19

(S25, o)>S26

(S31, i)>S35

(S0, d)>S25

(S4, other)>S85

(S11, other)>S85

(S19, other)>S85

(S25, other)>S85

(S31, o)>S37

(S0, f)>S20

(S5, u)>S6

(S12, e)>S13

(S20, l)>S21

(S26, u)>S27

(S31, other)>S85

(S0, m)>S16

(S5, other)>S85

(S12, other)>S85

(S20, f)>S46

(S26, other)>S85

(S32, a)>S33

(S0, c)>S31

(S6, d)>S7

(S13, a)>S14

(S20, other)>S85

(S27, b)>S28

(S32, other)>S85

(S0, б)>S85

(S6, other)>S85

(S0, .)>S70

(S72, =)>S78

(S75, ц)>S76

(S80, =)>S82

(S33, r)>S34

(S52, s)>S53

(S0, , )>S70

(S72, -)>S78

(S76, ц)>S76

(S85, other)>S85

(S33, other)>S85

(S52, other)>S85

(S0, ;)>S70

(S71, ц)>S71

(S77, +)>S78

(S86, o)>S87

(S34, other)>S85

(S53, e)>S54

(S0,:)>S70

(S71, .)>S73

(S77, =)>S78

(S86, other)>S85

(S35, n)>S36

(S53, other)>S85

(S0, ')>S70

(S71, E)>S74

(S83, <)>S78

(S87, i)>S88

(S35, other)>S85

(S54, other)>S85

(S0, '')>S70

(S71, e)>S74

(S84, >)>S78

(S87, other)>S85

(S36, other)>S85

(S55, e)>S56

(S0, ()>S70

(S73, ц)>S76

(S83, =)>S82

(S88, d)>S89

(S32, other)>S85

(S55, other)>S85

(S0, ))>S70

(S74, +)>S75

(S84, =)>S82

(S88, other)>S85

(S37, u)>S38

(S56, t)>S57

(S0, [)>S70

(S74, -)>S75

(S79, =)>S82

(S89, other)>S85

(S37, other)>S85

(S56, other)>S85

(S0, ])>S70

(S43, other)>S85

(S63, n)>S64

(S0, *)>S77

(S38, t)>S39

(S57, u)>S85

(S0, {)>S70

(S44, other)>S85

(S63, other)>S85

(S0, +)>S78

(S38, other)>S85

(S57, other)>S85

(S0, })>S70

(S46, r)>S47

(S64, g)>S65

(S0, +)>S77

(S32, other)>S85

(S58, r)>S59

(S0, ц)>S71

(S46, other)>S85

(S64, other)>S85

(S0, -)>S78

(S39, other)>S85

(S58, other)>S85

(S0, -)>S72

(S47, other)>S85

(S65, other)>S85

(S0, =)>S78

(S40, h)>S41

(S59, n)>S60

(S0, &)>S78

(S48, t)>S49

(S66, a)>S67

(S0, =)>S79

(S40, other)>S85

(S59, other)>S85

(S0, &)>S77

(S48, p)>S51

(S66, other)>S85

(S0, <)>S83

(S41, i)>S42

(S60, other)>S85

(S0, /)>S78

(S48, other)>S85

(S67, m)>S68

(S0, >)>S84

(S41, other)>S85

(S61, s)>S62

(S0, /)>S77

(S49, d)>S50

(S67, other)>S85

(S0, <)>S82

(S42, l)>S43

(S61, other)>S85

(S0, %)>S78

(S49, other)>S85

(S68, e)>S69

(S0, >)>S82

(S42, other)>S85

(S62, i)>S63

(S0, %)>S77

(S51, a)>S52

(S68, other)>S85

(S0, !)>S80

(S45, other)>S85

(S69, s)>S45

(S45, p)>S51

(S51, other)>S85

(S69, other)>S85

(S72, ц)>S71

(S43, e)>S44

(S62, other)>S85

(S0, *)>S78

Регулярная грамматика для лексического анализа

регулярная грамматика -- формальная грамматика типа 3 по иерархии Хомского. Регулярные грамматики определяют в точности все регулярные языки, и поэтому эквивалентны конечным автоматам и регулярным выражениям.

Регулярная грамматика может быть задана набором правил как левая или правая регулярная грамматика.

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

1. A > a

2. A > aB

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

1. A > a

2. A > Ba

Где заглавные буквы (A, B) обозначают нетерминалы, строчные буквы (a, b) обозначают терминалы

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

Регулярная грамматика по конечному автомату:

G=(N, T, P, S)

N={Q}={S0, S1, … S89}

T={V}={a..z, A..Z, 0..9, -, +, /, *, =, ;,:, , , , , &, !, (, ), {, }, <, >, [, ]}

S={q0}={S0}

P:

S0>iS1

S1>nS2

S7>eS8

S13>otherS85

(S21, o)>oS22

S27>otherS85

S0>vS86

S1>oS9

S7>otherS85

S14>mS15

S21>otherS85

S28>lS29

S0>sS48

S1>otherS85

S8>otherS85

S15>otherS85

S22>aS23

S28>otherS85

S0>fS20

S2>tS3

S9>sS10

S16>aS17

S22>otherS85

S29>eS30

S0>nS66

S2>cS4

S9>otherS85

S16>otherS85

S23>tS24

S29>otherS85

S0>uS61

S2>otherS85

S10>tS11

S17>iS18

S23>otherS85

S30>otherS85

S0>rS55

S3>otherS85

S10>otherS85

S17>otherS85

S24> otherS85

S31>hS32

S0>wS40

S4>lS5

S11>rS12

S18>nS19

S25>oS26

S31>iS35

S0>dS25

S4> otherS85

S11> otherS85

S19>otherS85

S25>otherS85

S31>oS37

S0>fS20

S5>uS6

S12>eS13

S20>lS21

S26>uS27

S31>otherS85

S0>mS16

S5>otherS85

S12>otherS85

S20>fS46

S26>otherS85

S32>aS33

S0>cS31

S6>dS7

S13>aS14

S20> otherS85

S27>bS28

S32>otherS85

S0>бS85

S6>otherS85

S0>.S70

S72>=S78

S75>цS76

S80>=S82

S33>rS34

S52>sS53

S0>, S70

S72>-S78

S76>цS76

S85>otherS85

S33>otherS85

S52>otherS85

S0>;S70

S71>цS71

S77>+S78

S86>oS87

S34>otherS85

S53>eS54

S0>:S70

S71>.S73

S77>=S78

S86>otherS85

S35>nS36

S53> other S85

S0>'S70

S71>ES74

S83><S78

S87>iS88

S35>otherS85

S54>otherS85

S0>”S70

S71>eS74

S84>>S78

S87>otherS85

S36>otherS85

S55>eS56

S0>(S70

S73>цS76

S83>=S82

S88>dS89

S32>otherS85

S55>otherS85

S0>)S70

S74>+S75

S84>=S82

S88>otherS85

S37>uS38

S56>tS57

S0>[S70

S74>-S75

S79>=S82

S89>otherS85

S37>otherS85

S56>otherS85

S0>]S70

S43>otherS85

S63>nS64

S0>*S77

S38>tS39

S57>uS85

S0>{S70

S44>otherS85

S63>otherS85

S0>+S78

S38>otherS85

S57>otherS85

S0>}S70

S46>rS47

S64>gS65

S0>+S77

S32>otherS85

S58>rS59

S0>цS71

S46>otherS85

S64>otherS85

S0>-S78

S39>otherS85

S58>otherS85

S0>-S72

S47>otherS85

S65>otherS85

S0>=S78

S40>hS41

S59>nS60

S0>&S78

S48>tS49

S66>aS67

S0>=S79

S40>otherS85

S59>otherS85

S0>&S77

S48>pS51

S66>otherS85

S0><S83

S41>iS42

S60>otherS85

S0>/S78

S48>otherS85

S67>mS68

S0>>S84

S41>otherS85

S61>sS62

S0>/S77

S49>dS50

S67>otherS85

S0><S82

S42>lS43

S61>otherS85

S0>%S78

S49>otherS85

S68>eS69

S0>>S82

S42>otherS85

S62>iS63

S0>%S77

S51>aS52

S68>otherS85

S0>!S80

S45>otherS85

S69>sS45

S45>pS51

S51>otherS85

S69>otherS85

S72>цS71

S43>eS44

S62>otherS85

S0>*S78

S78>е

S82>е

S85>е

S70>е

S71>е

S76>е

S19>е

S24>е

S47>е

S34>е

S36>е

S39>е

S69>е

S65>е

S3>е

S30>е

S26>е

S44>е

S50>е

S54>е

S85>е

S8>е

S15>е

S89>е

S70>е

S71>е

S76>е

S70>е

S70>е

S70>е

S70>е

S70>е

S70>е

S70>е

S70>е

S70>е

КС-грамматика. Низходящий синтаксический анализатор

Код для кс-грамматики

do {

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

x=2*i;

y+=x;}}

while(y<=1000)

for ( int i=100;j>n;j-){

y-=j;

do{x+=y;}while(x<=y)

}

G=(T, N, P, S)

Где T -- конечный алфавит терминальных символов (совпадает с алфавитом языка, задаваемого грамматикой);

N -- конечный алфавит нетерминальных символов;

P -- конечное множество правил порождения;

S -- начальный нетерминал грамматики G.

T={id, const, -, *, ?, >, <, /, +, =, ;, (, ), {, }, >=, <=}

N={S, E, B O, C, K, I, Z, L, P}

S=S

P:

1. S> do LEL while (UL / for (I) LEL

2. E> CS/C

3. U> BOB

4. O> >/</>= /<=/!=/==

5. C> BPK;/BPB;/CC/ е

6. P> +/-/*/Z/+=/-=

7. Z> =

8. K> BPB

9. I>int BZB;BOB;BPP;

10. B>const/id

11. L>(/)/{/}/}S/)S/{S/(S

Порождение грамматики

S ? do LEL while (UL ? do {EL while (UL ? do {CSL while(UL ?

do { SL while(UL? do { for(I)LELL while (UL ? do {for(int BZB;BOB;BPP; ) LELL while (UL? do {for(int id ZB;BOB;BPP; ) LELL while (UL? do {for(int id =B;BOB;BPP; ) LELL while (UL? do {for(int id =const;BOB;BPP; ) LELL while (UL? do {for(int id =const;idOB;BPP; ) LELL while (UL? do {for(int id =const;id<B;BPP; ) LELL while (UL? do {for(int id =const;id<id;BPP; ) LELL while (UL? do {for(int id =const;id<id;idPP; ) LELL while (UL? do {for(int id =const;id<id;id+P; ) LELL while (UL? do {for(int id =const;id<id;id++; ) LELL while (UL?

do {for(int id =const;id<id;id++; ) {ELL while (UL? do {for(int id =const;id<id;id++; ) { CLL while (UL? do {for(int id =const;id<id;id++; ) { CCLL while (UL? do {for(int id =const;id<id;id++; ) { BPK;CLL while (UL? do {for(int id =const;id<id;id++; ) { idPK;CLL while (UL? do {for(int id =const;id<id;id++; ) { id=K;CLL while (UL? do {for(int id =const;id<id;id++; ) { id=BPB;CLL while (UL? do {for(int id =const;id<id;id++; ) { id=constPB;CLL while (UL? do {for(int id =const;id<id;id++; ) { id=const*B;CLL while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;CLL while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;BPB;LL while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;idPB;LL while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=B;LL while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;LL while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;LL while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}L while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (UL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (BOBL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (idOBL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=BL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=constL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}S? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(I)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int BZB;BOB;BPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int idZB;BOB;BPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=B;BOB;BPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;BOB;BPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id OB;BPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >B;BPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;BPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;idPP)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-P)LEL?

do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-)LEL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){EL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){CSL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){BPB;SL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){idPB;SL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=B;SL?

do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;SL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do LEL while (ULL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {EL while (ULL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {BPB;L while (ULL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {idPB;L while (ULL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=B;L while (ULL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;L while (ULL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;} while (ULL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;} while (BOBLL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;} while (idOBLL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;} while (id<=BLL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;} while (id<=idLL? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;} while (id<=id)L? do {for(int id =const;id<id;id++; ) { id=const*id;id+=id;}} while (id<=const}for(int id=const;id >id;id-){id-=id;do {id+=id;} while (id<=id)}

Логическое проектирование

Для написания программы, был разработан алгоритм, а по нему составлена упрощённая Блок-схема. Блок-схема программы представлена на Рис. 5.

Рис. 5. Блок-схема

Проектирование интерфейса

Таблица 1 Таблица проектирования интерфейса

Элемент интерфейса

Реализация

Выполняемое действие

Поле для ввода текста программы

Поле TextBox

Действий не выполняется

Кнопка обработка

Кнопка

Удаление коментариев и лишних пробелов в тексте введённой программы

Кнопка сброс

Кнопка

Возврат программы в изначальное состояние

Таблица ключевых слов

Таблица

Вывод результата

Таблица идентификаторов

Таблица

Вывод результата

Таблица числовых переменных

Таблица

Вывод результата

Таблица знаков пунктуации

Таблица

Вывод результата

Поле для вывода дескрипторного кода

Поле TextBox

Вывод результата

Поле для вывода псевдокода

Поле TextBox

Вывод результата

Поле для вывода текста программы после обработки

Поле TextBox

Действий не выполняется

Кодирование

Реализация разработанных алгоритмов и составленный по ним текст программы (с комментариями) в Приложении 3.

Тестирование

На этапе тестирования разработаны тестовые данные и оформлены в виде таблицы.

Таблица 2 Таблица тестовых данных

Исходные данные

Тестируемый модуль или подпрограммы

Ожидаемый результат

1

int x=5;

Form1

Выделение лексем

2

int xQx3=5.5;

Form1

Выделение лексем

3

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

Form1

Выделение лексем

4

int x=5; //sadsad

Form1

Выделение лексем и удаление коментариев

5

//int x=5;

Form1

Пропуск

Проведение тестирования по таблице тестовых данных

Таблица 3 Результаты выполнения тестирования

Дата и время

Тестируемый модуль или подпрограмма

Кто проводил тестирование

Описание теста

Результаты тестирования

1

25.12.2017

Form1

Волков А.A

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

Успех

2

25.12.2017

Form1

Волков А.A

Ввод текста на проверку определения введённых переменных и констант

Успех

3

25.12.2017

Form1

Волков А.A

Проверка на определение конструкций оператора

Do-while и for

Успех

4

25.12.2017

Form1

Волков А.A

Проверка на пропуск пробелов и комментариев:

Успех

5

25.12.2017

Form1

Волков А.A

Проверка на пропуск комментария

Успех

Заключение

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

Был решён ряд задач:

· определил требования к программному продукту;

· выбрал типы данных, необходимые для решения задачи;

· написал программный код;

· произвел тестирование.

Источники информации

1. Ю.Г.Карпов “ Теория и технология программирования. Основы построения трансляторов.” СПБ.: БХВ-Петербург, 2005.

2.Справочник С# https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/

Приложение

Введение

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

1.Назначение разработки

Программа должна моделировать работу компилятора для операторов do-while и for языка С++.

2.Требования к программе

1. Программа должна выделять из текста входной программы все лексемы, входящие в заданную языковую конструкцию операторов do-while и for языка С++

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

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

4. Программа должна преобразовывать исходный текст программы в дескрипторный код

5. Программа должна выводить сообщения об ошибках.

3. Требования к надежности:

· программа должна выполнять предписанные функциональные характеристики без сбоев;

· обеспечение контроля входной и выходной информации;

· защита при неверных действиях пользователя;

· контроль соответствия типов данных.

4. Требования к программной документации

Расчетно-пояснительная записка.

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

Код программы

5. Технико-экономические показатели

Требования не предъявляются

6. Стадии и этапы разработки

Наименование этапа разработки ПО

Сроки разработки

Результат выполнения

Отметка

о выполнении

Получение задания

9.10.2017

Успешно

Выполнено

Анализ требований

23.12.17

Успешно

Выполнено

Реализация

23.12.17-25.12.17

Успешно

Выполнено

Тестирование

25.12.17

Успешно

Выполнено

Внедрение и поддержка

26.12.17-27.12.17

Успешно

Выполнено

7. Порядок контроля и приемки

Наименование контрольного этапа выполнения курсовой работы

Сроки контроля

Результат

выполнения

Отметка

о выполнении

1.Разработка технического задания

с 23 февраля по 24 февраля

Техническое задание

Выполнено

2.Начальная разработка программы

с 23 февраля по 24 февраля

Блок - схема, либо словесное описание программы, регулярная граматика по КА

Выполнено

3. Написание кода программы

с 23 февраля по 25 февраля

Готовая программа

Выполнено

4. Тестирование программы

25 февраля

Рабочая программа

Выполнено

5. Расчётно -пояснительная записка

с 24 февраля по 25 февраля

Расчётно-пояснительная записка

Выполнено

6.Защита курсовой работы

27 февраля

Защита

Выполнено

Требования к составу и параметрам технических средств:

· для запуска программы требуется Windows XP или более поздняя версия и Super VGA видеоадаптер;

· процессор 233 МГц или лучше;

· как минимум 64 МБ Мб ОЗУ;

· не менее 1, 5 ГБ свободного дискового пространства;

· для установки Windows требуется устройство для чтения компакт-дисков (или же поддержка других устройств, таких как флэш-накопителей);

· необходим монитор Super VGA с разрешением 800x600 или более высоким, отображающий 256 и более цветов;

· необходимы клавиатура и мышь.

Требования к информационной и программной совместимости:

· язык программирования (C++);

· среда для разработки программы (Visual Studio C++)

· операционная система (Windows XP);

· уровень защиты (без защиты).

Приложение 2

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

1. using System;

2. using System.Collections.Generic;

3. using System.ComponentModel;

4. using System.Data;

5. using System.Drawing;

6. using System.Linq;

7. using System.Text;

8. using System.Threading.Tasks;

9. using System.Windows.Forms;

10. using System.IO;

11. namespace automata

12. {

13. public partial class Form1: Form

14. {

15. int v_id = 0, v_op = 0, v_sy = 0, v_k = 0, v_con = 0, v_nu=0;

16. //добавить идентификатор

17. void add_ident(string cell, ref int v_id) {

18. if (!check_ident(cell))

19. {

20. id.Rows.Add(" ");

21. id[0, v_id ].Value = Convert.ToString(v_id + 1);//запись в таблицу номера слова

22. id[1, v_id ].Value = cell;//в таблицу заносится слово

23. id[2, v_id ].Value = Convert.ToString("(10, "+(v_id+1)+ ")");//запись дискрипторного кода

24. dk.Text += id[2, v_id].Value.ToString();

25. pk.Text += Convert.ToString("id" + (v_id + 1)+ " "); pk.SelectionStart = pk.Text.Length;

26. v_id++;}

27. }

28. //добавить знак операции

29. void add_op(string cell, ref int v_op) {

30. if (!check_op(cell))

31. {

32. op.Rows.Add(" ");

33. op[0, v_op].Value = Convert.ToString(v_op + 1);//запись в таблицу номера слова

34. op[1, v_op].Value = cell;//в таблицу заносится слово

35. op[2, v_op].Value = Convert.ToString("(20, " + (v_op + 1) + ")");//запись дискрипторного кода

36. dk.Text += op[2, v_op].Value.ToString();//запись дискрипторного кода

37. pk.Text += cell+" "; pk.SelectionStart = pk.Text.Length;

38. v_op++;

39. }

40. }

41. //добавить знак синтаксиса

42. void add_synt(string cell, ref int v_sy) {

43. if (!check_synt(cell))

44. {synt.Rows.Add();

45. synt[0, v_sy].Value = Convert.ToString(v_sy + 1);//запись в таблицу номера слова

46. synt[1, v_sy].Value = cell;//в таблицу заносится слово

47. synt[2, v_sy].Value = Convert.ToString("(50, " + (v_sy + 1) + ")");//запись дискрипторного кода

48. dk.Text += synt[2, v_sy].Value.ToString();//запись дискрипторного кода

49. pk.Text += Convert.ToString(cell) + " ";

50. pk.SelectionStart = pk.Text.Length;

51. v_sy++;}

52. }

53. //добавить ключевое слово

54. void add_key(string cell, ref int v_k) {

55. if (!check_key(cell))

56. {

57. key.Rows.Add();

58. key[0, v_k].Value = Convert.ToString(v_k + 1);//запись в таблицу номера слова

59. key[1, v_k].Value = cell;//в таблицу заносится слово

60. key[2, v_k].Value = Convert.ToString("(40, " + (v_k + 1) + ")");//запись дискрипторного кода

61. dk.Text += key[2, v_k].Value.ToString();//запись дискрипторного кода

62. pk.Text += Convert.ToString(cell) + " "; pk.SelectionStart = pk.Text.Length;

63. v_k++;}

64. }

65. //добавить знак отношений

66. void add_cond(string cell, ref int v_con) {

67. if (!check_cond(cell))

68. {

69. cond.Rows.Add();

70. cond[0, v_con].Value = Convert.ToString(v_con + 1);//запись в таблицу номера слова

71. cond[1, v_con].Value = cell;//в таблицу заносится слово

72. cond[2, v_con].Value = Convert.ToString("(30, " + (v_con + 1) + ")");//запись дискрипторного кода

73. dk.Text += cond[2, v_con].Value.ToString();//запись дискрипторного кода

74. pk.Text += cell + " "; pk.SelectionStart = pk.Text.Length;

75. v_con++;

76. }

77. }

78. //добавить нераспознанный знак

79. void add_unId(char[] cell, ref int j, int i)

80. {

81. err.Text += "Error line: " + Convert.ToString(i+1)+Environment.NewLine;

82. while (j!=cell.Length-1) { j++;

83. if (cell[j] == ' ' || cell[j] == '\n') return;

84. }

85. return;

86. }

87. void add_nu(string cell, ref int v_nu)

88. {

89. if (!check_nu(cell))

90. {

91. nu.Rows.Add(" ");

92. nu[0, v_nu].Value = Convert.ToString(v_nu + 1);//запись в таблицу номера слова

93. nu[1, v_nu].Value = cell;//в таблицу заносится слово

94. nu[2, v_nu].Value = Convert.ToString("(60, " + (v_nu + 1) + ")");//запись дискрипторного кода

95. pk.Text += "const "; pk.SelectionStart = pk.Text.Length;

96. dk.Text += nu[2, v_nu].Value.ToString();

97. v_nu++;

98. }

99. }

100. //проверить наличие идентификатора

101. bool check_ident(string cell) {

102. if (id.Rows.Count != 0)

103. {

104. for (int i = 0; i < id.Rows.Count; i++)

105. {//если значения совпадают, то в таблицу не заносится, а в дискрипторный код записывается текущее полученное значение

106. if (id[1, i].Value.ToString() == cell)

107. {

108. dk.Text += id[2, i].Value.ToString(); pk.Text += Convert.ToString("id" + (i + 1) + " "); pk.SelectionStart = pk.Text.Length;

109. return true;

110. }

111. }

112. }

113. return false;

114. }

115. //проверить наличие операции

116. bool check_op(string cell) {

117. if (op.Rows.Count != 0)

118. {

119. for (int i = 0; i < op.Rows.Count; i++)

120. {//если значения совпадают, то в таблицу не заносится, а в дискрипторный код записывается текущее полученное значение

121. if (op[1, i].Value.ToString() == cell) { dk.Text += op[2, i].Value.ToString();

122. pk.Text += cell+" ";

123. pk.SelectionStart = pk.Text.Length;

124. return true; }}}

125. return false;

126. }

127. //проверить наличие синтаксиса

128. bool check_synt(string cell) {

129. if (synt.Rows.Count != 0)

130. {

131. for (int i = 0; i < synt.Rows.Count; i++)

132. {//если значения совпадают, то в таблицу не заносится, а в дискрипторный код записывается текущее полученное значение

133. if (synt[1, i].Value.ToString() == cell) { dk.Text += synt[2, i].Value.ToString(); pk.Text += Convert.ToString(cell) + " ";

134. pk.SelectionStart = pk.Text.Length; return true; }

135. }

136. }

137. return false;

138. }

139. //проверить наличие ключевого слова

140. bool check_key(string cell) {

141. if (key.Rows.Count != 0)

142. {

143. for (int i = 0; i < key.Rows.Count; i++)

144. {//если значения совпадают, то в таблицу не заносится, а в дискрипторный код записывается текущее полученное значение

145. if (key[1, i].Value.ToString() == cell)

146. {

147. dk.Text += key[2, i].Value.ToString(); pk.Text += Convert.ToString(cell) + " "; pk.SelectionStart = pk.Text.Length;

148. return true;

149. }

150. }

151. }

152. return false;

153. }

154. //проверить наличие отношений

155. bool check_cond(string cell) {

156. if (cond.Rows.Count != 0)

157. {

158. for (int i = 0; i < cond.Rows.Count; i++)

159. { //если значения совпадают, то в таблицу не заносится, а в дискрипторный код записывается текущее полученное значение

160. if (cond[1, i].Value.ToString() == cell) { dk.Text += cond[2, i].Value.ToString(); pk.Text += cell + " "; pk.SelectionStart = pk.Text.Length;

161. return true; }

162. }

163. }

164. return false;

165. }

166. bool check_nu(string cell)

167. {

168. if (nu.Rows.Count != 0)

169. {

170. for (int i = 0; i < nu.Rows.Count; i++)

171. {//если значения совпадают, то в таблицу не заносится, а в дискрипторный код записывается текущее полученное значение

172. if (nu[1, i].Value.ToString() == cell)

173. {

174. dk.Text += nu[2, i].Value.ToString(); pk.Text += "const "; pk.SelectionStart = pk.Text.Length;

175. return true;

176. }

177. }

178. }

179. return false;

180. }

181. bool alf (char b){

182. if (b >= 'A' && b <= 'Z' || b >= 'a' && b <= 'z') return false;

183. else return true;

184. }

185. bool numb(char b)

186. {

187. if (b >= '0' && b <= '9') return true;

188. else return false;

189. }

190. bool f_synt(char b)

191. {

192. if (b == ', ' || b == ':' || b == ';' || b == '(' || b == ')' || b == '{' || b == '}' || b == '[' || b == ']' || b == '"'|| b=='<' || b == '>' || b == '=' || b == '+' || b == '-' || b == '*' || b == '/' || b == '%') return true;

193. else return false;

194. }

195. void clear()

196. {

197. rich2.Clear(); err.Clear(); key.Rows.Clear(); op.Rows.Clear(); cond.Rows.Clear(); synt.Rows.Clear(); id.Rows.Clear(); nu.Rows.Clear(); dk.Clear(); pk.Clear(); v_id = 0; v_op = 0; v_sy = 0; v_k = 0; v_con = 0; v_nu = 0;

198. }

199. bool f_cond(char b)

200. {

201. if (b == '=' || b == '>' || b == '<' || b == '!') return true;

202. else return false;

203. }

204. public Form1()

205. {

206. InitializeComponent();

207. }

208. // создание начальных колонок в таблице

209. private void Form1_Load(object sender, EventArgs e)

210. {

211. }

212. //кнопка для ручного прохода по слову

213. private void Form1_SizeChanged(object sender, EventArgs e)

214. {

215. }

216. private void button3_Click(object sender, EventArgs e)

217. {

218. v_id = 0; v_op = 0; v_sy = 0; v_k = 0; v_con = 0;

219. }

220. private void button3_Click_1(object sender, EventArgs e)

221. {

222. clear(); //отчистка таблиц и текстовых полей

223. string str = null;

224. if (rich1.Text != "") //проверка на пустое поле

225. {

226. button2.Enabled = true; //активизация кнопки анализа

227. char[] h = Encoding.Default.GetChars(Encoding.Default.GetBytes(rich1.Text)); //инициализация текстового блока в массив символов

228. for (int i = 0; i < h.Length; i++)

229. {

230. if (h[i] == '/' && h[i + 1] == '/')

231. { //поиск 2-х слешей

232. while (h[i] != '\n') { h[i++] = ' '; } //замена значений на пробелы после двух слешей

233. str += h[i];//новая строка в буфер

234. }

235. else str += h[i]; //инициализация буфера

236. }

237. string h_1 = Convert.ToString(str); //конвертация буфера символов в строкговую переменную

238. string[] h1 = h_1.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); //дробление строки по символу окончания строки

239. for (int j = 0; j < h1.Length; j++)

240. {

241. h = Encoding.Default.GetChars(Encoding.Default.GetBytes(h1[j])); //инициализация строки в массив символов

242. if (h[0] != '/')

243. { rich2.Text += Convert.ToString(h1[j]) + Environment.NewLine; } //первый символ не одиночный слеш. Производится сбор новой переменной

244. }

245. string s1 = rich2.Text; string s2, s3; //инициализация для удаления пробелов

246. s3 = s1;

247. do { s2 = s3; s3 = s2.Replace(" ", " "); } //Replace - замена двойного пробела на одиночный

248. while (s2 != s3); //пока строки не окажутся равны. То есть пока все пробелы не станут в единичном количестве

249. rich2.Text = s3; //инициализация текстового блока для анализа обработанным текстом

250. }

251. else { MessageBox.Show("Вы ничего не ввели!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } //ошибка, если ничего не введено

252. }

253. private void button4_Click(object sender, EventArgs e)

254. {

255. rich1.Text = File.ReadAllText("Source.cpp");

256. }

257. private void button1_Click(object sender, EventArgs e)

258. {

259. rich1.Clear();rich2.Clear(); err.Clear(); key.Rows.Clear(); op.Rows.Clear(); cond.Rows.Clear(); synt.Rows.Clear(); id.Rows.Clear(); nu.Rows.Clear(); dk.Clear(); pk.Clear(); v_id = 0; v_op = 0; v_sy = 0; v_k = 0; v_con = 0; v_nu = 0;

260. }

261. private void button2_Click(object sender, EventArgs e)

262. { int num_si = 0;

263. char[] num_tex;

264. string token = null;

265. string automa = rich2.Text + " "; //инициализация строки слов

266. string[] cell_x = automa.Split(new char[] { ' ', '\n' }, StringSplitOptions.RemoveEmptyEntries); // дробление строки по символам

267. if (rich1.Text == "") { MessageBox.Show("Вы ничего не ввели!", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); }

268. else

269. {for (int i = 0; i < cell_x.Length; i++) //начало работы цикла перебора слов

270. {

271. num_tex = Encoding.Default.GetChars(Encoding.Default.GetBytes(cell_x[i] + ' ')); //инициализация строки в массив символов

272. for (int j = 0; j < num_tex.Length; j++) //начало работы цикла перебора символов

273. {

274. switch (num_si)

275. {

276. case 0:

277. if (num_tex[j] == 'c')

278. {

279. num_si = 31; token += Convert.ToString(num_tex[j]);

280. }

281. Else

282. {

283. if (num_tex[j] == 'm')

284. {

285. num_si = 16; token += Convert.ToString(num_tex[j]);

286. }

287. Else

288. {

289. if (num_tex[j] == 'f')

290. {

291. num_si = 20; token += Convert.ToString(num_tex[j]);

292. }

293. Else

294. {

295. if (num_tex[j] == 'd')

296. {

297. num_si = 25; token += Convert.ToString(num_tex[j]);

298. }

299. Else

300. {

301. if (num_tex[j] == 'w')

302. {

303. num_si = 40; token += Convert.ToString(num_tex[j]);

304. }

305. Else

306. {

307. if (num_tex[j] == 'r')

308. {

309. num_si = 55; token += Convert.ToString(num_tex[j]);

310. }

311. Else

312. {

313. if (num_tex[j] == 'u')

314. {

315. num_si = 61; token += Convert.ToString(num_tex[j]);

316. }

317. Else

318. {

319. if (num_tex[j] == 'n')

320. {

321. num_si = 66; token += Convert.ToString(num_tex[j]);

322. }

323. Else

324. {

325. if (num_tex[j] == 'i')

326. {

327. num_si = 1; token += Convert.ToString(num_tex[j]);

328. }

329. Else

330. {

331. if (num_tex[j] == 's')

332. {

333. num_si = 48; token += Convert.ToString(num_tex[j]);

334. }

335. Else

336. {

337. if (num_tex[j] == 'v')

338. {

339. num_si = 86; token += Convert.ToString(num_tex[j]);

340. }

341. Else

342. {if (num_tex[j] == '.' || num_tex[j] == ', ' || num_tex[j] == ':' || num_tex[j] == ';' || num_tex[j] == '(' || num_tex[j] == ')' || num_tex[j] == '{' || num_tex[j] == '}' || num_tex[j] == '[' || num_tex[j] == ']' || num_tex[j] == '"')

343. {

344. num_si = 70; token += Convert.ToString(num_tex[j]);

345. }

346. Else

347. {

348. if (num_tex[j] == '-' && (num_tex[j + 1] == '0' || num_tex[j + 1] == '1' || num_tex[j + 1] == '2' || num_tex[j + 1] == '3' || num_tex[j + 1] == '4' || num_tex[j + 1] == '5' || num_tex[j + 1] == '6' || num_tex[j + 1] == '7' || num_tex[j + 1] == '8' || num_tex[j + 1] == '9'))

349. {

350. num_si = 72; token += Convert.ToString(num_tex[j]);

351. }

352. Else

353. {

354. if (num_tex[j] == '-')

355. {

356. num_si = 72; token += Convert.ToString(num_tex[j]);

357. }

358. Else

359. {

360. if (num_tex[j] == '0' || num_tex[j] == '1' || num_tex[j] == '2' || num_tex[j] == '3' || num_tex[j] == '4' || num_tex[j] == '5' ||

361. num_tex[j] == '6' || num_tex[j] == '7' || num_tex[j] == '8' || num_tex[j] == '9')

362. {

363. num_si = 71; token += Convert.ToString(num_tex[j]);

364. }

365. Else

366. {

367. if ((num_tex[j] == '/' || num_tex[j] == '+' || num_tex[j] == '-' || num_tex[j] == '&' || num_tex[j] == '%' || num_tex[j] == '*') &&

368. (num_tex[j + 1] == '=' || num_tex[j + 1] == '+'))

369. {

370. num_si = 77; token += Convert.ToString(num_tex[j]);

371. }

372. Else

373. {

374. if (num_tex[j] == '/' || num_tex[j] == '+' || num_tex[j] == '-' || num_tex[j] == '&' || num_tex[j] == '%' || num_tex[j] == '*')

375. {

376. num_si = 78; token += Convert.ToString(num_tex[j]);

377. }

378. Else

379. {

380. if (num_tex[j] == '!')

381. {

382. num_si = 80; token += Convert.ToString(num_tex[j]);}

383. else{

384. if (num_tex[j] == '=' && num_tex[j + 1] == '=')

385. {

386. num_si = 79; token += Convert.ToString(num_tex[j]);

387. }

388. Else

389. {

390. if (num_tex[j] == '=')

391. {num_si = 78; token += Convert.ToString(num_tex[j]);

392. }

393. Else

394. {

395. if (num_tex[j] == '<' && (num_tex[j + 1] == '<' || num_tex[j + 1] == '='))

396. {

397. num_si = 83; token += Convert.ToString(num_tex[j]);

398. }

399. Else

400. {

401. if (num_tex[j] == '>' && (num_tex[j + 1] == '>' || num_tex[j + 1] == '='))

402. {

403. num_si = 84; token += Convert.ToString(num_tex[j]);

404. }

405. Else

406. {

407. if (num_tex[j] == '>' || num_tex[j] == '<')

408. {

409. num_si = 82; token += Convert.ToString(num_tex[j]);

410. }

411. Else

412. {

413. if (num_tex[j] >= 'A' && num_tex[j] <= 'Z' || num_tex[j] >= 'a' && num_tex[j] <= 'z')

414. {

415. num_si = 85; token += Convert.ToString(num_tex[j]);

416. }

417. Else

418. {

419. if (num_tex[j] == '_') { num_si = 85; token += Convert.ToString(num_tex[j]); }

420. }}}}}}}}}}}}}}}}}}}}}}}}

421. break;

422. case 1:

423. if (num_tex[j] == ' ' || num_tex[j] == '\n') { add_ident(token, ref v_id); token = null; num_si = 0; }

424. else

425. {

426. if (num_tex[j] == 'n') { num_si = 2; token += Convert.ToString(num_tex[j]); }

427. else

428. {

429. if (num_tex[j] == 'o') { num_si = 9; token += Convert.ToString(num_tex[j]); }

430. else

431. {

432. if (num_tex[j] == '.') { add_unId(num_tex, ref j, i); token = null; num_si = 0; }

433. else

434. {

435. if (f_synt(num_tex[j])) { add_ident(token, ref v_id); token = null; num_si = 0; j-; }

436. else { num_si = 85; token += Convert.ToString(num_tex[j]); }

437. }

438. }

439. }

440. }

441. break;

442. case 2:

443. if (num_tex[j] == ' ' || num_tex[j] == '\n') { add_ident(token, ref v_id); token = null; num_si = 0; }

444. else

445. {

446. if (num_tex[j] == 't') { num_si = 3; token += Convert.ToString(num_tex[j]); }

447. else

448. {

449. if (num_tex[j] == 'c') { num_si = 4; token += Convert.ToString(num_tex[j]); }

450. else

451. {

452. if (num_tex[j] == '.') { add_unId(num_tex, ref j, i); token = null; num_si = 0; }

453. else if (f_synt(num_tex[i])) { add_ident(token, ref v_id); token = null; num_si = 0; j-; }

454. else { num_si = 85; token += Convert.ToString(num_tex[j]); }

455. }

456. }

457. }

458. break;

459. case 3:

460. if (num_tex[j] == ' ' || num_tex[j] == '\n')

461. {

462. add_key(token, ref v_k); token = null; num_si = 0;

463. }

464. else

465. {

466. if (num_tex[j] == '.') { add_unId(num_tex, ref j, i); token = null; num_si = 0; }

467. else if (f_synt(num_tex[j])) { add_key(token, ref v_k); token = null; num_si = 0; j-; }

468. else { num_si = 85; token += Convert.ToString(num_tex[j]); }

469. }

470. break;

471. case 4:

472. if (num_tex[j] == ' ' || num_tex[j] == '\n') { add_ident(token, ref v_id); token = null; num_si = 0; }

473. else {

474. if (num_tex[j] == 'l') { num_si = 5; token += Convert.ToString(num_tex[j]); }

475. else

476. {

477. if (num_tex[j] == '.') { add_unId(num_tex, ref j, i); token = null; num_si = 0; }

478. else if (f_synt(num_tex[j])) { add_ident(token, ref v_id); token = null; num_si = 0; j-; }

479. else { num_si = 85; token += Convert.ToString(num_tex[j]); }

480. }

481. }

482. break;

483. case 5:

484. if (num_tex[j] == ' ' || num_tex[j] == '\n') { add_ident(token, ref v_id); token = null; num_si = 0; }

485. else {

486. if (num_tex[j] == 'u') { num_si = 6; token += Convert.ToString(num_tex[j]); }

487. else

488. {

489. if (num_tex[j] == '.') { add_unId(num_tex, ref j, i); token = null; num_si = 0; }

490. else if (f_synt(num_tex[j])) { add_ident(token, ref v_id); token = null; num_si = 0; j-; }

491. else { num_si = 85; token += Convert.ToString(num_tex[j]); }

492. }

493. }

494. break;

495. case 6:

496. if (num_tex[j] == ' ' || num_tex[j] == '\n') { add_ident(token, ref v_id); token = null; num_si = 0; }

497. else {

498. if (num_tex[j] == 'd') { num_si = 7; token += Convert.ToString(num_tex[j]); }

499. else

500. {

501. if (num_tex[j] == '.') { add_unId(num_tex, ref j, i); token = null; num_si = 0; }

502. else if (f_synt(num_tex[j])) { add_ident(token, ref v_id); token = null; num_si = 0; j-; }

503. else { num_si = 85; token += Convert.ToString(num_tex[j]); }

504. }

505. }

506. break;

507. case 7:

508. if (num_tex[j] == ' ' || num_tex[j] == '\n') { add_ident(token, ref v_id); token = null; num_si = 0; }

509. else {

510. if (num_tex[j] == 'e') { num_si = 8; token += Convert.ToString(num_tex[j]); }

511. else

512. {

513. if (num_tex[j] == '.') { add_unId(num_tex, ref j, i); token = null; num_si = 0; }

514. else if (f_synt(num_tex[j])) { add_ident(token, ref v_id); token = null; num_si = 0; j-; }

515. else { num_si = 85; token += Convert.ToString(num_tex[j]); }

516. }

517. }

518. break;

519. case 8:

520. if (num_tex[j] == ' ' || num_tex[j] == '\n')

521. {

522. add_key(token, ref v_k); token = null; num_si = 0;

523. }

524. else

525. {

526. if (num_tex[j] == '.') { add_unId(num_tex, ref j, i); token = null; num_si = 0; }

527. else if (f_synt(num_tex[j])) { add_key(token, ref v_k); token = null; num_si = 0; j-; }

528. else { num_si = 85; token += Convert.ToString(num_tex[j]); }


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

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

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

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

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

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

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

  • Решение задач синтаксического анализа простой программы. Алгоритм нахождения синтаксических ошибок в ее тексте. Вывод данных о местоположении ошибки. Проектирование программы анализа арифметического выражения и методы проверки его на сумму или разность.

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

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

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

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

    контрольная работа [704,9 K], добавлен 01.02.2013

  • Место компилятора в программном обеспечении. Принципы работы и автоматизация построения синтаксического анализатора. Дерево разбора и его преобразование в дерево операций. Назначение и этапы семантического анализа. Идентификация языков программирования.

    реферат [265,1 K], добавлен 20.12.2007

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

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

  • Проектирование лексического и синтаксического анализаторов учебного языка. Правила преобразования логических выражений в ПОЛИЗ. Формирование триад, оптимизация их списка. Логическая структура программы. Тестирование модулей транслятора-интерпретатора.

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

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

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

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