Постановка завдання
Розробка алгоритму синтаксичного аналізу оператора виведення printf мови C + +. Розглянути теорію формальних граматик, принцип побудови графів, і потім розробити проект, засобами середовища програмування Builder C + +. br/>
Граматика мови
Граматикою G [Z] називається кінцеве непорожнє безліч правил виводу, безлічі термінальних символів (термінальний словник), безлічі нетермінальних символів і початкового символу Z, який повинен зустрічатися хоча б один раз в лівій частині правила виведення
Змістовна частина мови: [<Оператор>]: scanf ("% d", <Текст>);
. <Програма> -> <Оператор>
. <Оператор> -> printf ("% d" <Текст>)
. <Текст> -> Буква | Буква, <Текст>
. Буква -> a | b | c. | Z | Буква {"",,, &}
Правила автоматної граматики:
А: = <Оператор>
a: = printf: = (D: = pC)
C: = Буква | Цифра: = Буква: = b,: = (: = c {", &,,}
Автоматна граматика:
A -> aB-> dD-> pC-> b | b1C
Граф станів
На даному графі представлені стану нашої мови.
-А (початковий стан), яке переходить у стан В по ланцюжку a.
-Зі стану В можна перейти в стан D по ланцюжку d.
-Зі стану D переходимо в стан С по ланцюжку p.
-Зі стану З є два шляхи, за якими робимо перехід в стан С (петля) по ланцюжку b1, так само по ланцюжку b переходимо в кінцевий стан K.
В
. Класифікація Хомського
Класифікація Хомського включає в себе:
. Граматики нульового типу;
. Контекстно-залежні граматики (КЗ - граматики);
. Контекстно-вільні граматики;
. Автоматні або регулярні граматики. p align="justify"> алгоритм мову програмування оператор
Ця граматика, згідно класифікації Хомського, є автоматною, бо всі правила виведення відносяться до виду:
А -> Аb | a |/, a Є Vt, А, B Є Vn
Тест програми
В
Рис.1 - Інтерфейс програми
В
Рис.3 - Помилок немає
В
Рис.4 - одна помилка
В
Рис.5 - три помилки
І т.д.
Лістинг
// ---------------------------------------- -----------------------------------
# include
# include
# include
# pragma hdrstop
# include "Unit1. h "
# include "Unit2. h "
# include "Unit3. h "
# include "Unit4. h "
// ---------------------------------------- -----------------------------------
# pragma package (smart_init)
# pragma resource "*. dfm "* Form1;
// ---------------------------------------- -----------------------------------
__fastcall TForm1 :: TForm1 (TComponent * Owner)
: TForm (Owner)
{
} error (int i)
{er [80] = ""; (i)
{1: {sprintf (er, "Помилка: Помилка в імені функції");;} 2: {sprintf (er, "Помилка: Відсутня знак '('");; } 3: {sprintf (er, "Помилка: Відсутня знак''");
break;} 4: {sprintf (er, "Помилка: Помилка в перерахуванні специфікаторів типу");;} 5: {sprintf (er, "Помилка: Помилка в записі змінних"); ;} 6: {sprintf (er, "Помилка: Відсутня знак ')'");;} 7: {sprintf (er, "Помилка: Відсутня знак ';'");;} 8: {sprintf (er, "Помилка: неідентифіковані символ");
break;}
} -> Memo2-> Lines-> Add (er);
}
// ---------------------------------------- ----------------------------------- __fastcall TForm1 :: N4Click (TObject * Sender)
{();
}
// ---------------------------------------- ----------------------------------- __fastcall TForm1 :: N5Click (TObject * Sender)
{> CreateForm (__classid (TForm2), & Form2); -> ShowModal ...