Разработка алгоритма синтаксического анализа оператора вывода printf языка C++

Содержательная часть языка программирования С++. Правила автоматной грамматики, классификация Хомского. Принцип построения графов, разработка проекта средствами среды программирования Builder C++. Алгоритм синтаксического анализа оператора вывода.

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

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

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

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

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

Разработка алгоритма синтаксического анализа оператора вывода printf языка C++. Рассмотреть теорию формальных грамматик, принцип построения графов, и затем разработать проект, средствами среды программирования Builder C++.

Грамматика языка

Грамматикой G [Z] называется конечное непустое множество правил вывода, множества терминальных символов (терминальный словарь), множества нетерминальных символов и начального символа Z, который должен встречаться хотя бы один раз в левой части правила вывода

Содержательная часть языка:

G [<Оператор>]: scanf ("%d",<Текст>);

1. <Программа> - > <Оператор>

2. <Оператор> - > printf ("%d"<Текст>)

3. <Текст> - > Буква|Буква,<Текст>

4. Буква - > a|b|c. |z|Буква {"",,, &}

Правила автоматной грамматики:

А: = <Оператор>

a: = printf

B: = (D

D: = pC)

C: = Буква|Цифра

b: = Буква

b1: = b,

d: = (

p: = c{",&,,}

Автоматная грамматика:

A - > aB

B - > dD

D - > pC

C - > b|b1C

Граф состояний

На данном графе представлены состояния нашего языка.

1-А (начальное состояние), которое переходит в состояние В по цепочке a.

2-Из состояния В можно перейти в состояние D по цепочке d.

3-Из состояния D переходим в состояние С по цепочке p.

4-Из состояния С есть два пути, по которым делаем переход в состояние С (петля) по цепочке b1, так же по цепочке b переходим в конечное состояние K.

1. Классификация Хомского

Классификация Хомского включает в себя:

1. Грамматики нулевого типа;

2. Контекстно-зависимые грамматики (КЗ - грамматики);

3. Контекстно-свободные грамматики;

4. Автоматные или регулярные грамматики.

алгоритм язык программирование оператор

Данная грамматика, согласно классификации Хомского, является автоматной, так как все правила вывода относятся к виду:

А - > аB|a|/\, a Є Vt, А,B Є Vn

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

Рис.1 - Интерфейс программы

Рис.3 - Ошибок нет

Рис.4 - одна ошибка

Рис.5 - три ошибки

И т.д.

Листинг

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

#include <vcl. h>

#include <stdio. h>

#include <ctype. h>

#pragma hdrstop

#include "Unit1. h"

#include "Unit2. h"

#include "Unit3. h"

#include "Unit4. h"

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

#pragma package (smart_init)

#pragma resource "*. dfm"

TForm1 *Form1;

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

__fastcall TForm1:: TForm1 (TComponent* Owner)

: TForm (Owner)

{

}

void error (int i)

{

char er [80] ="";

switch (i)

{

case 1: {sprintf (er, "Ошибка: Ошибка в имени функции");

break; }

case 2: {sprintf (er, "Ошибка: Отсутствует знак ' ('");

break; }

case 3: {sprintf (er, "Ошибка: Отсутствует знак ''");

break; }

case 4: {sprintf (er, "Ошибка: Ошибка в перечислении спецификаторов типа");

break; }

case 5: {sprintf (er, "Ошибка: Ошибка в записи переменных");

break; }

case 6: {sprintf (er, "Ошибка: Отсутствует знак ') '");

break; }

case 7: {sprintf (er, "Ошибка: Отсутствует знак '; '");

break; }

case 8: {sprintf (er, "Ошибка: Неидентифицируемый символ");

break; }

}

Form1->Memo2->Lines->Add (er);

}

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

void __fastcall TForm1:: N4Click (TObject *Sender)

{

Close ();

}

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

void __fastcall TForm1:: N5Click (TObject *Sender)

{

Application->CreateForm (__classid (TForm2), &Form2);

Form2->ShowModal ();

}

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

void __fastcall TForm1:: J1Click (TObject *Sender)

{

if (OpenDialog1->Execute ())

{

Memo1->Lines->LoadFromFile (OpenDialog1->FileName);

}

else

{

Application->MessageBox ("Файл не был выбран. Попробуйте еще раз!","Предупреждение",MB_OK);

}

}

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

void __fastcall TForm1:: N13Click (TObject *Sender)

{

if (SaveDialog1->Execute ())

{

Memo1->Lines->SaveToFile (SaveDialog1->FileName);

}

else

{

Application->MessageBox ("Файл не был сохранен. Попробуйте еще раз!","Предупреждение",MB_OK);

}

}

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

void __fastcall TForm1:: N6Click (TObject *Sender)

{

Application->CreateForm (__classid (TForm3), &Form3);

Form3->ShowModal ();

}

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

void __fastcall TForm1:: N8Click (TObject *Sender)

{

Application->CreateForm (__classid (TForm4), &Form4);

Form4->ShowModal ();

}

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

void __fastcall TForm1:: btnStartClick (TObject *Sender)

{

Memo2->Clear ();

bool e=0;

int len, level=0;

char* str;

char mas [80] ="";

str=Memo1->Lines->GetText ();

len=Memo1->Lines->Text. Length ();

char *type="printf";

int k=0;

int i=0,j=0;

do{

k=0; e=0;

if (str [j] =='\0') break;

if (str [j] =='p')

{

j++;

i++;

while (type [i]! ='\0')

{

if (str [j] ==type [i]) {j++; i++; }

else {e=1; error (1); break; }

}

}

else {error (1); e=1;

}

if (e==0 && str [j]! =' (' && str [j]! ='"' && str [j]! ='%' && str [j]! =',' && str [j]! =') ' &&! isalpha (str [j]) && str [j]! ='; ' && str [j]! ='\0') {error (1); }

while (1)

{

if (str [j] ==' (' || str [j] =='"' || str [j] =='%' || str [j] ==',' || str [j] ==') ' || str [j] =='; ' || str [j] =='\0')

break;

else j++;

}

level = 1;

while (j! =len)

{

switch (str [j])

{

case ' (': {if (level==1) {level=2; j++;

while (str [j] ==' ') j++; break; }

if (level>1) {

sprintf (mas, "Ошибка: Лишний символ ' ('");

Memo1->Lines->Add (mas);

mas [0] ='\0'; }

j++; break; }

case '"': {if (level==3||level>=5) {

sprintf (mas, "Ошибка): Лишний символ ''");

Memo1->Lines->Add (mas);

mas [0] ='\0';

j++; break; }

if (level==1) {error (2); level=3; j++; break; }

if (level==2) {level=3; j++; break; }

if (level==4) {level=5; j++; break; }

if (level==3) {error (4); level=5; j++; break; }

j++; break; }

case '%': {if (level==1) {error (2); error (3); }

if (level==2) error (3); j++;

if (str [j] =='"' || str [j] =='\0' || str [j] ==',' || str [j] ==') ' || str [j] =='; ')

{error (4); level=4; break; }

while (1) {

if (str [j] =='"' || str [j] =='\0' || str [j] ==',' || str [j] ==') ' || str [j] =='; ')

{level=4; break; }

else

{

if (isdigit (str [j]))

{

j++;

while (isdigit (str [j])) j++; }

if (str [j]! ='d') {error (4); break; }

j++;

while (str [j] ==' ') j++;

if ( (isdigit (str [j])) || (isalpha (str [j]))) {error (4); j++; break; }

else break;

}}

level=4; break; }

case ',': {if (level==1) {error (2); error (3); error (4); error (3); }

if (level==2) {error (3); error (4); error (3); }

if (level==3) {error (4); error (3); }

if (level==4) {error (3); }

j++;

while (str [j] ==' ') j++;

if (! isalpha (str [j])) {error (5); level=6; break; }

if (str [j] =='0' || str [j] =='\r' || str [j] ==') ' || str [j] =='; ') {level=6; break; }

else

{

if (str [j] ==',') j++;

if (isalpha (str [j]))

{

j++;

while (1) {

while ( (isdigit (str [j])) || (isalpha (str [j]))) j++;

if (str [j] =='+'||str [j] =='-'||str [j] =='*'||str [j] =='/'||str [j] ==',') {j++;

if (! isalpha (str [j])) {error (5); }}

while ( (isdigit (str [j])) || (isalpha (str [j]))) j++;

if ( (! isdigit (str [j])) && (! isalpha (str [j])) &&str [j]! ='+'&&str [j]! ='-'&&str [j]! ='*'&&str [j]! ='/'&&str [j]! =',') break; }}

}level=6;

break; }

case ') ': {

if (level==1) {error (3); error (3); error (4); error (3); error (5); }

if (level==2) {error (3); error (4); error (3); error (5); }

if (level==3) {error (4); error (3); error (5); }

if (level==4) {error (3); error (5); }

if (level==5) {error (5); }

if (level==6) {level=7; j++; break; }

if (level>6)

{

sprintf (mas, "Ошибка: Лишний символ ') '");

Memo1->Lines->Add (mas);

mas [0] =='\0';

}

j++; level=7;

break; }

case '; ': {if (level==1) {error (2); error (3); error (4); error (3); error (5); error (6); }

if (level==2) {error (3); error (4); error (3); error (5); error (6); }

if (level==3) {error (4); error (3); error (5); error (6); }

if (level==4) {error (3); error (5); error (6); }

if (level==5) {error (5); error (6); }

if (level==6) {error (6); }

if (level==7) level=8; j++; break;

if (level>7)

{

sprintf (mas, "Ошибка: Лишний символ '; '!");

Memo1->Lines->Add (mas);

mas [0] ='\0';

}

j++;

level=8;

break;

}

default: {while (str [j] ==' ') j++;

if (level==3 && str [j]! ='%') {level=4; error (4); }

if (level==2 && str [j]! ='"') {error (8); }

if (level==5 && str [j]! =',') {error (5); }

if (level==7 || level==8)

if (str [j]! ='/r' && str [j]! ='\n') error (8);

if (str [j] =='/r' || str [j] =='\n') {k=1; break; }

j++; break; }

}

if (k==1) break;

}

if (level==1 && (str [j] =='\r' || str [j] =='\0')) {error (2); error (3); error (4); error (3); error (5); error (6); error (7); }

if (level==2 && (str [j] =='\r' || str [j] =='\0')) {error (3); error (4); error (3); error (5); error (6); error (7); }

if (level==3 && (str [j] =='\r' || str [j] =='\0')) {error (4); error (3); error (5); error (6); error (7); }

if (level==4 && (str [j] =='\r' || str [j] =='\0')) {error (3); error (5); error (6); error (7); }

if (level==5 && (str [j] =='\r' || str [j] =='\0')) {error (5); error (6); error (7); }

if (level==7 && (str [j] =='\r' || str [j] =='\0')) {error (7); }

}

while (str [j]! ='\0');

if (! Memo2->Lines->Text. Length ()) Memo2->Lines->Text="Ошибок нет!";

}

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

Список литературы

1. Шорников Ю.В. Теория и практика языковых процессов. - Новосибирск: Издательство НГТУ, 2004. - 208с.

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


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

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

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

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

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

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

    курсовая работа [111,6 K], добавлен 11.06.2010

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

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

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

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

  • Изучение общей структуры языка программирования Delphi: главные и дополнительные составные части среды программирования. Синтаксис и семантика языка программирования Delphi: алфавит языка, элементарные конструкции, переменные, константы и операторы.

    курсовая работа [738,1 K], добавлен 17.05.2010

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

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

  • Ознакомление с возможностями языка Си как средой программирования высокого уровня. Циклы программирования параметрического оператора for и функции форматированного ввода. Разработка программы средствами Си: блок-схема, текст и тестирование программы.

    контрольная работа [204,4 K], добавлен 26.01.2013

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

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

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

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

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