Разработка алгоритма синтаксического анализа оператора вывода 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